diff --git a/KenticoInspector.Core.Tests/editorconfig.txt b/.editorconfig similarity index 99% rename from KenticoInspector.Core.Tests/editorconfig.txt rename to .editorconfig index 09c62a85..89ac2f52 100644 --- a/KenticoInspector.Core.Tests/editorconfig.txt +++ b/.editorconfig @@ -1,4 +1,4 @@ -root = true +root = true [*.cs] diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 1ff0c423..00000000 --- a/.gitattributes +++ /dev/null @@ -1,63 +0,0 @@ -############################################################################### -# Set default behavior to automatically normalize line endings. -############################################################################### -* text=auto - -############################################################################### -# Set default behavior for command prompt diff. -# -# This is need for earlier builds of msysgit that does not have it on by -# default for csharp files. -# Note: This is only used by command line -############################################################################### -#*.cs diff=csharp - -############################################################################### -# Set the merge driver for project and solution files -# -# Merging from the command prompt will add diff markers to the files if there -# are conflicts (Merging from VS is not affected by the settings below, in VS -# the diff markers are never inserted). Diff markers may cause the following -# file extensions to fail to load in VS. An alternative would be to treat -# these files as binary and thus will always conflict and require user -# intervention with every merge. To do so, just uncomment the entries below -############################################################################### -#*.sln merge=binary -#*.csproj merge=binary -#*.vbproj merge=binary -#*.vcxproj merge=binary -#*.vcproj merge=binary -#*.dbproj merge=binary -#*.fsproj merge=binary -#*.lsproj merge=binary -#*.wixproj merge=binary -#*.modelproj merge=binary -#*.sqlproj merge=binary -#*.wwaproj merge=binary - -############################################################################### -# behavior for image files -# -# image files are treated as binary by default. -############################################################################### -#*.jpg binary -#*.png binary -#*.gif binary - -############################################################################### -# diff behavior for common document formats -# -# Convert binary document formats to text before diffing them. This feature -# is only available from the command line. Turn it on by uncommenting the -# entries below. -############################################################################### -#*.doc diff=astextplain -#*.DOC diff=astextplain -#*.docx diff=astextplain -#*.DOCX diff=astextplain -#*.dot diff=astextplain -#*.DOT diff=astextplain -#*.pdf diff=astextplain -#*.PDF diff=astextplain -#*.rtf diff=astextplain -#*.RTF diff=astextplain diff --git a/.github/workflows/dotnet.yaml b/.github/workflows/dotnet.yaml new file mode 100644 index 00000000..70201193 --- /dev/null +++ b/.github/workflows/dotnet.yaml @@ -0,0 +1,42 @@ +# This workflow will build a .NET project +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net + +name: .NET + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + workflow_dispatch: + +jobs: + build: + + runs-on: windows-latest + + steps: + - uses: actions/checkout@v3 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 8.0.x + - name: Build Blazor app + run: | + cd ./src/KInspector.Blazor + npm i + npm run css + dotnet build + - name: Test + run: | + cd ./test + dotnet test --verbosity normal + - name: Publish Blazor app + run: | + cd ./src/KInspector.Blazor + dotnet publish KInspector.Blazor.csproj /p:PublishDir=..\..\publish -c Release -r win-x64 --self-contained true + - name: Upload build artifact + uses: actions/upload-artifact@v4 + with: + name: KInspector + path: .\publish \ No newline at end of file diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml deleted file mode 100644 index 6edcabb1..00000000 --- a/.github/workflows/dotnet.yml +++ /dev/null @@ -1,50 +0,0 @@ -# This workflow will build a .NET project -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net - -name: .NET - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] - workflow_dispatch: - - -jobs: - build: - - runs-on: windows-latest - - steps: - - name: Setup MSBuild.exe - uses: microsoft/setup-msbuild@v1.0.2 - - uses: actions/checkout@v3 - - name: Setup .NET - uses: actions/setup-dotnet@v3 - with: - dotnet-version: 8.0.x - node-version: 20.7.x - - name: Restore dependencies - run: dotnet restore - - name: Build front-end app - run: | - cd ./KenticoInspector.WebApplication/ClientApp - npm i - npm run build - - name: Build dotnet app - run: dotnet build --no-restore - - name: Test - run: dotnet test --no-build --verbosity normal - - name: Publish client application - run: | - cd .\KenticoInspector.WebApplication - dotnet publish KenticoInspector.WebApplication.csproj /p:PublishDir=..\publish -c Release -r win-x64 --self-contained true - mkdir "..\publish\ClientApp\dist" - cd .\ClientApp - Copy-Item ".\dist\*" -Recurse -Destination "..\..\publish\ClientApp\dist\" - - name: Upload build artifact - uses: actions/upload-artifact@v3 - with: - name: KInspector - path: .\publish diff --git a/.gitignore b/.gitignore index 83b3c151..7cae0abb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,50 +1,42 @@ +**/KInspector.config + +### XbK additions + +**/wwwroot/cache.json + +### Xbk additions end + ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # User-specific files *.suo -*.user -*.userosscache +*.csproj.user +*.ReSharper.user +*.DotSettings.user *.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs +.vs # Build results + [Dd]ebug/ -[Dd]ebugPublic/ [Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -build/ -bld/ +# x64/ [Bb]in/ [Oo]bj/ - -# Visual Studo 2015 cache/options directory -.vs/ +[Oo]utput/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - *_i.c *_p.c -*_i.h *.ilk *.meta *.obj -*.pch *.pdb *.pgc *.pgd @@ -56,144 +48,97 @@ dlldata.c *.tmp *.tmp_proj *.log +*.svclog *.vspscc *.vssscc .builds *.pidb -*.svclog +*.log *.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf -*.cachefile +*.jfm # Visual Studio profiler *.psess *.vsp *.vspx -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding addin-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* # DotCover is a Code Coverage Tool *.dotCover -# NCrunch -_NCrunch_* -.*crunch*.local.xml - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - # Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# TODO: Comment the next line if you want to checkin your web deploy settings -# but database connection strings (with potential passwords) will be unencrypted -# *.pubxml -*.publishproj - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/packages/* -# except build/, which is used as an MSBuild target. -!**/packages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config - -# Windows Azure Build Output -csx/ -*.build.csdef - -# Windows Store app package directory -AppPackages/ +*.Publish.xml # Others -*.[Cc]ache +sql/ +*.Cache ClientBin/ [Ss]tyle[Cc]op.* ~$* *~ *.dbmdl -*.dbproj.schemaview -*.pfx +*.[Pp]ublish.xml +# *.pfx *.publishsettings -node_modules/ -bower_components/ -# RIA/Silverlight projects -Generated_Code/ +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm +# ========================= +# Windows detritus +# ========================= -# SQL Server files -*.mdf -*.ldf +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac desktop service store files +.DS_Store + +# Web.Common junction +*/Web.*/Common/ + +*.jfm +*.svclog +*.nupkg + +# nodejs +node_modules -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings +# JetBrains Rider +.idea/ +*.sln.iml -# Microsoft Fakes -FakesAssemblies/ +# CodeRush personal settings +.cr/personal -# Node.js Tools for Visual Studio -.ntvs_analysis.dat +#Exclude SmartSearch files +*.fdt +*.fdx +*.fnm +*.nrm +*.prx +*.frq +*.tii +*.tis +*.del +*.cfs +segments_2i -# Visual Studio 6 build log -*.plg +# Generated files +**/Client/dist/* -# Visual Studio 6 workspace options file -*.opt +**/CMSModules/WebFarm/* -# Kentico Inspector Specifics -KenticoInspector.WebApplication/SavedInstances.json +# Files Generated by this integration +**/App_Data/RepoTemplate/* \ No newline at end of file diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 00000000..a74ba241 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,5 @@ +{ + "MD013": false, + "MD024": false, + "no-inline-html": false +} \ No newline at end of file diff --git a/.nuget/NuGet.exe b/.nuget/NuGet.exe deleted file mode 100644 index c41a0d0d..00000000 Binary files a/.nuget/NuGet.exe and /dev/null differ diff --git a/.nuget/NuGet.targets b/.nuget/NuGet.targets deleted file mode 100644 index 3f8c37b2..00000000 --- a/.nuget/NuGet.targets +++ /dev/null @@ -1,144 +0,0 @@ - - - - $(MSBuildProjectDirectory)\..\ - - - false - - - false - - - true - - - false - - - - - - - - - - - $([System.IO.Path]::Combine($(SolutionDir), ".nuget")) - - - - - $(SolutionDir).nuget - - - - $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName.Replace(' ', '_')).config - $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config - - - - $(MSBuildProjectDirectory)\packages.config - $(PackagesProjectConfig) - - - - - $(NuGetToolsPath)\NuGet.exe - @(PackageSource) - - "$(NuGetExePath)" - mono --runtime=v4.0.30319 "$(NuGetExePath)" - - $(TargetDir.Trim('\\')) - - -RequireConsent - -NonInteractive - - "$(SolutionDir) " - "$(SolutionDir)" - - - $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir) - $(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols - - - - RestorePackages; - $(BuildDependsOn); - - - - - $(BuildDependsOn); - BuildPackage; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Directory.build.props b/Directory.build.props new file mode 100644 index 00000000..69a483bb --- /dev/null +++ b/Directory.build.props @@ -0,0 +1,21 @@ + + + Kentico Software + $(Company) + Copyright © $(Company) $([System.DateTime]::Now.Year) + $(Company)™ + MIT + 5.0.0 + 10.0 + enable + enable + $(NoWarn);1591 + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + \ No newline at end of file diff --git a/KInspector.sln b/KInspector.sln index 62533cf5..1f69faf2 100644 --- a/KInspector.sln +++ b/KInspector.sln @@ -1,36 +1,17 @@ + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.0.32014.148 +VisualStudioVersion = 17.9.34728.123 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{F3EF3619-F312-4B17-B5BE-5764A8010D38}" - ProjectSection(SolutionItems) = preProject - .nuget\NuGet.Config = .nuget\NuGet.Config - .nuget\NuGet.exe = .nuget\NuGet.exe - .nuget\NuGet.targets = .nuget\NuGet.targets - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KInspector.Blazor", "src\KInspector.Blazor\KInspector.Blazor.csproj", "{CB4EB16C-D1EB-4CF7-BBBF-80CD7EFB71D6}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{5977CB97-CB8F-4C77-836E-EAC1CCD3DEED}" - ProjectSection(SolutionItems) = preProject - CONTRIBUTING.md = CONTRIBUTING.md - LICENSE.txt = LICENSE.txt - README.md = README.md - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KInspector.Core", "src\KInspector.Core\KInspector.Core.csproj", "{E4687562-9C81-499D-B413-C2212500A8F0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KenticoInspector.WebApplication", "KenticoInspector.WebApplication\KenticoInspector.WebApplication.csproj", "{0C9FB1D4-87F2-48A0-81CD-45D5D2EF6C05}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KInspector.Infrastructure", "src\KInspector.Infrastructure\KInspector.Infrastructure.csproj", "{7D2BC8C1-D4E1-4FB2-B74D-E31D0B6854D2}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KenticoInspector.Core", "KenticoInspector.Core\KenticoInspector.Core.csproj", "{0F0CD079-3395-4241-8C13-1CE284C4FDE1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KInspector.Reports", "src\KInspector.Reports\KInspector.Reports.csproj", "{87834840-0776-4C9D-BB29-4FA93E00E1C3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KenticoInspector.Infrastructure", "KenticoInspector.Infrastructure\KenticoInspector.Infrastructure.csproj", "{E73A8C85-381C-4707-927D-D0D311A0B9A6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KenticoInspector.Reports", "KenticoInspector.Reports\KenticoInspector.Reports.csproj", "{4790028D-24BB-4BFC-98BA-C25AB5F682C5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KenticoInspector.Reports.Tests", "KenticoInspector.Reports.Tests\KenticoInspector.Reports.Tests.csproj", "{3F359210-5970-4CAA-B442-338F2EC51729}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KenticoInspector.Infrastructure.Tests", "KenticoInspector.Infrastructure.Tests\KenticoInspector.Infrastructure.Tests.csproj", "{7C8E2AC5-5ED5-45D7-8EB4-39F3BEECCFDA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KenticoInspector.Core.Tests", "KenticoInspector.Core.Tests\KenticoInspector.Core.Tests.csproj", "{46F38A42-61A3-4FA9-9FB0-32B343CFA6A2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KenticoInspector.Actions", "KenticoInspector.Actions\KenticoInspector.Actions.csproj", "{29948680-57BC-487A-A8E5-F68674CEB694}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KInspector.Actions", "src\KInspector.Actions\KInspector.Actions.csproj", "{CFBDF275-BB6A-4285-BC63-56274A3C4411}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -38,43 +19,31 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0C9FB1D4-87F2-48A0-81CD-45D5D2EF6C05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C9FB1D4-87F2-48A0-81CD-45D5D2EF6C05}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C9FB1D4-87F2-48A0-81CD-45D5D2EF6C05}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C9FB1D4-87F2-48A0-81CD-45D5D2EF6C05}.Release|Any CPU.Build.0 = Release|Any CPU - {0F0CD079-3395-4241-8C13-1CE284C4FDE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0F0CD079-3395-4241-8C13-1CE284C4FDE1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0F0CD079-3395-4241-8C13-1CE284C4FDE1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0F0CD079-3395-4241-8C13-1CE284C4FDE1}.Release|Any CPU.Build.0 = Release|Any CPU - {E73A8C85-381C-4707-927D-D0D311A0B9A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E73A8C85-381C-4707-927D-D0D311A0B9A6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E73A8C85-381C-4707-927D-D0D311A0B9A6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E73A8C85-381C-4707-927D-D0D311A0B9A6}.Release|Any CPU.Build.0 = Release|Any CPU - {4790028D-24BB-4BFC-98BA-C25AB5F682C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4790028D-24BB-4BFC-98BA-C25AB5F682C5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4790028D-24BB-4BFC-98BA-C25AB5F682C5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4790028D-24BB-4BFC-98BA-C25AB5F682C5}.Release|Any CPU.Build.0 = Release|Any CPU - {3F359210-5970-4CAA-B442-338F2EC51729}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3F359210-5970-4CAA-B442-338F2EC51729}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3F359210-5970-4CAA-B442-338F2EC51729}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3F359210-5970-4CAA-B442-338F2EC51729}.Release|Any CPU.Build.0 = Release|Any CPU - {7C8E2AC5-5ED5-45D7-8EB4-39F3BEECCFDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7C8E2AC5-5ED5-45D7-8EB4-39F3BEECCFDA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7C8E2AC5-5ED5-45D7-8EB4-39F3BEECCFDA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7C8E2AC5-5ED5-45D7-8EB4-39F3BEECCFDA}.Release|Any CPU.Build.0 = Release|Any CPU - {46F38A42-61A3-4FA9-9FB0-32B343CFA6A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {46F38A42-61A3-4FA9-9FB0-32B343CFA6A2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {46F38A42-61A3-4FA9-9FB0-32B343CFA6A2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {46F38A42-61A3-4FA9-9FB0-32B343CFA6A2}.Release|Any CPU.Build.0 = Release|Any CPU - {29948680-57BC-487A-A8E5-F68674CEB694}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {29948680-57BC-487A-A8E5-F68674CEB694}.Debug|Any CPU.Build.0 = Debug|Any CPU - {29948680-57BC-487A-A8E5-F68674CEB694}.Release|Any CPU.ActiveCfg = Release|Any CPU - {29948680-57BC-487A-A8E5-F68674CEB694}.Release|Any CPU.Build.0 = Release|Any CPU + {CB4EB16C-D1EB-4CF7-BBBF-80CD7EFB71D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CB4EB16C-D1EB-4CF7-BBBF-80CD7EFB71D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB4EB16C-D1EB-4CF7-BBBF-80CD7EFB71D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CB4EB16C-D1EB-4CF7-BBBF-80CD7EFB71D6}.Release|Any CPU.Build.0 = Release|Any CPU + {E4687562-9C81-499D-B413-C2212500A8F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4687562-9C81-499D-B413-C2212500A8F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4687562-9C81-499D-B413-C2212500A8F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4687562-9C81-499D-B413-C2212500A8F0}.Release|Any CPU.Build.0 = Release|Any CPU + {7D2BC8C1-D4E1-4FB2-B74D-E31D0B6854D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D2BC8C1-D4E1-4FB2-B74D-E31D0B6854D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D2BC8C1-D4E1-4FB2-B74D-E31D0B6854D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D2BC8C1-D4E1-4FB2-B74D-E31D0B6854D2}.Release|Any CPU.Build.0 = Release|Any CPU + {87834840-0776-4C9D-BB29-4FA93E00E1C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87834840-0776-4C9D-BB29-4FA93E00E1C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87834840-0776-4C9D-BB29-4FA93E00E1C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87834840-0776-4C9D-BB29-4FA93E00E1C3}.Release|Any CPU.Build.0 = Release|Any CPU + {CFBDF275-BB6A-4285-BC63-56274A3C4411}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CFBDF275-BB6A-4285-BC63-56274A3C4411}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CFBDF275-BB6A-4285-BC63-56274A3C4411}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CFBDF275-BB6A-4285-BC63-56274A3C4411}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {7F97074A-AB88-4F8F-AC4A-32A6C4CED4C1} + SolutionGuid = {D6438B52-220A-4264-9EFE-ADDACDEA3ED5} EndGlobalSection EndGlobal diff --git a/KenticoInspector.Actions/KenticoInspector.Actions.csproj b/KenticoInspector.Actions/KenticoInspector.Actions.csproj deleted file mode 100644 index aea96db5..00000000 --- a/KenticoInspector.Actions/KenticoInspector.Actions.csproj +++ /dev/null @@ -1,28 +0,0 @@ - - - - net8.0 - 9.0 - - - - - - - - - - - - - Always - - - Always - - - Always - - - - diff --git a/KenticoInspector.Actions/ResetCmsUserLogin/Action.cs b/KenticoInspector.Actions/ResetCmsUserLogin/Action.cs deleted file mode 100644 index 93fb8ac3..00000000 --- a/KenticoInspector.Actions/ResetCmsUserLogin/Action.cs +++ /dev/null @@ -1,78 +0,0 @@ -using KenticoInspector.Actions.ResetCmsUserLogin.Models; -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; - -using System; -using System.Collections.Generic; - -namespace KenticoInspector.Actions.ResetCmsUserLogin -{ - public class Action : AbstractAction - { - private IDatabaseService databaseService; - - public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); - - public override IList Tags => new List { - ActionTags.Reset, - ActionTags.User - }; - - public Action(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) - { - this.databaseService = databaseService; - } - - public override ActionResults Execute(Options options) - { - if (options.UserId < 0) - { - return GetInvalidOptionsResult(); - } - - // No user provided, list users - if (options.UserId == 0) - { - return GetListingResult(); - } - - // Reset provided user - databaseService.ExecuteSqlFromFileGeneric(Scripts.ResetAndEnableUser, new { UserID = options.UserId }); - var result = GetListingResult(); - result.Summary = Metadata.Terms.UserReset.With(new { - userId = options.UserId - }); - - return result; - } - - public override ActionResults GetInvalidOptionsResult() - { - return new ActionResults { - Status = ResultsStatus.Error, - Summary = Metadata.Terms.InvalidOptions - }; - } - - private ActionResults GetListingResult() - { - var administratorUsers = databaseService.ExecuteSqlFromFile(Scripts.GetAdministrators); - var data = new TableResult() - { - Name = Metadata.Terms.TableTitle, - Rows = administratorUsers - }; - - return new ActionResults - { - Type = ResultsType.Table, - Status = ResultsStatus.Information, - Summary = Metadata.Terms.ListSummary, - Data = data - }; - } - } -} diff --git a/KenticoInspector.Actions/ResetCmsUserLogin/Models/Options.cs b/KenticoInspector.Actions/ResetCmsUserLogin/Models/Options.cs deleted file mode 100644 index 1613600f..00000000 --- a/KenticoInspector.Actions/ResetCmsUserLogin/Models/Options.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace KenticoInspector.Actions.ResetCmsUserLogin.Models -{ - public class Options - { - public int UserId { get; set; } - } -} diff --git a/KenticoInspector.Actions/ResetCmsUserLogin/Models/Results/CmsUser.cs b/KenticoInspector.Actions/ResetCmsUserLogin/Models/Results/CmsUser.cs deleted file mode 100644 index 3aa08e1e..00000000 --- a/KenticoInspector.Actions/ResetCmsUserLogin/Models/Results/CmsUser.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace KenticoInspector.Actions.ResetCmsUserLogin.Models -{ - public class CmsUser - { - public int UserID { get; set; } - - public string UserName { get; set; } - - public string Password { get; set; } - - public bool Enabled { get; set; } - } -} diff --git a/KenticoInspector.Core.Tests/Directory.Build.props b/KenticoInspector.Core.Tests/Directory.Build.props deleted file mode 100644 index c4e59780..00000000 --- a/KenticoInspector.Core.Tests/Directory.Build.props +++ /dev/null @@ -1,8 +0,0 @@ - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - \ No newline at end of file diff --git a/KenticoInspector.Core.Tests/KenticoInspector.Core.Tests.csproj b/KenticoInspector.Core.Tests/KenticoInspector.Core.Tests.csproj deleted file mode 100644 index a79cc967..00000000 --- a/KenticoInspector.Core.Tests/KenticoInspector.Core.Tests.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - net8.0 - false - 9.0 - - - - - - - - - - - - - \ No newline at end of file diff --git a/KenticoInspector.Core/AbstractAction.cs b/KenticoInspector.Core/AbstractAction.cs deleted file mode 100644 index b720ed49..00000000 --- a/KenticoInspector.Core/AbstractAction.cs +++ /dev/null @@ -1,35 +0,0 @@ -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Modules; -using KenticoInspector.Core.Services.Interfaces; - -using Newtonsoft.Json; - -namespace KenticoInspector.Core -{ - public abstract class AbstractAction - : AbstractModule, IAction - where TTerms : new() - where TOptions: new() - { - public TOptions Options => new TOptions(); - - protected AbstractAction(IModuleMetadataService moduleMetadataService) - : base(moduleMetadataService) { } - - public ActionResults Execute(string OptionsJson) { - try - { - var options = JsonConvert.DeserializeObject(OptionsJson); - return Execute(options); - } - catch - { - return GetInvalidOptionsResult(); - } - } - - public abstract ActionResults Execute(TOptions Options); - - public abstract ActionResults GetInvalidOptionsResult(); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Constants/ActionTags.cs b/KenticoInspector.Core/Constants/ActionTags.cs deleted file mode 100644 index c6c7f17d..00000000 --- a/KenticoInspector.Core/Constants/ActionTags.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KenticoInspector.Core.Constants -{ - public class ActionTags - { - public const string Reset = "Reset"; - public const string User = "User"; - - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Converters/VersionListConverter.cs b/KenticoInspector.Core/Converters/VersionListConverter.cs deleted file mode 100644 index 2982cc5f..00000000 --- a/KenticoInspector.Core/Converters/VersionListConverter.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; -using System; - -namespace KenticoInspector.Core.Converters -{ - public class VersionListConverter : JsonConverter - { - public override bool CanConvert(Type objectType) - { - return (objectType == typeof(List)); - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - serializer.Converters.Add(new VersionObjectConverter()); - - serializer.Serialize(writer, value); - } - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - serializer.Converters.Add(new VersionObjectConverter()); - - return serializer.Deserialize(reader, typeof(Version)); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Converters/VersionObjectConverter.cs b/KenticoInspector.Core/Converters/VersionObjectConverter.cs deleted file mode 100644 index 0cad0a83..00000000 --- a/KenticoInspector.Core/Converters/VersionObjectConverter.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Newtonsoft.Json.Linq; -using Newtonsoft.Json; -using System; - -namespace KenticoInspector.Core.Converters -{ - public class VersionObjectConverter : JsonConverter - { - public override void WriteJson(JsonWriter writer, Version value, JsonSerializer serializer) - { - JObject jsonVersion = new JObject - { - { "major", value.Major }, - { "minor", value.Minor }, - { "build", value.Build }, - }; - jsonVersion.WriteTo(writer); - } - - public override Version ReadJson(JsonReader reader, Type objectType, Version existingValue, bool hasExistingValue, JsonSerializer serializer) - { - JObject jsonVersion = JObject.Load(reader); - return new Version((int)jsonVersion["major"], (int)jsonVersion["minor"], (int)jsonVersion["build"]); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Directory.Build.props b/KenticoInspector.Core/Directory.Build.props deleted file mode 100644 index c4e59780..00000000 --- a/KenticoInspector.Core/Directory.Build.props +++ /dev/null @@ -1,8 +0,0 @@ - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - \ No newline at end of file diff --git a/KenticoInspector.Core/Helpers/DatabaseHelper.cs b/KenticoInspector.Core/Helpers/DatabaseHelper.cs deleted file mode 100644 index 536b7c1f..00000000 --- a/KenticoInspector.Core/Helpers/DatabaseHelper.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Data; -using System.Data.SqlClient; - -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Core.Helpers -{ - public static class DatabaseHelper - { - public static IDbConnection GetSqlConnection(DatabaseSettings databaseSettings) - { - var connectionString = GetConnectionString(databaseSettings); - - return GetSqlConnection(connectionString); - } - - public static IDbConnection GetSqlConnection(string connectionString) - { - return new SqlConnection(connectionString); - } - - private static string GetConnectionString(DatabaseSettings databaseSettings) - { - SqlConnectionStringBuilder sb = new SqlConnectionStringBuilder(); - - if (databaseSettings.IntegratedSecurity) - { - sb.IntegratedSecurity = true; - } - else - { - sb.UserID = databaseSettings.User; - sb.Password = databaseSettings.Password; - } - - sb["Server"] = databaseSettings.Server; - sb["Database"] = databaseSettings.Database; - - return sb.ConnectionString; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Models/ActionResults.cs b/KenticoInspector.Core/Models/ActionResults.cs deleted file mode 100644 index 8db84885..00000000 --- a/KenticoInspector.Core/Models/ActionResults.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; - -using KenticoInspector.Core.Constants; - -using System.Dynamic; - -namespace KenticoInspector.Core.Models -{ - public class ActionResults - { - [JsonConverter(typeof(StringEnumConverter))] - public ResultsStatus Status { get; set; } - - public string Summary { get; set; } - - [JsonConverter(typeof(StringEnumConverter))] - public ResultsType Type { get; set; } - - public dynamic Data { get; set; } - - public ActionResults() - { - Data = new ExpandoObject(); - } - } -} diff --git a/KenticoInspector.Core/Models/DatabaseSettings.cs b/KenticoInspector.Core/Models/DatabaseSettings.cs deleted file mode 100644 index 1549f202..00000000 --- a/KenticoInspector.Core/Models/DatabaseSettings.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace KenticoInspector.Core.Models -{ - public class DatabaseSettings - { - public string Database { get; set; } - - public bool IntegratedSecurity { get; set; } - - public string Password { get; set; } - - public string Server { get; set; } - - public string User { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Models/Instance.cs b/KenticoInspector.Core/Models/Instance.cs deleted file mode 100644 index 1d8e58f1..00000000 --- a/KenticoInspector.Core/Models/Instance.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace KenticoInspector.Core.Models -{ - public class Instance - { - public DatabaseSettings DatabaseSettings { get; set; } - - public Guid Guid { get; set; } - - public string Name { get; set; } - - public string AdminPath { get; set; } - - public string AdminUrl { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Models/InstanceDetails.cs b/KenticoInspector.Core/Models/InstanceDetails.cs deleted file mode 100644 index eb7fffcf..00000000 --- a/KenticoInspector.Core/Models/InstanceDetails.cs +++ /dev/null @@ -1,20 +0,0 @@ -using KenticoInspector.Core.Converters; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; - -namespace KenticoInspector.Core.Models -{ - public class InstanceDetails - { - public Guid Guid { get; set; } - - [JsonConverter(typeof(VersionObjectConverter))] - public Version AdministrationVersion { get; set; } - - [JsonConverter(typeof(VersionObjectConverter))] - public Version DatabaseVersion { get; set; } - - public IEnumerable Sites { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Models/ModuleDetails.cs b/KenticoInspector.Core/Models/ModuleDetails.cs deleted file mode 100644 index 493e3c2a..00000000 --- a/KenticoInspector.Core/Models/ModuleDetails.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace KenticoInspector.Core.Models -{ - public class ModuleDetails - { - public string LongDescription { get; set; } - - public string Name { get; set; } - - public string ShortDescription { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Models/ModuleMetadata.cs b/KenticoInspector.Core/Models/ModuleMetadata.cs deleted file mode 100644 index 8aaf36d8..00000000 --- a/KenticoInspector.Core/Models/ModuleMetadata.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Newtonsoft.Json; - -namespace KenticoInspector.Core.Models -{ - public class ModuleMetadata where T : new() - { - public ModuleDetails Details { get; set; } = new ModuleDetails(); - - [JsonIgnore] - public T Terms { get; set; } = new T(); - } -} diff --git a/KenticoInspector.Core/Models/ReportResults.cs b/KenticoInspector.Core/Models/ReportResults.cs deleted file mode 100644 index 19a3fe17..00000000 --- a/KenticoInspector.Core/Models/ReportResults.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Dynamic; - -using KenticoInspector.Core.Constants; - -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; - -namespace KenticoInspector.Core.Models -{ - public class ReportResults - { - [JsonConverter(typeof(StringEnumConverter))] - public ResultsStatus Status { get; set; } - - public string Summary { get; set; } - - [JsonConverter(typeof(StringEnumConverter))] - public ResultsType Type { get; set; } - - public dynamic Data { get; set; } - - public ReportResults() - { - Data = new ExpandoObject(); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Models/Site.cs b/KenticoInspector.Core/Models/Site.cs deleted file mode 100644 index 37c305dd..00000000 --- a/KenticoInspector.Core/Models/Site.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace KenticoInspector.Core.Models -{ - public class Site - { - public string DomainName { get; set; } - - public Guid Guid { get; set; } - - public int Id { get; set; } - - public string Name { get; set; } - - public string PresentationUrl { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Models/TableResult.cs b/KenticoInspector.Core/Models/TableResult.cs deleted file mode 100644 index 0477e52c..00000000 --- a/KenticoInspector.Core/Models/TableResult.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; - -namespace KenticoInspector.Core.Models -{ - public class TableResult - { - public string Name { get; set; } - - public IEnumerable Rows { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Modules/IAction.cs b/KenticoInspector.Core/Modules/IAction.cs deleted file mode 100644 index f58adf39..00000000 --- a/KenticoInspector.Core/Modules/IAction.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; - -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Core.Modules -{ - public interface IAction : IModule - { - ActionResults Execute(string OptionsJson); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Modules/IModule.cs b/KenticoInspector.Core/Modules/IModule.cs deleted file mode 100644 index 74d31df2..00000000 --- a/KenticoInspector.Core/Modules/IModule.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; - -using KenticoInspector.Core.Converters; - -namespace KenticoInspector.Core.Modules -{ - public interface IModule - { - string Codename { get; } - - [JsonConverter(typeof(VersionListConverter))] - IList CompatibleVersions { get; } - - [JsonConverter(typeof(VersionListConverter))] - IList IncompatibleVersions { get; } - - IList Tags { get; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Modules/IReport.cs b/KenticoInspector.Core/Modules/IReport.cs deleted file mode 100644 index 0067d03b..00000000 --- a/KenticoInspector.Core/Modules/IReport.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; - -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Core.Modules -{ - public interface IReport : IModule - { - ReportResults GetResults(); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Modules/IWithModuleMetadata.cs b/KenticoInspector.Core/Modules/IWithModuleMetadata.cs deleted file mode 100644 index 5b73ff94..00000000 --- a/KenticoInspector.Core/Modules/IWithModuleMetadata.cs +++ /dev/null @@ -1,9 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Core.Modules -{ - public interface IWithModuleMetadata where T : new() - { - ModuleMetadata Metadata { get; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Repositories/Interfaces/IActionRepository.cs b/KenticoInspector.Core/Repositories/Interfaces/IActionRepository.cs deleted file mode 100644 index 82626c5f..00000000 --- a/KenticoInspector.Core/Repositories/Interfaces/IActionRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Generic; - -using KenticoInspector.Core.Modules; - -namespace KenticoInspector.Core.Repositories.Interfaces -{ - public interface IActionRepository : IRepository - { - IEnumerable GetActions(); - - IAction GetAction(string codename); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Repositories/Interfaces/IInstanceRepository.cs b/KenticoInspector.Core/Repositories/Interfaces/IInstanceRepository.cs deleted file mode 100644 index e47b39e4..00000000 --- a/KenticoInspector.Core/Repositories/Interfaces/IInstanceRepository.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; - -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Core.Repositories.Interfaces -{ - public interface IInstanceRepository : IRepository - { - bool DeleteInstance(Guid guid); - - Instance GetInstance(Guid guid); - - IList GetInstances(); - - Instance UpsertInstance(Instance instance); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Repositories/Interfaces/IReportRepository.cs b/KenticoInspector.Core/Repositories/Interfaces/IReportRepository.cs deleted file mode 100644 index bb157ebd..00000000 --- a/KenticoInspector.Core/Repositories/Interfaces/IReportRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using KenticoInspector.Core.Modules; - -using System.Collections.Generic; - -namespace KenticoInspector.Core.Repositories.Interfaces -{ - public interface IReportRepository : IRepository - { - IEnumerable GetReports(); - - IReport GetReport(string codename); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Repositories/Interfaces/IRepository.cs b/KenticoInspector.Core/Repositories/Interfaces/IRepository.cs deleted file mode 100644 index fc44e77f..00000000 --- a/KenticoInspector.Core/Repositories/Interfaces/IRepository.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace KenticoInspector.Core.Repositories.Interfaces -{ - public interface IRepository - { - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Repositories/Interfaces/ISiteRepository.cs b/KenticoInspector.Core/Repositories/Interfaces/ISiteRepository.cs deleted file mode 100644 index dbb80d62..00000000 --- a/KenticoInspector.Core/Repositories/Interfaces/ISiteRepository.cs +++ /dev/null @@ -1,12 +0,0 @@ -using KenticoInspector.Core.Models; -using System.Collections.Generic; - -namespace KenticoInspector.Core.Repositories.Interfaces -{ - public interface ISiteRepository : IRepository - { - Site GetSite(Instance instance, int siteId); - - IList GetSites(Instance instance); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Repositories/Interfaces/IVersionRepository.cs b/KenticoInspector.Core/Repositories/Interfaces/IVersionRepository.cs deleted file mode 100644 index 1651daaa..00000000 --- a/KenticoInspector.Core/Repositories/Interfaces/IVersionRepository.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Core.Repositories.Interfaces -{ - public interface IVersionRepository : IRepository - { - Version GetKenticoAdministrationVersion(Instance instance); - - Version GetKenticoAdministrationVersion(string rootPath); - - Version GetKenticoDatabaseVersion(Instance instance); - - Version GetKenticoDatabaseVersion(DatabaseSettings databaseSettings); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Services/Interfaces/ICmsFileService.cs b/KenticoInspector.Core/Services/Interfaces/ICmsFileService.cs deleted file mode 100644 index e66690d8..00000000 --- a/KenticoInspector.Core/Services/Interfaces/ICmsFileService.cs +++ /dev/null @@ -1,14 +0,0 @@ -using KenticoInspector.Core.Constants; - -using System.Collections.Generic; -using System.Xml; - -namespace KenticoInspector.Core.Services.Interfaces -{ - public interface ICmsFileService : IService - { - Dictionary GetResourceStringsFromResx(string instanceRoot, string relativeResxFilePath = DefaultKenticoPaths.PrimaryResxFile); - - XmlDocument GetXmlDocument(string instanceRoot, string relativeFilePath); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Services/Interfaces/IDatabaseService.cs b/KenticoInspector.Core/Services/Interfaces/IDatabaseService.cs deleted file mode 100644 index c25c2d3a..00000000 --- a/KenticoInspector.Core/Services/Interfaces/IDatabaseService.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; - -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Core.Services.Interfaces -{ - public interface IDatabaseService : IService - { - void Configure(DatabaseSettings databaseSettings); - - IEnumerable ExecuteSqlFromFile(string relativeFilePath); - - IEnumerable ExecuteSqlFromFile(string relativeFilePath, dynamic parameters); - - IEnumerable ExecuteSqlFromFile(string relativeFilePath, IDictionary literalReplacements); - - IEnumerable ExecuteSqlFromFile(string relativeFilePath, IDictionary literalReplacements, dynamic parameters); - - [Obsolete("A last resort when it is impossible to create a data model or use one of the generic options.")] - DataTable ExecuteSqlFromFileAsDataTable(string relativeFilePath); - - IEnumerable> ExecuteSqlFromFileGeneric(string relativeFilePath); - - IEnumerable> ExecuteSqlFromFileGeneric(string relativeFilePath, dynamic parameters); - - IEnumerable> ExecuteSqlFromFileGeneric(string relativeFilePath, IDictionary literalReplacements); - - IEnumerable> ExecuteSqlFromFileGeneric(string relativeFilePath, IDictionary literalReplacements, dynamic parameters); - - T ExecuteSqlFromFileScalar(string relativeFilePath); - - T ExecuteSqlFromFileScalar(string relativeFilePath, dynamic parameters); - - T ExecuteSqlFromFileScalar(string relativeFilePath, IDictionary literalReplacements); - - T ExecuteSqlFromFileScalar(string relativeFilePath, IDictionary literalReplacements, dynamic parameters); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Services/Interfaces/IInstanceService.cs b/KenticoInspector.Core/Services/Interfaces/IInstanceService.cs deleted file mode 100644 index cb665d47..00000000 --- a/KenticoInspector.Core/Services/Interfaces/IInstanceService.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; - -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Core.Services.Interfaces -{ - public interface IInstanceService : IService - { - Instance CurrentInstance { get; } - - bool DeleteInstance(Guid instanceGuid); - - Instance GetInstance(Guid instanceGuid); - - InstanceDetails GetInstanceDetails(Guid instanceGuid); - - InstanceDetails GetInstanceDetails(Instance instance); - - IList GetInstances(); - - Instance SetCurrentInstance(Guid instanceGuid); - - Instance UpsertInstance(Instance instance); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Services/Interfaces/IModuleMetadataService.cs b/KenticoInspector.Core/Services/Interfaces/IModuleMetadataService.cs deleted file mode 100644 index 601f355b..00000000 --- a/KenticoInspector.Core/Services/Interfaces/IModuleMetadataService.cs +++ /dev/null @@ -1,13 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Core.Services.Interfaces -{ - public interface IModuleMetadataService : IService - { - string DefaultCultureName { get; } - - string CurrentCultureName { get; } - - ModuleMetadata GetModuleMetadata(string moduleCodename) where T : new(); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Services/Interfaces/IModuleService.cs b/KenticoInspector.Core/Services/Interfaces/IModuleService.cs deleted file mode 100644 index 908f3ca7..00000000 --- a/KenticoInspector.Core/Services/Interfaces/IModuleService.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; - -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Modules; - -namespace KenticoInspector.Core.Services.Interfaces -{ - public interface IModuleService : IService - { - IReport GetReport(string codename); - - ReportResults GetReportResults(string reportCodename, Guid instanceGuid); - - IEnumerable GetReports(Guid instanceGuid); - - IEnumerable GetActions(Guid instanceGuid); - - IAction GetAction(string codename); - ActionResults ExecuteAction(string actionCodename, Guid instanceGuid, string optionsJson); - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Services/Interfaces/IService.cs b/KenticoInspector.Core/Services/Interfaces/IService.cs deleted file mode 100644 index 63ec5aca..00000000 --- a/KenticoInspector.Core/Services/Interfaces/IService.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace KenticoInspector.Core.Services.Interfaces -{ - public interface IService - { - } -} \ No newline at end of file diff --git a/KenticoInspector.Core/Tokens/ITokenExpression.cs b/KenticoInspector.Core/Tokens/ITokenExpression.cs deleted file mode 100644 index 579d8210..00000000 --- a/KenticoInspector.Core/Tokens/ITokenExpression.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace KenticoInspector.Core.Tokens -{ - internal interface ITokenExpression - { - string Resolve(string tokenExpression, IDictionary tokenDictionary); - } -} diff --git a/KenticoInspector.Core/editorconfig.txt b/KenticoInspector.Core/editorconfig.txt deleted file mode 100644 index 09c62a85..00000000 --- a/KenticoInspector.Core/editorconfig.txt +++ /dev/null @@ -1,1245 +0,0 @@ -root = true - -[*.cs] - -# ===== Active SonarLint rules ===== - -# [Category: Bug] -# S2757: "=+" should not be used instead of "+=" -dotnet_diagnostic.S2757.severity = warning - -# S3168: "async" methods should not return "void" -dotnet_diagnostic.S3168.severity = warning - -# S3397: "base.Equals" should not be used to check for reference equality in "Equals" if "base" is not "object" -dotnet_diagnostic.S3397.severity = warning - -# S1206: "Equals(Object)" and "GetHashCode()" should be overridden in pairs -dotnet_diagnostic.S1206.severity = warning - -# S2328: "GetHashCode" should not reference mutable fields -dotnet_diagnostic.S2328.severity = warning - -# S2997: "IDisposables" created in a "using" statement should not be returned -dotnet_diagnostic.S2997.severity = warning - -# S2930: "IDisposables" should be disposed -dotnet_diagnostic.S2930.severity = warning - -# S2688: "NaN" should not be used in comparisons -dotnet_diagnostic.S2688.severity = warning - -# S2995: "Object.ReferenceEquals" should not be used for value types -dotnet_diagnostic.S2995.severity = warning - -# S3869: "SafeHandle.DangerousGetHandle" should not be called -dotnet_diagnostic.S3869.severity = warning - -# S3456: "string.ToCharArray()" should not be called redundantly -dotnet_diagnostic.S3456.severity = warning - -# S2996: "ThreadStatic" fields should not be initialized -dotnet_diagnostic.S2996.severity = warning - -# S3005: "ThreadStatic" should not be used on non-static fields -dotnet_diagnostic.S3005.severity = warning - -# S2225: "ToString()" method should not return null -dotnet_diagnostic.S2225.severity = warning - -# S2251: A "for" loop update clause should move the counter in the right direction -dotnet_diagnostic.S2251.severity = warning - -# S3923: All branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S3923.severity = warning - -# S3244: Anonymous delegates should not be used to unsubscribe from Events -dotnet_diagnostic.S3244.severity = warning - -# S3343: Caller information parameters should come at the end of the parameter list -dotnet_diagnostic.S3343.severity = warning - -# S4583: Calls to delegate's method "BeginInvoke" should be paired with calls to "EndInvoke" -dotnet_diagnostic.S4583.severity = warning - -# S3249: Classes directly extending "object" should not call "base" in "GetHashCode" or "Equals" -dotnet_diagnostic.S3249.severity = warning - -# S3453: Classes should not have only "private" constructors -dotnet_diagnostic.S3453.severity = warning - -# S4143: Collection elements should not be replaced unconditionally -dotnet_diagnostic.S4143.severity = warning - -# S3981: Collection sizes and array length comparisons should make sense -dotnet_diagnostic.S3981.severity = warning - -# S2114: Collections should not be passed as arguments to their own methods -dotnet_diagnostic.S2114.severity = warning - -# S2275: Composite format strings should not lead to unexpected behavior at runtime -dotnet_diagnostic.S2275.severity = warning - -# S2583: Conditionally executed code should be reachable -dotnet_diagnostic.S2583.severity = warning - -# S3172: Delegates should not be subtracted -dotnet_diagnostic.S3172.severity = warning - -# S3926: Deserialization methods should be provided for "OptionalField" members -dotnet_diagnostic.S3926.severity = warning - -# S1048: Destructors should not throw exceptions -dotnet_diagnostic.S1048.severity = warning - -# S2761: Doubled prefix operators "!!" and "~~" should not be used -dotnet_diagnostic.S2761.severity = warning - -# S4158: Empty collections should not be accessed or iterated -dotnet_diagnostic.S4158.severity = warning - -# S3655: Empty nullable value should not be accessed -dotnet_diagnostic.S3655.severity = warning - -# S3984: Exceptions should not be created without being thrown -dotnet_diagnostic.S3984.severity = warning - -# S3346: Expressions used in "Debug.Assert" should not produce side effects -dotnet_diagnostic.S3346.severity = warning - -# S2345: Flags enumerations should explicitly initialize all their members -dotnet_diagnostic.S2345.severity = warning - -# S2252: For-loop conditions should be true at least once -dotnet_diagnostic.S2252.severity = warning - -# S4275: Getters and setters should access the expected fields -dotnet_diagnostic.S4275.severity = warning - -# S1764: Identical expressions should not be used on both sides of a binary operator -dotnet_diagnostic.S1764.severity = warning - -# S2183: Integral numbers should not be shifted by zero or more than their number of bits-1 -dotnet_diagnostic.S2183.severity = warning - -# S1751: Loops with at most one iteration should be refactored -dotnet_diagnostic.S1751.severity = warning - -# S3603: Methods with "Pure" attribute should return a value -dotnet_diagnostic.S3603.severity = warning - -# S3887: Mutable, non-private fields should not be "readonly" -dotnet_diagnostic.S3887.severity = warning - -# S3889: Neither "Thread.Resume" nor "Thread.Suspend" should be used -dotnet_diagnostic.S3889.severity = warning - -# S4586: Non-async "Task/Task" methods should not return null -dotnet_diagnostic.S4586.severity = warning - -# S2259: Null pointers should not be dereferenced -dotnet_diagnostic.S2259.severity = warning - -# S3610: Nullable type comparison should not be redundant -dotnet_diagnostic.S3610.severity = warning - -# S1848: Objects should not be created to be dropped immediately without being used -dotnet_diagnostic.S1848.severity = warning - -# S3598: One-way "OperationContract" methods should have "void" return type -dotnet_diagnostic.S3598.severity = warning - -# S3466: Optional parameters should be passed to "base" calls -dotnet_diagnostic.S3466.severity = warning - -# S2934: Property assignments should not be made for "readonly" fields not constrained to reference types -dotnet_diagnostic.S2934.severity = warning - -# S2190: Recursion should not be infinite -dotnet_diagnostic.S2190.severity = warning - -# S1862: Related "if/else if" statements should not have the same condition -dotnet_diagnostic.S1862.severity = warning - -# S2184: Results of integer division should not be assigned to floating point variables -dotnet_diagnostic.S2184.severity = warning - -# S2201: Return values from functions without side effects should not be ignored -dotnet_diagnostic.S2201.severity = warning - -# S3449: Right operands of shift operators should be integers -dotnet_diagnostic.S3449.severity = warning - -# S3927: Serialization event handlers should be implemented correctly -dotnet_diagnostic.S3927.severity = warning - -# S2551: Shared resources should not be used for locking -dotnet_diagnostic.S2551.severity = warning - -# S2857: SQL keywords should be delimited by whitespace -dotnet_diagnostic.S2857.severity = warning - -# S3263: Static fields should appear in the order they must be initialized -dotnet_diagnostic.S3263.severity = warning - -# S3464: Type inheritance should not be recursive -dotnet_diagnostic.S3464.severity = warning - -# S3903: Types should be defined in named namespaces -dotnet_diagnostic.S3903.severity = warning - -# S2123: Values should not be uselessly incremented -dotnet_diagnostic.S2123.severity = warning - -# S1656: Variables should not be self-assigned -dotnet_diagnostic.S1656.severity = warning - -# S2306: "async" and "await" should not be used as identifiers -dotnet_diagnostic.S2306.severity = warning - - -# [Category: Security] -# S3884: "CoSetProxyBlanket" and "CoInitializeSecurity" should not be used -dotnet_diagnostic.S3884.severity = warning - -# S2115: A secure password should be used when connecting to a database -dotnet_diagnostic.S2115.severity = warning - -# S5547: Cipher algorithms should be robust -dotnet_diagnostic.S5547.severity = warning - -# S3329: Cipher Block Chaining IVs should be unpredictable -dotnet_diagnostic.S3329.severity = warning - -# S5542: Encryption algorithms should be used with secure mode and padding scheme -dotnet_diagnostic.S5542.severity = warning - -# S5445: Insecure temporary file creation methods should not be used -dotnet_diagnostic.S5445.severity = warning - -# S5659: JWT should be signed and verified with strong cipher algorithms -dotnet_diagnostic.S5659.severity = warning - -# S4433: LDAP connections should be authenticated -dotnet_diagnostic.S4433.severity = warning - -# S4211: Members should not have conflicting transparency annotations -dotnet_diagnostic.S4211.severity = warning - -# S4423: Weak SSL/TLS protocols should not be used -dotnet_diagnostic.S4423.severity = warning - -# S2755: XML parsers should not be vulnerable to XXE attacks -dotnet_diagnostic.S2755.severity = warning - -# S2053: Hashes should include an unpredictable salt -dotnet_diagnostic.S2053.severity = warning - -# S4830: Server certificates should be verified during SSL/TLS connections -dotnet_diagnostic.S4830.severity = warning - -# S4426: Cryptographic keys should be robust -dotnet_diagnostic.S4426.severity = warning - -# S5773: Types allowed to be deserialized should be restricted -dotnet_diagnostic.S5773.severity = warning - - -# [Category: Security Hotspot] -# S5693: Allowing requests with excessive content length is security-sensitive -dotnet_diagnostic.S5693.severity = warning - -# S4792: Configuring loggers is security-sensitive -dotnet_diagnostic.S4792.severity = warning - -# S3330: Creating cookies without the "HttpOnly" flag is security-sensitive -dotnet_diagnostic.S3330.severity = warning - -# S2092: Creating cookies without the "secure" flag is security-sensitive -dotnet_diagnostic.S2092.severity = warning - -# S4507: Delivering code in production with debug features activated is security-sensitive -dotnet_diagnostic.S4507.severity = warning - -# S5766: Deserializing objects without performing data validation is security-sensitive -dotnet_diagnostic.S5766.severity = warning - -# S5753: Disabling ASP.NET "Request Validation" feature is security-sensitive -dotnet_diagnostic.S5753.severity = warning - -# S4502: Disabling CSRF protections is security-sensitive -dotnet_diagnostic.S4502.severity = warning - -# S5042: Expanding archive files without controlling resource consumption is security-sensitive -dotnet_diagnostic.S5042.severity = warning - -# S2077: Formatting SQL queries is security-sensitive -dotnet_diagnostic.S2077.severity = warning - -# S2068: Hard-coded credentials are security-sensitive -dotnet_diagnostic.S2068.severity = warning - -# S5122: Having a permissive Cross-Origin Resource Sharing policy is security-sensitive -dotnet_diagnostic.S5122.severity = warning - -# S4036: Searching OS commands in PATH is security-sensitive -dotnet_diagnostic.S4036.severity = warning - -# S2612: Setting loose file permissions is security-sensitive -dotnet_diagnostic.S2612.severity = warning - -# S5332: Using clear-text protocols is security-sensitive -dotnet_diagnostic.S5332.severity = warning - -# S1313: Using hardcoded IP addresses is security-sensitive -dotnet_diagnostic.S1313.severity = warning - -# S2257: Using non-standard cryptographic algorithms is security-sensitive -dotnet_diagnostic.S2257.severity = warning - -# S2245: Using pseudorandom number generators (PRNGs) is security-sensitive -dotnet_diagnostic.S2245.severity = warning - -# S5443: Using publicly writable directories is security-sensitive -dotnet_diagnostic.S5443.severity = warning - -# S4790: Using weak hashing algorithms is security-sensitive -dotnet_diagnostic.S4790.severity = warning - - -# [Category: Code Smell] -# S3451: "[DefaultValue]" should not be used when "[DefaultParameterValue]" is meant -dotnet_diagnostic.S3451.severity = warning - -# S3447: "[Optional]" should not be used on "ref" or "out" parameters -dotnet_diagnostic.S3447.severity = warning - -# S1155: "Any()" should be used to test for emptiness -dotnet_diagnostic.S1155.severity = warning - -# S2737: "catch" clauses should do more than rethrow -dotnet_diagnostic.S2737.severity = warning - -# S4524: "default" clauses should be first or last -dotnet_diagnostic.S4524.severity = warning - -# S3217: "Explicit" conversions of "foreach" loops should not be used -dotnet_diagnostic.S3217.severity = warning - -# S3971: "GC.SuppressFinalize" should not be called -dotnet_diagnostic.S3971.severity = warning - -# S907: "goto" statement should not be used -dotnet_diagnostic.S907.severity = warning - -# S2692: "IndexOf" checks should not be for positive numbers -dotnet_diagnostic.S2692.severity = warning - -# S3060: "is" should not be used with "this" -dotnet_diagnostic.S3060.severity = warning - -# S1123: "Obsolete" attributes should include explanations -dotnet_diagnostic.S1123.severity = warning - -# S4214: "P/Invoke" methods should not be visible -dotnet_diagnostic.S4214.severity = warning - -# S4061: "params" should be used instead of "varargs" -dotnet_diagnostic.S4061.severity = warning - -# S3262: "params" should be used on overrides -dotnet_diagnostic.S3262.severity = warning - -# S3600: "params" should not be introduced on overrides -dotnet_diagnostic.S3600.severity = warning - -# S3597: "ServiceContract" and "OperationContract" attributes should be used together -dotnet_diagnostic.S3597.severity = warning - -# S3963: "static" fields should be initialized inline -dotnet_diagnostic.S3963.severity = warning - -# S3256: "string.IsNullOrEmpty" should be used -dotnet_diagnostic.S3256.severity = warning - -# S1479: "switch" statements should not have too many "case" clauses -dotnet_diagnostic.S1479.severity = warning - -# S5034: "ValueTask" should be consumed correctly -dotnet_diagnostic.S5034.severity = warning - -# S1264: A "while" loop should be used instead of a "for" loop -dotnet_diagnostic.S1264.severity = warning - -# S3973: A conditionally executed single line should be denoted by indentation -dotnet_diagnostic.S3973.severity = warning - -# S3904: Assemblies should have version information -dotnet_diagnostic.S3904.severity = warning - -# S3415: Assertion arguments should be passed in the correct order -dotnet_diagnostic.S3415.severity = warning - -# S4019: Base class methods should not be hidden -dotnet_diagnostic.S4019.severity = warning - -# S1940: Boolean checks should not be inverted -dotnet_diagnostic.S1940.severity = warning - -# S3236: Caller information arguments should not be provided explicitly -dotnet_diagnostic.S3236.severity = warning - -# S3897: Classes that provide "Equals()" should implement "IEquatable" -dotnet_diagnostic.S3897.severity = warning - -# S3457: Composite format strings should be used correctly -dotnet_diagnostic.S3457.severity = warning - -# S3972: Conditionals should start on new lines -dotnet_diagnostic.S3972.severity = warning - -# S1116: Empty statements should be removed -dotnet_diagnostic.S1116.severity = warning - -# S3264: Events should be invoked -dotnet_diagnostic.S3264.severity = warning - -# S3445: Exceptions should not be explicitly rethrown -dotnet_diagnostic.S3445.severity = warning - -# S1163: Exceptions should not be thrown in finally blocks -dotnet_diagnostic.S1163.severity = warning - -# S2290: Field-like events should not be virtual -dotnet_diagnostic.S2290.severity = warning - -# S2346: Flags enumerations zero-value members should be named "warning" -dotnet_diagnostic.S2346.severity = warning - -# S3251: Implementations should be provided for "partial" methods -dotnet_diagnostic.S3251.severity = warning - -# S1944: Inappropriate casts should not be made -dotnet_diagnostic.S1944.severity = warning - -# S4015: Inherited member visibility should not be decreased -dotnet_diagnostic.S4015.severity = warning - -# S3444: Interfaces should not simply inherit from base interfaces with colliding members -dotnet_diagnostic.S3444.severity = warning - -# S818: Literal suffixes should be upper case -dotnet_diagnostic.S818.severity = warning - -# S3400: Methods should not return constants -dotnet_diagnostic.S3400.severity = warning - -# S2681: Multiline blocks should be enclosed in curly braces -dotnet_diagnostic.S2681.severity = warning - -# S3169: Multiple "OrderBy" calls should not be used -dotnet_diagnostic.S3169.severity = warning - -# S3261: Namespaces should not be empty -dotnet_diagnostic.S3261.severity = warning - -# S4200: Native methods should be wrapped -dotnet_diagnostic.S4200.severity = warning - -# S1199: Nested code blocks should not be used -dotnet_diagnostic.S1199.severity = warning - -# S4070: Non-flags enums should not be marked with "FlagsAttribute" -dotnet_diagnostic.S4070.severity = warning - -# S3265: Non-flags enums should not be used in bitwise operations -dotnet_diagnostic.S3265.severity = warning - -# S4201: Null checks should not be used with "is" -dotnet_diagnostic.S4201.severity = warning - -# S3966: Objects should not be disposed more than once -dotnet_diagnostic.S3966.severity = warning - -# S2291: Overflow checking should not be disabled for "Enumerable.Sum" -dotnet_diagnostic.S2291.severity = warning - -# S1185: Overriding members should do more than simply call the same member in the base class -dotnet_diagnostic.S1185.severity = warning - -# S2234: Parameters should be passed in the correct order -dotnet_diagnostic.S2234.severity = warning - -# S3450: Parameters with "[DefaultParameterValue]" attributes should also be marked "[Optional]" -dotnet_diagnostic.S3450.severity = warning - -# S1905: Redundant casts should not be used -dotnet_diagnostic.S1905.severity = warning - -# S1110: Redundant pairs of parentheses should be removed -dotnet_diagnostic.S1110.severity = warning - -# S2437: Silly bit operations should not be performed -dotnet_diagnostic.S2437.severity = warning - -# S3010: Static fields should not be updated in constructors -dotnet_diagnostic.S3010.severity = warning - -# S4635: String offset-based methods should be preferred for finding substrings from offsets -dotnet_diagnostic.S4635.severity = warning - -# S3998: Threads should not lock on objects with weak identity -dotnet_diagnostic.S3998.severity = warning - -# S1134: Track uses of "FIXME" tags -dotnet_diagnostic.S1134.severity = warning - -# S1135: Track uses of "TODO" tags -dotnet_diagnostic.S1135.severity = warning - -# S1871: Two branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S1871.severity = warning - -# S3443: Type should not be examined on "System.Type" instances -dotnet_diagnostic.S3443.severity = warning - -# S3459: Unassigned members should be removed -dotnet_diagnostic.S3459.severity = warning - -# S3440: Variables should not be checked against the values they're about to be assigned -dotnet_diagnostic.S3440.severity = warning - -# S2479: Whitespace and control characters in string literals should be explicit -dotnet_diagnostic.S2479.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S3442: "abstract" classes should not have "public" constructors -dotnet_diagnostic.S3442.severity = warning - -# S3885: "Assembly.Load" should be used -dotnet_diagnostic.S3885.severity = warning - -# S1210: "Equals" and the comparison operators should be overridden when implementing "IComparable" -dotnet_diagnostic.S1210.severity = warning - -# S1215: "GC.Collect" should not be called -dotnet_diagnostic.S1215.severity = warning - -# S3881: "IDisposable" should be implemented correctly -dotnet_diagnostic.S3881.severity = warning - -# S2971: "IEnumerable" LINQs should be simplified -dotnet_diagnostic.S2971.severity = warning - -# S3925: "ISerializable" should be implemented correctly -dotnet_diagnostic.S3925.severity = warning - -# S4581: "new Guid()" should not be used -dotnet_diagnostic.S4581.severity = warning - -# S3875: "operator==" should not be overloaded on reference types -dotnet_diagnostic.S3875.severity = warning - -# S3237: "value" parameters should be used -dotnet_diagnostic.S3237.severity = warning - -# S1121: Assignments should not be made from within sub-expressions -dotnet_diagnostic.S1121.severity = warning - -# S3376: Attribute, EventArgs, and Exception type names should end with the type being extended -dotnet_diagnostic.S3376.severity = warning - -# S2589: Boolean expressions should not be gratuitous -dotnet_diagnostic.S2589.severity = warning - -# S4035: Classes implementing "IEquatable" should be sealed -dotnet_diagnostic.S4035.severity = warning - -# S3776: Cognitive Complexity of methods should not be too high -dotnet_diagnostic.S3776.severity = warning - -# S1066: Collapsible "if" statements should be merged -dotnet_diagnostic.S1066.severity = warning - -# S1699: Constructors should only call non-overridable methods -dotnet_diagnostic.S1699.severity = warning - -# S2372: Exceptions should not be thrown from property getters -dotnet_diagnostic.S2372.severity = warning - -# S3877: Exceptions should not be thrown from unexpected methods -dotnet_diagnostic.S3877.severity = warning - -# S1104: Fields should not have public accessibility -dotnet_diagnostic.S1104.severity = warning - -# S2933: Fields that are only assigned in the constructor should be "readonly" -dotnet_diagnostic.S2933.severity = warning - -# S112: General exceptions should never be thrown -dotnet_diagnostic.S112.severity = warning - -# S2486: Generic exceptions should not be ignored -dotnet_diagnostic.S2486.severity = warning - -# S3246: Generic type parameters should be co/contravariant when possible -dotnet_diagnostic.S3246.severity = warning - -# S1939: Inheritance list should not be redundant -dotnet_diagnostic.S1939.severity = warning - -# S110: Inheritance tree of classes should not be too deep -dotnet_diagnostic.S110.severity = warning - -# S3218: Inner class members should not shadow outer class "static" or type members -dotnet_diagnostic.S3218.severity = warning - -# S2696: Instance members should not write to "static" fields -dotnet_diagnostic.S2696.severity = warning - -# S3626: Jump statements should not be redundant -dotnet_diagnostic.S3626.severity = warning - -# S1117: Local variables should not shadow class fields -dotnet_diagnostic.S1117.severity = warning - -# S3267: Loops should be simplified with "LINQ" expressions -dotnet_diagnostic.S3267.severity = warning - -# S3604: Member initializer values should not be redundant -dotnet_diagnostic.S3604.severity = warning - -# S3220: Method calls should not resolve ambiguously to overloads with "params" -dotnet_diagnostic.S3220.severity = warning - -# S4136: Method overloads should be grouped together -dotnet_diagnostic.S4136.severity = warning - -# S3427: Method overloads with default parameter values should not overlap -dotnet_diagnostic.S3427.severity = warning - -# S1006: Method overrides should not change parameter defaults -dotnet_diagnostic.S1006.severity = warning - -# S2953: Methods named "Dispose" should implement "IDisposable.Dispose" -dotnet_diagnostic.S2953.severity = warning - -# S1186: Methods should not be empty -dotnet_diagnostic.S1186.severity = warning - -# S4144: Methods should not have identical implementations -dotnet_diagnostic.S4144.severity = warning - -# S107: Methods should not have too many parameters -dotnet_diagnostic.S107.severity = warning - -# S3241: Methods should not return values that are never used -dotnet_diagnostic.S3241.severity = warning - -# S2386: Mutable fields should not be "public static" -dotnet_diagnostic.S2386.severity = warning - -# S108: Nested blocks of code should not be left empty -dotnet_diagnostic.S108.severity = warning - -# S2223: Non-constant static fields should not be visible -dotnet_diagnostic.S2223.severity = warning - -# S3260: Non-derived "private" classes and records should be "sealed" -dotnet_diagnostic.S3260.severity = warning - -# S927: Parameter names should match base declaration and other partial definitions -dotnet_diagnostic.S927.severity = warning - -# S3928: Parameter names used into ArgumentException constructors should match an existing one -dotnet_diagnostic.S3928.severity = warning - -# S4457: Parameter validation in "async"/"await" methods should be wrapped -dotnet_diagnostic.S4457.severity = warning - -# S4456: Parameter validation in yielding methods should be wrapped -dotnet_diagnostic.S4456.severity = warning - -# S1450: Private fields only used as local variables in methods should become local variables -dotnet_diagnostic.S1450.severity = warning - -# S2365: Properties should not make collection or array copies -dotnet_diagnostic.S2365.severity = warning - -# S2368: Public methods should not have multidimensional array parameters -dotnet_diagnostic.S2368.severity = warning - -# S3011: Reflection should not be used to increase accessibility of classes, methods, or fields -dotnet_diagnostic.S3011.severity = warning - -# S2219: Runtime type checking should be simplified -dotnet_diagnostic.S2219.severity = warning - -# S125: Sections of code should not be commented out -dotnet_diagnostic.S125.severity = warning - -# S2178: Short-circuit logic should be used in boolean contexts -dotnet_diagnostic.S2178.severity = warning - -# S2743: Static fields should not be used in generic types -dotnet_diagnostic.S2743.severity = warning - -# S1643: Strings should not be concatenated using '+' in a loop -dotnet_diagnostic.S1643.severity = warning - -# S3358: Ternary operators should not be nested -dotnet_diagnostic.S3358.severity = warning - -# S3433: Test method signatures should be correct -dotnet_diagnostic.S3433.severity = warning - -# S2187: TestCases should contain tests -dotnet_diagnostic.S2187.severity = warning - -# S2699: Tests should include assertions -dotnet_diagnostic.S2699.severity = warning - -# S1607: Tests should not be ignored -dotnet_diagnostic.S1607.severity = warning - -# S2292: Trivial properties should be auto-implemented -dotnet_diagnostic.S2292.severity = warning - -# S2436: Types and methods should not have too many generic parameters -dotnet_diagnostic.S2436.severity = warning - -# S101: Types should be named in PascalCase -dotnet_diagnostic.S101.severity = warning - -# S4487: Unread "private" fields should be removed -dotnet_diagnostic.S4487.severity = warning - -# S1854: Unused assignments should be removed -dotnet_diagnostic.S1854.severity = warning - -# S1481: Unused local variables should be removed -dotnet_diagnostic.S1481.severity = warning - -# S1172: Unused method parameters should be removed -dotnet_diagnostic.S1172.severity = warning - -# S1144: Unused private types or members should be removed -dotnet_diagnostic.S1144.severity = warning - -# S2326: Unused type parameters should be removed -dotnet_diagnostic.S2326.severity = warning - -# S1075: URIs should not be hardcoded -dotnet_diagnostic.S1075.severity = warning - -# S1118: Utility classes should not have public constructors -dotnet_diagnostic.S1118.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S1125: Boolean literals should not be redundant -dotnet_diagnostic.S1125.severity = warning - - -# ===== Inactive SonarLint rules (must be explicitly turned off) ===== - -# [Category: Bug] (All these are excluded because they're not applicable to our solution) -# S4428: "PartCreationPolicyAttribute" should be used with "ExportAttribute" -dotnet_diagnostic.S4428.severity = none - -# S4260: "ConstructorArgument" parameters should exist in constructors -dotnet_diagnostic.S4260.severity = none - -# S4277: "Shared" parts should not be created with "new" -dotnet_diagnostic.S4277.severity = none - -# S4159: Classes should implement their "ExportAttribute" interfaces -dotnet_diagnostic.S4159.severity = none - -# S4210: Windows Forms entry points should be marked with STAThread -dotnet_diagnostic.S4210.severity = none - - -# [Uncategorized] -# S6287: HTTP responses should not be vulnerable to session fixation -dotnet_diagnostic.S6287.severity = none - -# S6096: Extracting archives should not lead to zip slip vulnerabilities -dotnet_diagnostic.S6096.severity = none - -# S5334: Dynamic code execution should not be vulnerable to injection attacks -dotnet_diagnostic.S5334.severity = none - -# S5146: HTTP request redirections should not be open to forging attacks -dotnet_diagnostic.S5146.severity = none - -# S5135: Deserialization should not be vulnerable to injection attacks -dotnet_diagnostic.S5135.severity = none - -# S5131: Endpoints should not be vulnerable to reflected cross-site scripting (XSS) attacks -dotnet_diagnostic.S5131.severity = none - -# S3649: Database queries should not be vulnerable to injection attacks -dotnet_diagnostic.S3649.severity = none - -# S2091: XPath expressions should not be vulnerable to injection attacks -dotnet_diagnostic.S2091.severity = none - -# S2083: I/O function calls should not be vulnerable to path injection attacks -dotnet_diagnostic.S2083.severity = none - -# S2078: LDAP queries should not be vulnerable to injection attacks -dotnet_diagnostic.S2078.severity = none - -# S2076: OS commands should not be vulnerable to command injection attacks -dotnet_diagnostic.S2076.severity = none - -# S6424: Azure Functions: Restrictions on entity interfaces -dotnet_diagnostic.S6424.severity = none - -# S6422: Calls to "async" methods should not be blocking in Azure Functions -dotnet_diagnostic.S6422.severity = none - -# S2631: Regular expressions should not be vulnerable to Denial of Service attacks -dotnet_diagnostic.S2631.severity = none - -# S2222: Locks should be released -dotnet_diagnostic.S2222.severity = none - -# S5144: Server-side requests should not be vulnerable to forging attacks -dotnet_diagnostic.S5144.severity = none - -# S6350: Constructing arguments of system commands from user input is security-sensitive -dotnet_diagnostic.S6350.severity = none - -# S6420: Reuse client instances rather than creating new ones with each Azure Function invocation -dotnet_diagnostic.S6420.severity = none - -# S6419: Azure Functions should be stateless -dotnet_diagnostic.S6419.severity = none - -# S5883: OS commands should not be vulnerable to argument injection attacks -dotnet_diagnostic.S5883.severity = none - -# S5145: Logging should not be vulnerable to injection attacks -dotnet_diagnostic.S5145.severity = none - -# S2931: Classes with "IDisposable" members should implement "IDisposable" -dotnet_diagnostic.S2931.severity = none - -# S4462: Calls to "async" methods should not be blocking -dotnet_diagnostic.S4462.severity = none - -# S2387: Child class fields should not shadow parent class fields -dotnet_diagnostic.S2387.severity = none - -# S1451: Track lack of copyright and license headers -dotnet_diagnostic.S1451.severity = none - -# S1147: Exit methods should not be called -dotnet_diagnostic.S1147.severity = none - -# S2952: Classes should "Dispose" of members from the classes' own "Dispose" methods -dotnet_diagnostic.S2952.severity = none - -# S4829: Reading the Standard Input is security-sensitive -dotnet_diagnostic.S4829.severity = none - -# S4823: Using command line arguments is security-sensitive -dotnet_diagnostic.S4823.severity = none - -# S4818: Using Sockets is security-sensitive -dotnet_diagnostic.S4818.severity = none - -# S4787: Encrypting data is security-sensitive -dotnet_diagnostic.S4787.severity = none - -# S4784: Using regular expressions is security-sensitive -dotnet_diagnostic.S4784.severity = none - -# S4039: Interface methods should be callable by derived types -dotnet_diagnostic.S4039.severity = none - -# S4025: Child class fields should not differ from parent class fields only by capitalization -dotnet_diagnostic.S4025.severity = none - -# S4000: Pointers to unmanaged memory should not be visible -dotnet_diagnostic.S4000.severity = none - -# S3937: Number patterns should be regular -dotnet_diagnostic.S3937.severity = none - -# S3874: "out" and "ref" parameters should not be used -dotnet_diagnostic.S3874.severity = none - -# S3353: Unchanged local variables should be "const" -dotnet_diagnostic.S3353.severity = none - -# S3216: "ConfigureAwait(false)" should be used -dotnet_diagnostic.S3216.severity = none - -# S3215: "interface" instances should not be cast to concrete types -dotnet_diagnostic.S3215.severity = none - -# S2701: Literal boolean values should not be used in assertions -dotnet_diagnostic.S2701.severity = none - -# S2360: Optional parameters should not be used -dotnet_diagnostic.S2360.severity = none - -# S2339: Public constant members should not be used -dotnet_diagnostic.S2339.severity = none - -# S2330: Array covariance should not be used -dotnet_diagnostic.S2330.severity = none - -# S2302: "nameof" should be used -dotnet_diagnostic.S2302.severity = none - -# S2197: Modulus results should not be checked for direct equality -dotnet_diagnostic.S2197.severity = none - -# S1994: "for" loop increment clauses should modify the loops' counters -dotnet_diagnostic.S1994.severity = none - -# S1821: "switch" statements should not be nested -dotnet_diagnostic.S1821.severity = none - -# S1541: Methods and properties should not be too complex -dotnet_diagnostic.S1541.severity = none - -# S134: Control flow statements "if", "switch", "for", "foreach", "while", "do" and "try" should not be nested too deeply -dotnet_diagnostic.S134.severity = none - -# S131: "switch/Select" statements should contain a "default/Case Else" clauses -dotnet_diagnostic.S131.severity = none - -# S126: "if ... else if" constructs should end with "else" clauses -dotnet_diagnostic.S126.severity = none - -# S121: Control structures should use curly braces -dotnet_diagnostic.S121.severity = none - -# S1067: Expressions should not be too complex -dotnet_diagnostic.S1067.severity = none - -# S4564: ASP.NET HTTP request validation feature should not be disabled -dotnet_diagnostic.S4564.severity = none - -# S4212: Serialization constructors should be secured -dotnet_diagnostic.S4212.severity = none - -# S3949: Calculations should not overflow -dotnet_diagnostic.S3949.severity = none - -# S1244: Floating point numbers should not be tested for equality -dotnet_diagnostic.S1244.severity = none - -# S881: Increment (++) and decrement (--) operators should not be used in a method call or mixed with other operators in an expression -dotnet_diagnostic.S881.severity = none - -# S6423: Azure Functions should log all failures -dotnet_diagnostic.S6423.severity = none - -# S6421: Azure Functions should use Structured Error Handling -dotnet_diagnostic.S6421.severity = none - -# S6354: Use a testable date/time provider -dotnet_diagnostic.S6354.severity = none - -# S4059: Property names should not match get methods -dotnet_diagnostic.S4059.severity = none - -# S4057: Locales should be set for data types -dotnet_diagnostic.S4057.severity = none - -# S4055: Literals should not be passed as localized parameters -dotnet_diagnostic.S4055.severity = none - -# S4050: Operators should be overloaded consistently -dotnet_diagnostic.S4050.severity = none - -# S4017: Method signatures should not contain nested generic types -dotnet_diagnostic.S4017.severity = none - -# S4016: Enumeration members should not be named "Reserved" -dotnet_diagnostic.S4016.severity = none - -# S4005: "System.Uri" arguments should be used instead of strings -dotnet_diagnostic.S4005.severity = none - -# S4004: Collection properties should be readonly -dotnet_diagnostic.S4004.severity = none - -# S4002: Disposable types should declare finalizers -dotnet_diagnostic.S4002.severity = none - -# S3997: String URI overloads should call "System.Uri" overloads -dotnet_diagnostic.S3997.severity = none - -# S3996: URI properties should not be strings -dotnet_diagnostic.S3996.severity = none - -# S3995: URI return values should not be strings -dotnet_diagnostic.S3995.severity = none - -# S3994: URI Parameters should not be strings -dotnet_diagnostic.S3994.severity = none - -# S3993: Custom attributes should be marked with "System.AttributeUsageAttribute" -dotnet_diagnostic.S3993.severity = none - -# S3992: Assemblies should explicitly specify COM visibility -dotnet_diagnostic.S3992.severity = none - -# S3990: Assemblies should be marked as CLS compliant -dotnet_diagnostic.S3990.severity = none - -# S3956: "Generic.List" instances should not be part of public APIs -dotnet_diagnostic.S3956.severity = none - -# S3909: Collections should implement the generic interface -dotnet_diagnostic.S3909.severity = none - -# S3908: Generic event handlers should be used -dotnet_diagnostic.S3908.severity = none - -# S3906: Event Handlers should have the correct signature -dotnet_diagnostic.S3906.severity = none - -# S3902: "Assembly.GetExecutingAssembly" should not be called -dotnet_diagnostic.S3902.severity = none - -# S3900: Arguments of public methods should be validated against null -dotnet_diagnostic.S3900.severity = none - -# S3898: Value types should implement "IEquatable" -dotnet_diagnostic.S3898.severity = none - -# S3880: Finalizers should not be empty -dotnet_diagnostic.S3880.severity = none - -# S3431: "[ExpectedException]" should not be used -dotnet_diagnostic.S3431.severity = none - -# S3366: "this" should not be exposed from constructors -dotnet_diagnostic.S3366.severity = none - -# S3059: Types should not have members with visibility set higher than the type's visibility -dotnet_diagnostic.S3059.severity = none - -# S2357: Fields should be private -dotnet_diagnostic.S2357.severity = none - -# S2327: "try" statements with identical "catch" and/or "finally" blocks should be merged -dotnet_diagnostic.S2327.severity = none - -# S1696: NullReferenceException should not be caught -dotnet_diagnostic.S1696.severity = none - -# S138: Functions should not have too many lines of code -dotnet_diagnostic.S138.severity = none - -# S127: "for" loop stop conditions should be invariant -dotnet_diagnostic.S127.severity = none - -# S122: Statements should be on separate lines -dotnet_diagnostic.S122.severity = none - -# S1200: Classes should not be coupled to too many other classes (Single Responsibility Principle) -dotnet_diagnostic.S1200.severity = none - -# S1151: "switch case" clauses should not have too many lines of code -dotnet_diagnostic.S1151.severity = none - -# S109: Magic numbers should not be used -dotnet_diagnostic.S109.severity = none - -# S106: Standard outputs should not be used directly to log anything -dotnet_diagnostic.S106.severity = none - -# S104: Files should not have too many lines of code -dotnet_diagnostic.S104.severity = none - -# S103: Lines should not be too long -dotnet_diagnostic.S103.severity = none - -# S5167: HTTP response headers should not be vulnerable to injection attacks -dotnet_diagnostic.S5167.severity = none - -# S2228: Console logging should not be used -dotnet_diagnostic.S2228.severity = none - -# S2955: Generic parameters not constrained to reference types should not be compared to "null" -dotnet_diagnostic.S2955.severity = none - -# S2674: The length returned from a stream read should be checked -dotnet_diagnostic.S2674.severity = none - -# S1226: Method parameters, caught exceptions and foreach variables' initial values should not be ignored -dotnet_diagnostic.S1226.severity = none - -# S4834: Controlling permissions is security-sensitive -dotnet_diagnostic.S4834.severity = none - -# S2255: Writing cookies is security-sensitive -dotnet_diagnostic.S2255.severity = none - -# S4261: Methods should be named according to their synchronicities -dotnet_diagnostic.S4261.severity = none - -# S4226: Extensions should be in separate namespaces -dotnet_diagnostic.S4226.severity = none - -# S4225: Extension methods should not extend "object" -dotnet_diagnostic.S4225.severity = none - -# S4069: Operator overloads should have named alternatives -dotnet_diagnostic.S4069.severity = none - -# S4060: Non-abstract attributes should be sealed -dotnet_diagnostic.S4060.severity = none - -# S4058: Overloads with a "StringComparison" parameter should be used -dotnet_diagnostic.S4058.severity = none - -# S4056: Overloads with a "CultureInfo" or an "IFormatProvider" parameter should be used -dotnet_diagnostic.S4056.severity = none - -# S4052: Types should not extend outdated base types -dotnet_diagnostic.S4052.severity = none - -# S4049: Properties should be preferred -dotnet_diagnostic.S4049.severity = none - -# S4047: Generics should be used when appropriate -dotnet_diagnostic.S4047.severity = none - -# S4041: Type names should not match namespaces -dotnet_diagnostic.S4041.severity = none - -# S4040: Strings should be normalized to uppercase -dotnet_diagnostic.S4040.severity = none - -# S4027: Exceptions should provide standard constructors -dotnet_diagnostic.S4027.severity = none - -# S4026: Assemblies should be marked with "NeutralResourcesLanguageAttribute" -dotnet_diagnostic.S4026.severity = none - -# S4023: Interfaces should not be empty -dotnet_diagnostic.S4023.severity = none - -# S4022: Enumerations should have "Int32" storage -dotnet_diagnostic.S4022.severity = none - -# S4018: Generic methods should provide type parameters -dotnet_diagnostic.S4018.severity = none - -# S3967: Multidimensional arrays should not be used -dotnet_diagnostic.S3967.severity = none - -# S3962: "static readonly" constants should be "const" instead -dotnet_diagnostic.S3962.severity = none - -# S3876: Strings or integral types should be used for indexers -dotnet_diagnostic.S3876.severity = none - -# S3872: Parameter names should not duplicate the names of their methods -dotnet_diagnostic.S3872.severity = none - -# S3717: Track use of "NotImplementedException" -dotnet_diagnostic.S3717.severity = none - -# S3532: Empty "default" clauses should be removed -dotnet_diagnostic.S3532.severity = none - -# S3441: Redundant property names should be omitted in anonymous classes -dotnet_diagnostic.S3441.severity = none - -# S3257: Declarations and initializations should be as concise as possible -dotnet_diagnostic.S3257.severity = none - -# S3254: Default parameter values should not be passed as arguments -dotnet_diagnostic.S3254.severity = none - -# S3253: Constructor and destructor declarations should not be redundant -dotnet_diagnostic.S3253.severity = none - -# S3242: Method parameters should be declared with base types -dotnet_diagnostic.S3242.severity = none - -# S3240: The simplest possible condition syntax should be used -dotnet_diagnostic.S3240.severity = none - -# S3235: Redundant parentheses should not be used -dotnet_diagnostic.S3235.severity = none - -# S3234: "GC.SuppressFinalize" should not be invoked for types without destructors -dotnet_diagnostic.S3234.severity = none - -# S3052: Members should not be initialized to default values -dotnet_diagnostic.S3052.severity = none - -# S2760: Sequential tests should not check the same condition -dotnet_diagnostic.S2760.severity = none - -# S2333: Redundant modifiers should not be used -dotnet_diagnostic.S2333.severity = none - -# S2325: Methods and properties that don't access instance data should be static -dotnet_diagnostic.S2325.severity = none - -# S2221: "Exception" should not be caught when not required by called methods -dotnet_diagnostic.S2221.severity = none - -# S2156: "sealed" classes should not have "protected" members -dotnet_diagnostic.S2156.severity = none - -# S2148: Underscores should be used to make large numbers readable -dotnet_diagnostic.S2148.severity = none - -# S1858: "ToString()" calls should not be redundant -dotnet_diagnostic.S1858.severity = none - -# S1698: "=" should not be used when "Equals" is overridden -dotnet_diagnostic.S1698.severity = none - -# S1694: An abstract class should have both abstract and concrete methods -dotnet_diagnostic.S1694.severity = none - -# S1659: Multiple variables should not be declared on the same line -dotnet_diagnostic.S1659.severity = none - -# S1449: Culture should be specified for "string" operations -dotnet_diagnostic.S1449.severity = none - -# S1301: "switch" statements should have at least 3 "case" clauses -dotnet_diagnostic.S1301.severity = none - -# S1227: break statements should not be used except for switch cases -dotnet_diagnostic.S1227.severity = none - -# S1192: String literals should not be duplicated -dotnet_diagnostic.S1192.severity = none - -# S113: Files should contain an empty newline at the end -dotnet_diagnostic.S113.severity = none - -# S1128: Unused "using" should be removed -dotnet_diagnostic.S1128.severity = none - -# S1109: A close curly brace should be located at the beginning of a line -dotnet_diagnostic.S1109.severity = none - -# S105: Tabulation characters should not be used -dotnet_diagnostic.S105.severity = none - -# S100: Methods and properties should be named in PascalCase -dotnet_diagnostic.S100.severity = none - -# S1309: Track uses of in-source issue suppressions -dotnet_diagnostic.S1309.severity = none \ No newline at end of file diff --git a/KenticoInspector.Infrastructure.Tests/Directory.Build.props b/KenticoInspector.Infrastructure.Tests/Directory.Build.props deleted file mode 100644 index c4e59780..00000000 --- a/KenticoInspector.Infrastructure.Tests/Directory.Build.props +++ /dev/null @@ -1,8 +0,0 @@ - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - \ No newline at end of file diff --git a/KenticoInspector.Infrastructure.Tests/editorconfig.txt b/KenticoInspector.Infrastructure.Tests/editorconfig.txt deleted file mode 100644 index 09c62a85..00000000 --- a/KenticoInspector.Infrastructure.Tests/editorconfig.txt +++ /dev/null @@ -1,1245 +0,0 @@ -root = true - -[*.cs] - -# ===== Active SonarLint rules ===== - -# [Category: Bug] -# S2757: "=+" should not be used instead of "+=" -dotnet_diagnostic.S2757.severity = warning - -# S3168: "async" methods should not return "void" -dotnet_diagnostic.S3168.severity = warning - -# S3397: "base.Equals" should not be used to check for reference equality in "Equals" if "base" is not "object" -dotnet_diagnostic.S3397.severity = warning - -# S1206: "Equals(Object)" and "GetHashCode()" should be overridden in pairs -dotnet_diagnostic.S1206.severity = warning - -# S2328: "GetHashCode" should not reference mutable fields -dotnet_diagnostic.S2328.severity = warning - -# S2997: "IDisposables" created in a "using" statement should not be returned -dotnet_diagnostic.S2997.severity = warning - -# S2930: "IDisposables" should be disposed -dotnet_diagnostic.S2930.severity = warning - -# S2688: "NaN" should not be used in comparisons -dotnet_diagnostic.S2688.severity = warning - -# S2995: "Object.ReferenceEquals" should not be used for value types -dotnet_diagnostic.S2995.severity = warning - -# S3869: "SafeHandle.DangerousGetHandle" should not be called -dotnet_diagnostic.S3869.severity = warning - -# S3456: "string.ToCharArray()" should not be called redundantly -dotnet_diagnostic.S3456.severity = warning - -# S2996: "ThreadStatic" fields should not be initialized -dotnet_diagnostic.S2996.severity = warning - -# S3005: "ThreadStatic" should not be used on non-static fields -dotnet_diagnostic.S3005.severity = warning - -# S2225: "ToString()" method should not return null -dotnet_diagnostic.S2225.severity = warning - -# S2251: A "for" loop update clause should move the counter in the right direction -dotnet_diagnostic.S2251.severity = warning - -# S3923: All branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S3923.severity = warning - -# S3244: Anonymous delegates should not be used to unsubscribe from Events -dotnet_diagnostic.S3244.severity = warning - -# S3343: Caller information parameters should come at the end of the parameter list -dotnet_diagnostic.S3343.severity = warning - -# S4583: Calls to delegate's method "BeginInvoke" should be paired with calls to "EndInvoke" -dotnet_diagnostic.S4583.severity = warning - -# S3249: Classes directly extending "object" should not call "base" in "GetHashCode" or "Equals" -dotnet_diagnostic.S3249.severity = warning - -# S3453: Classes should not have only "private" constructors -dotnet_diagnostic.S3453.severity = warning - -# S4143: Collection elements should not be replaced unconditionally -dotnet_diagnostic.S4143.severity = warning - -# S3981: Collection sizes and array length comparisons should make sense -dotnet_diagnostic.S3981.severity = warning - -# S2114: Collections should not be passed as arguments to their own methods -dotnet_diagnostic.S2114.severity = warning - -# S2275: Composite format strings should not lead to unexpected behavior at runtime -dotnet_diagnostic.S2275.severity = warning - -# S2583: Conditionally executed code should be reachable -dotnet_diagnostic.S2583.severity = warning - -# S3172: Delegates should not be subtracted -dotnet_diagnostic.S3172.severity = warning - -# S3926: Deserialization methods should be provided for "OptionalField" members -dotnet_diagnostic.S3926.severity = warning - -# S1048: Destructors should not throw exceptions -dotnet_diagnostic.S1048.severity = warning - -# S2761: Doubled prefix operators "!!" and "~~" should not be used -dotnet_diagnostic.S2761.severity = warning - -# S4158: Empty collections should not be accessed or iterated -dotnet_diagnostic.S4158.severity = warning - -# S3655: Empty nullable value should not be accessed -dotnet_diagnostic.S3655.severity = warning - -# S3984: Exceptions should not be created without being thrown -dotnet_diagnostic.S3984.severity = warning - -# S3346: Expressions used in "Debug.Assert" should not produce side effects -dotnet_diagnostic.S3346.severity = warning - -# S2345: Flags enumerations should explicitly initialize all their members -dotnet_diagnostic.S2345.severity = warning - -# S2252: For-loop conditions should be true at least once -dotnet_diagnostic.S2252.severity = warning - -# S4275: Getters and setters should access the expected fields -dotnet_diagnostic.S4275.severity = warning - -# S1764: Identical expressions should not be used on both sides of a binary operator -dotnet_diagnostic.S1764.severity = warning - -# S2183: Integral numbers should not be shifted by zero or more than their number of bits-1 -dotnet_diagnostic.S2183.severity = warning - -# S1751: Loops with at most one iteration should be refactored -dotnet_diagnostic.S1751.severity = warning - -# S3603: Methods with "Pure" attribute should return a value -dotnet_diagnostic.S3603.severity = warning - -# S3887: Mutable, non-private fields should not be "readonly" -dotnet_diagnostic.S3887.severity = warning - -# S3889: Neither "Thread.Resume" nor "Thread.Suspend" should be used -dotnet_diagnostic.S3889.severity = warning - -# S4586: Non-async "Task/Task" methods should not return null -dotnet_diagnostic.S4586.severity = warning - -# S2259: Null pointers should not be dereferenced -dotnet_diagnostic.S2259.severity = warning - -# S3610: Nullable type comparison should not be redundant -dotnet_diagnostic.S3610.severity = warning - -# S1848: Objects should not be created to be dropped immediately without being used -dotnet_diagnostic.S1848.severity = warning - -# S3598: One-way "OperationContract" methods should have "void" return type -dotnet_diagnostic.S3598.severity = warning - -# S3466: Optional parameters should be passed to "base" calls -dotnet_diagnostic.S3466.severity = warning - -# S2934: Property assignments should not be made for "readonly" fields not constrained to reference types -dotnet_diagnostic.S2934.severity = warning - -# S2190: Recursion should not be infinite -dotnet_diagnostic.S2190.severity = warning - -# S1862: Related "if/else if" statements should not have the same condition -dotnet_diagnostic.S1862.severity = warning - -# S2184: Results of integer division should not be assigned to floating point variables -dotnet_diagnostic.S2184.severity = warning - -# S2201: Return values from functions without side effects should not be ignored -dotnet_diagnostic.S2201.severity = warning - -# S3449: Right operands of shift operators should be integers -dotnet_diagnostic.S3449.severity = warning - -# S3927: Serialization event handlers should be implemented correctly -dotnet_diagnostic.S3927.severity = warning - -# S2551: Shared resources should not be used for locking -dotnet_diagnostic.S2551.severity = warning - -# S2857: SQL keywords should be delimited by whitespace -dotnet_diagnostic.S2857.severity = warning - -# S3263: Static fields should appear in the order they must be initialized -dotnet_diagnostic.S3263.severity = warning - -# S3464: Type inheritance should not be recursive -dotnet_diagnostic.S3464.severity = warning - -# S3903: Types should be defined in named namespaces -dotnet_diagnostic.S3903.severity = warning - -# S2123: Values should not be uselessly incremented -dotnet_diagnostic.S2123.severity = warning - -# S1656: Variables should not be self-assigned -dotnet_diagnostic.S1656.severity = warning - -# S2306: "async" and "await" should not be used as identifiers -dotnet_diagnostic.S2306.severity = warning - - -# [Category: Security] -# S3884: "CoSetProxyBlanket" and "CoInitializeSecurity" should not be used -dotnet_diagnostic.S3884.severity = warning - -# S2115: A secure password should be used when connecting to a database -dotnet_diagnostic.S2115.severity = warning - -# S5547: Cipher algorithms should be robust -dotnet_diagnostic.S5547.severity = warning - -# S3329: Cipher Block Chaining IVs should be unpredictable -dotnet_diagnostic.S3329.severity = warning - -# S5542: Encryption algorithms should be used with secure mode and padding scheme -dotnet_diagnostic.S5542.severity = warning - -# S5445: Insecure temporary file creation methods should not be used -dotnet_diagnostic.S5445.severity = warning - -# S5659: JWT should be signed and verified with strong cipher algorithms -dotnet_diagnostic.S5659.severity = warning - -# S4433: LDAP connections should be authenticated -dotnet_diagnostic.S4433.severity = warning - -# S4211: Members should not have conflicting transparency annotations -dotnet_diagnostic.S4211.severity = warning - -# S4423: Weak SSL/TLS protocols should not be used -dotnet_diagnostic.S4423.severity = warning - -# S2755: XML parsers should not be vulnerable to XXE attacks -dotnet_diagnostic.S2755.severity = warning - -# S2053: Hashes should include an unpredictable salt -dotnet_diagnostic.S2053.severity = warning - -# S4830: Server certificates should be verified during SSL/TLS connections -dotnet_diagnostic.S4830.severity = warning - -# S4426: Cryptographic keys should be robust -dotnet_diagnostic.S4426.severity = warning - -# S5773: Types allowed to be deserialized should be restricted -dotnet_diagnostic.S5773.severity = warning - - -# [Category: Security Hotspot] -# S5693: Allowing requests with excessive content length is security-sensitive -dotnet_diagnostic.S5693.severity = warning - -# S4792: Configuring loggers is security-sensitive -dotnet_diagnostic.S4792.severity = warning - -# S3330: Creating cookies without the "HttpOnly" flag is security-sensitive -dotnet_diagnostic.S3330.severity = warning - -# S2092: Creating cookies without the "secure" flag is security-sensitive -dotnet_diagnostic.S2092.severity = warning - -# S4507: Delivering code in production with debug features activated is security-sensitive -dotnet_diagnostic.S4507.severity = warning - -# S5766: Deserializing objects without performing data validation is security-sensitive -dotnet_diagnostic.S5766.severity = warning - -# S5753: Disabling ASP.NET "Request Validation" feature is security-sensitive -dotnet_diagnostic.S5753.severity = warning - -# S4502: Disabling CSRF protections is security-sensitive -dotnet_diagnostic.S4502.severity = warning - -# S5042: Expanding archive files without controlling resource consumption is security-sensitive -dotnet_diagnostic.S5042.severity = warning - -# S2077: Formatting SQL queries is security-sensitive -dotnet_diagnostic.S2077.severity = warning - -# S2068: Hard-coded credentials are security-sensitive -dotnet_diagnostic.S2068.severity = warning - -# S5122: Having a permissive Cross-Origin Resource Sharing policy is security-sensitive -dotnet_diagnostic.S5122.severity = warning - -# S4036: Searching OS commands in PATH is security-sensitive -dotnet_diagnostic.S4036.severity = warning - -# S2612: Setting loose file permissions is security-sensitive -dotnet_diagnostic.S2612.severity = warning - -# S5332: Using clear-text protocols is security-sensitive -dotnet_diagnostic.S5332.severity = warning - -# S1313: Using hardcoded IP addresses is security-sensitive -dotnet_diagnostic.S1313.severity = warning - -# S2257: Using non-standard cryptographic algorithms is security-sensitive -dotnet_diagnostic.S2257.severity = warning - -# S2245: Using pseudorandom number generators (PRNGs) is security-sensitive -dotnet_diagnostic.S2245.severity = warning - -# S5443: Using publicly writable directories is security-sensitive -dotnet_diagnostic.S5443.severity = warning - -# S4790: Using weak hashing algorithms is security-sensitive -dotnet_diagnostic.S4790.severity = warning - - -# [Category: Code Smell] -# S3451: "[DefaultValue]" should not be used when "[DefaultParameterValue]" is meant -dotnet_diagnostic.S3451.severity = warning - -# S3447: "[Optional]" should not be used on "ref" or "out" parameters -dotnet_diagnostic.S3447.severity = warning - -# S1155: "Any()" should be used to test for emptiness -dotnet_diagnostic.S1155.severity = warning - -# S2737: "catch" clauses should do more than rethrow -dotnet_diagnostic.S2737.severity = warning - -# S4524: "default" clauses should be first or last -dotnet_diagnostic.S4524.severity = warning - -# S3217: "Explicit" conversions of "foreach" loops should not be used -dotnet_diagnostic.S3217.severity = warning - -# S3971: "GC.SuppressFinalize" should not be called -dotnet_diagnostic.S3971.severity = warning - -# S907: "goto" statement should not be used -dotnet_diagnostic.S907.severity = warning - -# S2692: "IndexOf" checks should not be for positive numbers -dotnet_diagnostic.S2692.severity = warning - -# S3060: "is" should not be used with "this" -dotnet_diagnostic.S3060.severity = warning - -# S1123: "Obsolete" attributes should include explanations -dotnet_diagnostic.S1123.severity = warning - -# S4214: "P/Invoke" methods should not be visible -dotnet_diagnostic.S4214.severity = warning - -# S4061: "params" should be used instead of "varargs" -dotnet_diagnostic.S4061.severity = warning - -# S3262: "params" should be used on overrides -dotnet_diagnostic.S3262.severity = warning - -# S3600: "params" should not be introduced on overrides -dotnet_diagnostic.S3600.severity = warning - -# S3597: "ServiceContract" and "OperationContract" attributes should be used together -dotnet_diagnostic.S3597.severity = warning - -# S3963: "static" fields should be initialized inline -dotnet_diagnostic.S3963.severity = warning - -# S3256: "string.IsNullOrEmpty" should be used -dotnet_diagnostic.S3256.severity = warning - -# S1479: "switch" statements should not have too many "case" clauses -dotnet_diagnostic.S1479.severity = warning - -# S5034: "ValueTask" should be consumed correctly -dotnet_diagnostic.S5034.severity = warning - -# S1264: A "while" loop should be used instead of a "for" loop -dotnet_diagnostic.S1264.severity = warning - -# S3973: A conditionally executed single line should be denoted by indentation -dotnet_diagnostic.S3973.severity = warning - -# S3904: Assemblies should have version information -dotnet_diagnostic.S3904.severity = warning - -# S3415: Assertion arguments should be passed in the correct order -dotnet_diagnostic.S3415.severity = warning - -# S4019: Base class methods should not be hidden -dotnet_diagnostic.S4019.severity = warning - -# S1940: Boolean checks should not be inverted -dotnet_diagnostic.S1940.severity = warning - -# S3236: Caller information arguments should not be provided explicitly -dotnet_diagnostic.S3236.severity = warning - -# S3897: Classes that provide "Equals()" should implement "IEquatable" -dotnet_diagnostic.S3897.severity = warning - -# S3457: Composite format strings should be used correctly -dotnet_diagnostic.S3457.severity = warning - -# S3972: Conditionals should start on new lines -dotnet_diagnostic.S3972.severity = warning - -# S1116: Empty statements should be removed -dotnet_diagnostic.S1116.severity = warning - -# S3264: Events should be invoked -dotnet_diagnostic.S3264.severity = warning - -# S3445: Exceptions should not be explicitly rethrown -dotnet_diagnostic.S3445.severity = warning - -# S1163: Exceptions should not be thrown in finally blocks -dotnet_diagnostic.S1163.severity = warning - -# S2290: Field-like events should not be virtual -dotnet_diagnostic.S2290.severity = warning - -# S2346: Flags enumerations zero-value members should be named "warning" -dotnet_diagnostic.S2346.severity = warning - -# S3251: Implementations should be provided for "partial" methods -dotnet_diagnostic.S3251.severity = warning - -# S1944: Inappropriate casts should not be made -dotnet_diagnostic.S1944.severity = warning - -# S4015: Inherited member visibility should not be decreased -dotnet_diagnostic.S4015.severity = warning - -# S3444: Interfaces should not simply inherit from base interfaces with colliding members -dotnet_diagnostic.S3444.severity = warning - -# S818: Literal suffixes should be upper case -dotnet_diagnostic.S818.severity = warning - -# S3400: Methods should not return constants -dotnet_diagnostic.S3400.severity = warning - -# S2681: Multiline blocks should be enclosed in curly braces -dotnet_diagnostic.S2681.severity = warning - -# S3169: Multiple "OrderBy" calls should not be used -dotnet_diagnostic.S3169.severity = warning - -# S3261: Namespaces should not be empty -dotnet_diagnostic.S3261.severity = warning - -# S4200: Native methods should be wrapped -dotnet_diagnostic.S4200.severity = warning - -# S1199: Nested code blocks should not be used -dotnet_diagnostic.S1199.severity = warning - -# S4070: Non-flags enums should not be marked with "FlagsAttribute" -dotnet_diagnostic.S4070.severity = warning - -# S3265: Non-flags enums should not be used in bitwise operations -dotnet_diagnostic.S3265.severity = warning - -# S4201: Null checks should not be used with "is" -dotnet_diagnostic.S4201.severity = warning - -# S3966: Objects should not be disposed more than once -dotnet_diagnostic.S3966.severity = warning - -# S2291: Overflow checking should not be disabled for "Enumerable.Sum" -dotnet_diagnostic.S2291.severity = warning - -# S1185: Overriding members should do more than simply call the same member in the base class -dotnet_diagnostic.S1185.severity = warning - -# S2234: Parameters should be passed in the correct order -dotnet_diagnostic.S2234.severity = warning - -# S3450: Parameters with "[DefaultParameterValue]" attributes should also be marked "[Optional]" -dotnet_diagnostic.S3450.severity = warning - -# S1905: Redundant casts should not be used -dotnet_diagnostic.S1905.severity = warning - -# S1110: Redundant pairs of parentheses should be removed -dotnet_diagnostic.S1110.severity = warning - -# S2437: Silly bit operations should not be performed -dotnet_diagnostic.S2437.severity = warning - -# S3010: Static fields should not be updated in constructors -dotnet_diagnostic.S3010.severity = warning - -# S4635: String offset-based methods should be preferred for finding substrings from offsets -dotnet_diagnostic.S4635.severity = warning - -# S3998: Threads should not lock on objects with weak identity -dotnet_diagnostic.S3998.severity = warning - -# S1134: Track uses of "FIXME" tags -dotnet_diagnostic.S1134.severity = warning - -# S1135: Track uses of "TODO" tags -dotnet_diagnostic.S1135.severity = warning - -# S1871: Two branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S1871.severity = warning - -# S3443: Type should not be examined on "System.Type" instances -dotnet_diagnostic.S3443.severity = warning - -# S3459: Unassigned members should be removed -dotnet_diagnostic.S3459.severity = warning - -# S3440: Variables should not be checked against the values they're about to be assigned -dotnet_diagnostic.S3440.severity = warning - -# S2479: Whitespace and control characters in string literals should be explicit -dotnet_diagnostic.S2479.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S3442: "abstract" classes should not have "public" constructors -dotnet_diagnostic.S3442.severity = warning - -# S3885: "Assembly.Load" should be used -dotnet_diagnostic.S3885.severity = warning - -# S1210: "Equals" and the comparison operators should be overridden when implementing "IComparable" -dotnet_diagnostic.S1210.severity = warning - -# S1215: "GC.Collect" should not be called -dotnet_diagnostic.S1215.severity = warning - -# S3881: "IDisposable" should be implemented correctly -dotnet_diagnostic.S3881.severity = warning - -# S2971: "IEnumerable" LINQs should be simplified -dotnet_diagnostic.S2971.severity = warning - -# S3925: "ISerializable" should be implemented correctly -dotnet_diagnostic.S3925.severity = warning - -# S4581: "new Guid()" should not be used -dotnet_diagnostic.S4581.severity = warning - -# S3875: "operator==" should not be overloaded on reference types -dotnet_diagnostic.S3875.severity = warning - -# S3237: "value" parameters should be used -dotnet_diagnostic.S3237.severity = warning - -# S1121: Assignments should not be made from within sub-expressions -dotnet_diagnostic.S1121.severity = warning - -# S3376: Attribute, EventArgs, and Exception type names should end with the type being extended -dotnet_diagnostic.S3376.severity = warning - -# S2589: Boolean expressions should not be gratuitous -dotnet_diagnostic.S2589.severity = warning - -# S4035: Classes implementing "IEquatable" should be sealed -dotnet_diagnostic.S4035.severity = warning - -# S3776: Cognitive Complexity of methods should not be too high -dotnet_diagnostic.S3776.severity = warning - -# S1066: Collapsible "if" statements should be merged -dotnet_diagnostic.S1066.severity = warning - -# S1699: Constructors should only call non-overridable methods -dotnet_diagnostic.S1699.severity = warning - -# S2372: Exceptions should not be thrown from property getters -dotnet_diagnostic.S2372.severity = warning - -# S3877: Exceptions should not be thrown from unexpected methods -dotnet_diagnostic.S3877.severity = warning - -# S1104: Fields should not have public accessibility -dotnet_diagnostic.S1104.severity = warning - -# S2933: Fields that are only assigned in the constructor should be "readonly" -dotnet_diagnostic.S2933.severity = warning - -# S112: General exceptions should never be thrown -dotnet_diagnostic.S112.severity = warning - -# S2486: Generic exceptions should not be ignored -dotnet_diagnostic.S2486.severity = warning - -# S3246: Generic type parameters should be co/contravariant when possible -dotnet_diagnostic.S3246.severity = warning - -# S1939: Inheritance list should not be redundant -dotnet_diagnostic.S1939.severity = warning - -# S110: Inheritance tree of classes should not be too deep -dotnet_diagnostic.S110.severity = warning - -# S3218: Inner class members should not shadow outer class "static" or type members -dotnet_diagnostic.S3218.severity = warning - -# S2696: Instance members should not write to "static" fields -dotnet_diagnostic.S2696.severity = warning - -# S3626: Jump statements should not be redundant -dotnet_diagnostic.S3626.severity = warning - -# S1117: Local variables should not shadow class fields -dotnet_diagnostic.S1117.severity = warning - -# S3267: Loops should be simplified with "LINQ" expressions -dotnet_diagnostic.S3267.severity = warning - -# S3604: Member initializer values should not be redundant -dotnet_diagnostic.S3604.severity = warning - -# S3220: Method calls should not resolve ambiguously to overloads with "params" -dotnet_diagnostic.S3220.severity = warning - -# S4136: Method overloads should be grouped together -dotnet_diagnostic.S4136.severity = warning - -# S3427: Method overloads with default parameter values should not overlap -dotnet_diagnostic.S3427.severity = warning - -# S1006: Method overrides should not change parameter defaults -dotnet_diagnostic.S1006.severity = warning - -# S2953: Methods named "Dispose" should implement "IDisposable.Dispose" -dotnet_diagnostic.S2953.severity = warning - -# S1186: Methods should not be empty -dotnet_diagnostic.S1186.severity = warning - -# S4144: Methods should not have identical implementations -dotnet_diagnostic.S4144.severity = warning - -# S107: Methods should not have too many parameters -dotnet_diagnostic.S107.severity = warning - -# S3241: Methods should not return values that are never used -dotnet_diagnostic.S3241.severity = warning - -# S2386: Mutable fields should not be "public static" -dotnet_diagnostic.S2386.severity = warning - -# S108: Nested blocks of code should not be left empty -dotnet_diagnostic.S108.severity = warning - -# S2223: Non-constant static fields should not be visible -dotnet_diagnostic.S2223.severity = warning - -# S3260: Non-derived "private" classes and records should be "sealed" -dotnet_diagnostic.S3260.severity = warning - -# S927: Parameter names should match base declaration and other partial definitions -dotnet_diagnostic.S927.severity = warning - -# S3928: Parameter names used into ArgumentException constructors should match an existing one -dotnet_diagnostic.S3928.severity = warning - -# S4457: Parameter validation in "async"/"await" methods should be wrapped -dotnet_diagnostic.S4457.severity = warning - -# S4456: Parameter validation in yielding methods should be wrapped -dotnet_diagnostic.S4456.severity = warning - -# S1450: Private fields only used as local variables in methods should become local variables -dotnet_diagnostic.S1450.severity = warning - -# S2365: Properties should not make collection or array copies -dotnet_diagnostic.S2365.severity = warning - -# S2368: Public methods should not have multidimensional array parameters -dotnet_diagnostic.S2368.severity = warning - -# S3011: Reflection should not be used to increase accessibility of classes, methods, or fields -dotnet_diagnostic.S3011.severity = warning - -# S2219: Runtime type checking should be simplified -dotnet_diagnostic.S2219.severity = warning - -# S125: Sections of code should not be commented out -dotnet_diagnostic.S125.severity = warning - -# S2178: Short-circuit logic should be used in boolean contexts -dotnet_diagnostic.S2178.severity = warning - -# S2743: Static fields should not be used in generic types -dotnet_diagnostic.S2743.severity = warning - -# S1643: Strings should not be concatenated using '+' in a loop -dotnet_diagnostic.S1643.severity = warning - -# S3358: Ternary operators should not be nested -dotnet_diagnostic.S3358.severity = warning - -# S3433: Test method signatures should be correct -dotnet_diagnostic.S3433.severity = warning - -# S2187: TestCases should contain tests -dotnet_diagnostic.S2187.severity = warning - -# S2699: Tests should include assertions -dotnet_diagnostic.S2699.severity = warning - -# S1607: Tests should not be ignored -dotnet_diagnostic.S1607.severity = warning - -# S2292: Trivial properties should be auto-implemented -dotnet_diagnostic.S2292.severity = warning - -# S2436: Types and methods should not have too many generic parameters -dotnet_diagnostic.S2436.severity = warning - -# S101: Types should be named in PascalCase -dotnet_diagnostic.S101.severity = warning - -# S4487: Unread "private" fields should be removed -dotnet_diagnostic.S4487.severity = warning - -# S1854: Unused assignments should be removed -dotnet_diagnostic.S1854.severity = warning - -# S1481: Unused local variables should be removed -dotnet_diagnostic.S1481.severity = warning - -# S1172: Unused method parameters should be removed -dotnet_diagnostic.S1172.severity = warning - -# S1144: Unused private types or members should be removed -dotnet_diagnostic.S1144.severity = warning - -# S2326: Unused type parameters should be removed -dotnet_diagnostic.S2326.severity = warning - -# S1075: URIs should not be hardcoded -dotnet_diagnostic.S1075.severity = warning - -# S1118: Utility classes should not have public constructors -dotnet_diagnostic.S1118.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S1125: Boolean literals should not be redundant -dotnet_diagnostic.S1125.severity = warning - - -# ===== Inactive SonarLint rules (must be explicitly turned off) ===== - -# [Category: Bug] (All these are excluded because they're not applicable to our solution) -# S4428: "PartCreationPolicyAttribute" should be used with "ExportAttribute" -dotnet_diagnostic.S4428.severity = none - -# S4260: "ConstructorArgument" parameters should exist in constructors -dotnet_diagnostic.S4260.severity = none - -# S4277: "Shared" parts should not be created with "new" -dotnet_diagnostic.S4277.severity = none - -# S4159: Classes should implement their "ExportAttribute" interfaces -dotnet_diagnostic.S4159.severity = none - -# S4210: Windows Forms entry points should be marked with STAThread -dotnet_diagnostic.S4210.severity = none - - -# [Uncategorized] -# S6287: HTTP responses should not be vulnerable to session fixation -dotnet_diagnostic.S6287.severity = none - -# S6096: Extracting archives should not lead to zip slip vulnerabilities -dotnet_diagnostic.S6096.severity = none - -# S5334: Dynamic code execution should not be vulnerable to injection attacks -dotnet_diagnostic.S5334.severity = none - -# S5146: HTTP request redirections should not be open to forging attacks -dotnet_diagnostic.S5146.severity = none - -# S5135: Deserialization should not be vulnerable to injection attacks -dotnet_diagnostic.S5135.severity = none - -# S5131: Endpoints should not be vulnerable to reflected cross-site scripting (XSS) attacks -dotnet_diagnostic.S5131.severity = none - -# S3649: Database queries should not be vulnerable to injection attacks -dotnet_diagnostic.S3649.severity = none - -# S2091: XPath expressions should not be vulnerable to injection attacks -dotnet_diagnostic.S2091.severity = none - -# S2083: I/O function calls should not be vulnerable to path injection attacks -dotnet_diagnostic.S2083.severity = none - -# S2078: LDAP queries should not be vulnerable to injection attacks -dotnet_diagnostic.S2078.severity = none - -# S2076: OS commands should not be vulnerable to command injection attacks -dotnet_diagnostic.S2076.severity = none - -# S6424: Azure Functions: Restrictions on entity interfaces -dotnet_diagnostic.S6424.severity = none - -# S6422: Calls to "async" methods should not be blocking in Azure Functions -dotnet_diagnostic.S6422.severity = none - -# S2631: Regular expressions should not be vulnerable to Denial of Service attacks -dotnet_diagnostic.S2631.severity = none - -# S2222: Locks should be released -dotnet_diagnostic.S2222.severity = none - -# S5144: Server-side requests should not be vulnerable to forging attacks -dotnet_diagnostic.S5144.severity = none - -# S6350: Constructing arguments of system commands from user input is security-sensitive -dotnet_diagnostic.S6350.severity = none - -# S6420: Reuse client instances rather than creating new ones with each Azure Function invocation -dotnet_diagnostic.S6420.severity = none - -# S6419: Azure Functions should be stateless -dotnet_diagnostic.S6419.severity = none - -# S5883: OS commands should not be vulnerable to argument injection attacks -dotnet_diagnostic.S5883.severity = none - -# S5145: Logging should not be vulnerable to injection attacks -dotnet_diagnostic.S5145.severity = none - -# S2931: Classes with "IDisposable" members should implement "IDisposable" -dotnet_diagnostic.S2931.severity = none - -# S4462: Calls to "async" methods should not be blocking -dotnet_diagnostic.S4462.severity = none - -# S2387: Child class fields should not shadow parent class fields -dotnet_diagnostic.S2387.severity = none - -# S1451: Track lack of copyright and license headers -dotnet_diagnostic.S1451.severity = none - -# S1147: Exit methods should not be called -dotnet_diagnostic.S1147.severity = none - -# S2952: Classes should "Dispose" of members from the classes' own "Dispose" methods -dotnet_diagnostic.S2952.severity = none - -# S4829: Reading the Standard Input is security-sensitive -dotnet_diagnostic.S4829.severity = none - -# S4823: Using command line arguments is security-sensitive -dotnet_diagnostic.S4823.severity = none - -# S4818: Using Sockets is security-sensitive -dotnet_diagnostic.S4818.severity = none - -# S4787: Encrypting data is security-sensitive -dotnet_diagnostic.S4787.severity = none - -# S4784: Using regular expressions is security-sensitive -dotnet_diagnostic.S4784.severity = none - -# S4039: Interface methods should be callable by derived types -dotnet_diagnostic.S4039.severity = none - -# S4025: Child class fields should not differ from parent class fields only by capitalization -dotnet_diagnostic.S4025.severity = none - -# S4000: Pointers to unmanaged memory should not be visible -dotnet_diagnostic.S4000.severity = none - -# S3937: Number patterns should be regular -dotnet_diagnostic.S3937.severity = none - -# S3874: "out" and "ref" parameters should not be used -dotnet_diagnostic.S3874.severity = none - -# S3353: Unchanged local variables should be "const" -dotnet_diagnostic.S3353.severity = none - -# S3216: "ConfigureAwait(false)" should be used -dotnet_diagnostic.S3216.severity = none - -# S3215: "interface" instances should not be cast to concrete types -dotnet_diagnostic.S3215.severity = none - -# S2701: Literal boolean values should not be used in assertions -dotnet_diagnostic.S2701.severity = none - -# S2360: Optional parameters should not be used -dotnet_diagnostic.S2360.severity = none - -# S2339: Public constant members should not be used -dotnet_diagnostic.S2339.severity = none - -# S2330: Array covariance should not be used -dotnet_diagnostic.S2330.severity = none - -# S2302: "nameof" should be used -dotnet_diagnostic.S2302.severity = none - -# S2197: Modulus results should not be checked for direct equality -dotnet_diagnostic.S2197.severity = none - -# S1994: "for" loop increment clauses should modify the loops' counters -dotnet_diagnostic.S1994.severity = none - -# S1821: "switch" statements should not be nested -dotnet_diagnostic.S1821.severity = none - -# S1541: Methods and properties should not be too complex -dotnet_diagnostic.S1541.severity = none - -# S134: Control flow statements "if", "switch", "for", "foreach", "while", "do" and "try" should not be nested too deeply -dotnet_diagnostic.S134.severity = none - -# S131: "switch/Select" statements should contain a "default/Case Else" clauses -dotnet_diagnostic.S131.severity = none - -# S126: "if ... else if" constructs should end with "else" clauses -dotnet_diagnostic.S126.severity = none - -# S121: Control structures should use curly braces -dotnet_diagnostic.S121.severity = none - -# S1067: Expressions should not be too complex -dotnet_diagnostic.S1067.severity = none - -# S4564: ASP.NET HTTP request validation feature should not be disabled -dotnet_diagnostic.S4564.severity = none - -# S4212: Serialization constructors should be secured -dotnet_diagnostic.S4212.severity = none - -# S3949: Calculations should not overflow -dotnet_diagnostic.S3949.severity = none - -# S1244: Floating point numbers should not be tested for equality -dotnet_diagnostic.S1244.severity = none - -# S881: Increment (++) and decrement (--) operators should not be used in a method call or mixed with other operators in an expression -dotnet_diagnostic.S881.severity = none - -# S6423: Azure Functions should log all failures -dotnet_diagnostic.S6423.severity = none - -# S6421: Azure Functions should use Structured Error Handling -dotnet_diagnostic.S6421.severity = none - -# S6354: Use a testable date/time provider -dotnet_diagnostic.S6354.severity = none - -# S4059: Property names should not match get methods -dotnet_diagnostic.S4059.severity = none - -# S4057: Locales should be set for data types -dotnet_diagnostic.S4057.severity = none - -# S4055: Literals should not be passed as localized parameters -dotnet_diagnostic.S4055.severity = none - -# S4050: Operators should be overloaded consistently -dotnet_diagnostic.S4050.severity = none - -# S4017: Method signatures should not contain nested generic types -dotnet_diagnostic.S4017.severity = none - -# S4016: Enumeration members should not be named "Reserved" -dotnet_diagnostic.S4016.severity = none - -# S4005: "System.Uri" arguments should be used instead of strings -dotnet_diagnostic.S4005.severity = none - -# S4004: Collection properties should be readonly -dotnet_diagnostic.S4004.severity = none - -# S4002: Disposable types should declare finalizers -dotnet_diagnostic.S4002.severity = none - -# S3997: String URI overloads should call "System.Uri" overloads -dotnet_diagnostic.S3997.severity = none - -# S3996: URI properties should not be strings -dotnet_diagnostic.S3996.severity = none - -# S3995: URI return values should not be strings -dotnet_diagnostic.S3995.severity = none - -# S3994: URI Parameters should not be strings -dotnet_diagnostic.S3994.severity = none - -# S3993: Custom attributes should be marked with "System.AttributeUsageAttribute" -dotnet_diagnostic.S3993.severity = none - -# S3992: Assemblies should explicitly specify COM visibility -dotnet_diagnostic.S3992.severity = none - -# S3990: Assemblies should be marked as CLS compliant -dotnet_diagnostic.S3990.severity = none - -# S3956: "Generic.List" instances should not be part of public APIs -dotnet_diagnostic.S3956.severity = none - -# S3909: Collections should implement the generic interface -dotnet_diagnostic.S3909.severity = none - -# S3908: Generic event handlers should be used -dotnet_diagnostic.S3908.severity = none - -# S3906: Event Handlers should have the correct signature -dotnet_diagnostic.S3906.severity = none - -# S3902: "Assembly.GetExecutingAssembly" should not be called -dotnet_diagnostic.S3902.severity = none - -# S3900: Arguments of public methods should be validated against null -dotnet_diagnostic.S3900.severity = none - -# S3898: Value types should implement "IEquatable" -dotnet_diagnostic.S3898.severity = none - -# S3880: Finalizers should not be empty -dotnet_diagnostic.S3880.severity = none - -# S3431: "[ExpectedException]" should not be used -dotnet_diagnostic.S3431.severity = none - -# S3366: "this" should not be exposed from constructors -dotnet_diagnostic.S3366.severity = none - -# S3059: Types should not have members with visibility set higher than the type's visibility -dotnet_diagnostic.S3059.severity = none - -# S2357: Fields should be private -dotnet_diagnostic.S2357.severity = none - -# S2327: "try" statements with identical "catch" and/or "finally" blocks should be merged -dotnet_diagnostic.S2327.severity = none - -# S1696: NullReferenceException should not be caught -dotnet_diagnostic.S1696.severity = none - -# S138: Functions should not have too many lines of code -dotnet_diagnostic.S138.severity = none - -# S127: "for" loop stop conditions should be invariant -dotnet_diagnostic.S127.severity = none - -# S122: Statements should be on separate lines -dotnet_diagnostic.S122.severity = none - -# S1200: Classes should not be coupled to too many other classes (Single Responsibility Principle) -dotnet_diagnostic.S1200.severity = none - -# S1151: "switch case" clauses should not have too many lines of code -dotnet_diagnostic.S1151.severity = none - -# S109: Magic numbers should not be used -dotnet_diagnostic.S109.severity = none - -# S106: Standard outputs should not be used directly to log anything -dotnet_diagnostic.S106.severity = none - -# S104: Files should not have too many lines of code -dotnet_diagnostic.S104.severity = none - -# S103: Lines should not be too long -dotnet_diagnostic.S103.severity = none - -# S5167: HTTP response headers should not be vulnerable to injection attacks -dotnet_diagnostic.S5167.severity = none - -# S2228: Console logging should not be used -dotnet_diagnostic.S2228.severity = none - -# S2955: Generic parameters not constrained to reference types should not be compared to "null" -dotnet_diagnostic.S2955.severity = none - -# S2674: The length returned from a stream read should be checked -dotnet_diagnostic.S2674.severity = none - -# S1226: Method parameters, caught exceptions and foreach variables' initial values should not be ignored -dotnet_diagnostic.S1226.severity = none - -# S4834: Controlling permissions is security-sensitive -dotnet_diagnostic.S4834.severity = none - -# S2255: Writing cookies is security-sensitive -dotnet_diagnostic.S2255.severity = none - -# S4261: Methods should be named according to their synchronicities -dotnet_diagnostic.S4261.severity = none - -# S4226: Extensions should be in separate namespaces -dotnet_diagnostic.S4226.severity = none - -# S4225: Extension methods should not extend "object" -dotnet_diagnostic.S4225.severity = none - -# S4069: Operator overloads should have named alternatives -dotnet_diagnostic.S4069.severity = none - -# S4060: Non-abstract attributes should be sealed -dotnet_diagnostic.S4060.severity = none - -# S4058: Overloads with a "StringComparison" parameter should be used -dotnet_diagnostic.S4058.severity = none - -# S4056: Overloads with a "CultureInfo" or an "IFormatProvider" parameter should be used -dotnet_diagnostic.S4056.severity = none - -# S4052: Types should not extend outdated base types -dotnet_diagnostic.S4052.severity = none - -# S4049: Properties should be preferred -dotnet_diagnostic.S4049.severity = none - -# S4047: Generics should be used when appropriate -dotnet_diagnostic.S4047.severity = none - -# S4041: Type names should not match namespaces -dotnet_diagnostic.S4041.severity = none - -# S4040: Strings should be normalized to uppercase -dotnet_diagnostic.S4040.severity = none - -# S4027: Exceptions should provide standard constructors -dotnet_diagnostic.S4027.severity = none - -# S4026: Assemblies should be marked with "NeutralResourcesLanguageAttribute" -dotnet_diagnostic.S4026.severity = none - -# S4023: Interfaces should not be empty -dotnet_diagnostic.S4023.severity = none - -# S4022: Enumerations should have "Int32" storage -dotnet_diagnostic.S4022.severity = none - -# S4018: Generic methods should provide type parameters -dotnet_diagnostic.S4018.severity = none - -# S3967: Multidimensional arrays should not be used -dotnet_diagnostic.S3967.severity = none - -# S3962: "static readonly" constants should be "const" instead -dotnet_diagnostic.S3962.severity = none - -# S3876: Strings or integral types should be used for indexers -dotnet_diagnostic.S3876.severity = none - -# S3872: Parameter names should not duplicate the names of their methods -dotnet_diagnostic.S3872.severity = none - -# S3717: Track use of "NotImplementedException" -dotnet_diagnostic.S3717.severity = none - -# S3532: Empty "default" clauses should be removed -dotnet_diagnostic.S3532.severity = none - -# S3441: Redundant property names should be omitted in anonymous classes -dotnet_diagnostic.S3441.severity = none - -# S3257: Declarations and initializations should be as concise as possible -dotnet_diagnostic.S3257.severity = none - -# S3254: Default parameter values should not be passed as arguments -dotnet_diagnostic.S3254.severity = none - -# S3253: Constructor and destructor declarations should not be redundant -dotnet_diagnostic.S3253.severity = none - -# S3242: Method parameters should be declared with base types -dotnet_diagnostic.S3242.severity = none - -# S3240: The simplest possible condition syntax should be used -dotnet_diagnostic.S3240.severity = none - -# S3235: Redundant parentheses should not be used -dotnet_diagnostic.S3235.severity = none - -# S3234: "GC.SuppressFinalize" should not be invoked for types without destructors -dotnet_diagnostic.S3234.severity = none - -# S3052: Members should not be initialized to default values -dotnet_diagnostic.S3052.severity = none - -# S2760: Sequential tests should not check the same condition -dotnet_diagnostic.S2760.severity = none - -# S2333: Redundant modifiers should not be used -dotnet_diagnostic.S2333.severity = none - -# S2325: Methods and properties that don't access instance data should be static -dotnet_diagnostic.S2325.severity = none - -# S2221: "Exception" should not be caught when not required by called methods -dotnet_diagnostic.S2221.severity = none - -# S2156: "sealed" classes should not have "protected" members -dotnet_diagnostic.S2156.severity = none - -# S2148: Underscores should be used to make large numbers readable -dotnet_diagnostic.S2148.severity = none - -# S1858: "ToString()" calls should not be redundant -dotnet_diagnostic.S1858.severity = none - -# S1698: "=" should not be used when "Equals" is overridden -dotnet_diagnostic.S1698.severity = none - -# S1694: An abstract class should have both abstract and concrete methods -dotnet_diagnostic.S1694.severity = none - -# S1659: Multiple variables should not be declared on the same line -dotnet_diagnostic.S1659.severity = none - -# S1449: Culture should be specified for "string" operations -dotnet_diagnostic.S1449.severity = none - -# S1301: "switch" statements should have at least 3 "case" clauses -dotnet_diagnostic.S1301.severity = none - -# S1227: break statements should not be used except for switch cases -dotnet_diagnostic.S1227.severity = none - -# S1192: String literals should not be duplicated -dotnet_diagnostic.S1192.severity = none - -# S113: Files should contain an empty newline at the end -dotnet_diagnostic.S113.severity = none - -# S1128: Unused "using" should be removed -dotnet_diagnostic.S1128.severity = none - -# S1109: A close curly brace should be located at the beginning of a line -dotnet_diagnostic.S1109.severity = none - -# S105: Tabulation characters should not be used -dotnet_diagnostic.S105.severity = none - -# S100: Methods and properties should be named in PascalCase -dotnet_diagnostic.S100.severity = none - -# S1309: Track uses of in-source issue suppressions -dotnet_diagnostic.S1309.severity = none \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/Directory.Build.props b/KenticoInspector.Infrastructure/Directory.Build.props deleted file mode 100644 index c4e59780..00000000 --- a/KenticoInspector.Infrastructure/Directory.Build.props +++ /dev/null @@ -1,8 +0,0 @@ - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/Repositories/ActionRepository.cs b/KenticoInspector.Infrastructure/Repositories/ActionRepository.cs deleted file mode 100644 index ae97f996..00000000 --- a/KenticoInspector.Infrastructure/Repositories/ActionRepository.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -using KenticoInspector.Core.Modules; -using KenticoInspector.Core.Repositories.Interfaces; - -namespace KenticoInspector.Infrastructure.Repositories -{ - public class ActionRepository : IActionRepository - { - private readonly IEnumerable actions; - - public ActionRepository(IEnumerable actions) - { - this.actions = actions; - } - - public IAction GetAction(string codename) - { - var allReports = LoadActions(); - return allReports.FirstOrDefault(x => x.Codename.ToLower() == codename.ToLower()); - } - - public IEnumerable GetActions() - { - return LoadActions(); - } - - private IEnumerable LoadActions() - { - return actions; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/Repositories/InstanceRepository.cs b/KenticoInspector.Infrastructure/Repositories/InstanceRepository.cs deleted file mode 100644 index a0170b59..00000000 --- a/KenticoInspector.Infrastructure/Repositories/InstanceRepository.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Repositories.Interfaces; - -using Newtonsoft.Json; - -namespace KenticoInspector.Infrastructure.Repositories -{ - public class InstanceRepository : IInstanceRepository - { - private readonly string _saveFileLocation = $"{Directory.GetCurrentDirectory()}\\SavedInstances.json"; - - public bool DeleteInstance(Guid guid) - { - var currentInstances = LoadSavedInstances(); - var totalRemoved = currentInstances.RemoveAll(i => i.Guid == guid); - SaveInstances(currentInstances); - return totalRemoved > 0; - } - - public Instance GetInstance(Guid guid) - { - var instances = GetInstances(); - var selectedInstance = instances.FirstOrDefault(i => i.Guid == guid); - - return selectedInstance; - } - - public IList GetInstances() - { - return LoadSavedInstances(); - } - - public Instance UpsertInstance(Instance instance) - { - instance.Guid = instance.Guid == Guid.Empty ? Guid.NewGuid() : instance.Guid; - var savedInstanceSettings = LoadSavedInstances(); - var existingSettingsIndex = savedInstanceSettings.FindIndex(x => x.Guid == instance.Guid); - if (existingSettingsIndex == -1) - { - savedInstanceSettings.Add(instance); - } - else - { - savedInstanceSettings[existingSettingsIndex] = instance; - } - - SaveInstances(savedInstanceSettings); - - return instance; - } - - private List LoadSavedInstances() - { - var saveFileExists = File.Exists(_saveFileLocation); - if (saveFileExists) - { - var saveFileContents = File.ReadAllText(_saveFileLocation); - var loadedInstances = JsonConvert.DeserializeObject>(saveFileContents); - - return loadedInstances; - } - - return new List(); - } - - private void SaveInstances(IList instances) - { - var jsonText = JsonConvert.SerializeObject(instances, Formatting.Indented); - File.WriteAllText(_saveFileLocation, jsonText); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/Repositories/ReportRepository.cs b/KenticoInspector.Infrastructure/Repositories/ReportRepository.cs deleted file mode 100644 index ffd639d8..00000000 --- a/KenticoInspector.Infrastructure/Repositories/ReportRepository.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -using KenticoInspector.Core.Modules; -using KenticoInspector.Core.Repositories.Interfaces; - -namespace KenticoInspector.Infrastructure.Repositories -{ - public class ReportRepository : IReportRepository - { - private readonly IEnumerable reports; - - public ReportRepository(IEnumerable reports) - { - this.reports = reports; - } - - public IReport GetReport(string codename) - { - var allReports = LoadReports(); - return allReports.FirstOrDefault(x => x.Codename.ToLower() == codename.ToLower()); - } - - public IEnumerable GetReports() - { - return LoadReports(); - } - - private IEnumerable LoadReports() - { - return reports.OrderBy(r => r.Codename); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/Repositories/SiteRepository.cs b/KenticoInspector.Infrastructure/Repositories/SiteRepository.cs deleted file mode 100644 index 02683fcd..00000000 --- a/KenticoInspector.Infrastructure/Repositories/SiteRepository.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Dapper; - -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Repositories.Interfaces; - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace KenticoInspector.Infrastructure.Repositories -{ - public class SiteRepository : ISiteRepository - { - public Site GetSite(Instance instance, int siteId) - { - throw new NotImplementedException(); - } - - public IList GetSites(Instance instance) - { - try - { - var query = @" - SELECT - SiteId as Id, - SiteName as Name, - SiteGUID as Guid, - SiteDomainName as DomainName, - SitePresentationURL as PresentationUrl - FROM CMS_Site"; - var connection = DatabaseHelper.GetSqlConnection(instance.DatabaseSettings); - var sites = connection.Query(query).ToList(); - - return sites; - } - catch - { - return new Site[] { }; - } - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/Services/CmsFileService.cs b/KenticoInspector.Infrastructure/Services/CmsFileService.cs deleted file mode 100644 index 82f4ae99..00000000 --- a/KenticoInspector.Infrastructure/Services/CmsFileService.cs +++ /dev/null @@ -1,34 +0,0 @@ -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Services.Interfaces; - -using System.Collections.Generic; -using System.Xml; - -namespace KenticoInspector.Core.Helpers -{ - public class CmsFileService : ICmsFileService - { - public Dictionary GetResourceStringsFromResx(string instanceRoot, string relativeResxFilePath = DefaultKenticoPaths.PrimaryResxFile) - { - var resourceXml = GetXmlDocument(instanceRoot, relativeResxFilePath); - var resourceStringNodes = resourceXml?.SelectNodes("/root/data"); - var results = new Dictionary(); - foreach (XmlNode resourceStringNode in resourceStringNodes) - { - var key = resourceStringNode.Attributes["name"].InnerText.ToLowerInvariant(); - var value = resourceStringNode.SelectSingleNode("./value").InnerText; - results.Add(key, value); - } - - return results; - } - - public XmlDocument GetXmlDocument(string instanceRoot, string relativeFilePath) - { - var xmlDocument = new XmlDocument(); - xmlDocument.Load(instanceRoot + relativeFilePath); - - return xmlDocument; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/Services/DatabaseService.cs b/KenticoInspector.Infrastructure/Services/DatabaseService.cs deleted file mode 100644 index 46d91e11..00000000 --- a/KenticoInspector.Infrastructure/Services/DatabaseService.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System.Collections.Generic; -using System.Data; -using System.Linq; - -using Dapper; - -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; - -namespace KenticoInspector.Infrastructure.Services -{ - public class DatabaseService : IDatabaseService - { - private IDbConnection _connection; - - public void Configure(DatabaseSettings databaseSettings) - { - _connection = DatabaseHelper.GetSqlConnection(databaseSettings); - } - - public IEnumerable ExecuteSqlFromFile(string relativeFilePath) - { - return ExecuteSqlFromFile(relativeFilePath, null, null); - } - - public IEnumerable ExecuteSqlFromFile(string relativeFilePath, dynamic parameters) - { - return ExecuteSqlFromFile(relativeFilePath, null, parameters); - } - - public IEnumerable ExecuteSqlFromFile(string relativeFilePath, IDictionary literalReplacements) - { - return ExecuteSqlFromFile(relativeFilePath, literalReplacements, null); - } - - public IEnumerable ExecuteSqlFromFile(string relativeFilePath, IDictionary literalReplacements, dynamic parameters) - { - var query = FileHelper.GetSqlQueryText(relativeFilePath, literalReplacements); - return _connection.Query(query, (object)parameters); - } - - public DataTable ExecuteSqlFromFileAsDataTable(string relativeFilePath) - { - var query = FileHelper.GetSqlQueryText(relativeFilePath); - var result = new DataTable(); - result.Load(_connection.ExecuteReader(query)); - return result; - } - - public IEnumerable> ExecuteSqlFromFileGeneric(string relativeFilePath) - { - return ExecuteSqlFromFileGeneric(relativeFilePath, null, null); - } - - public IEnumerable> ExecuteSqlFromFileGeneric(string relativeFilePath, dynamic parameters) - { - return ExecuteSqlFromFileGeneric(relativeFilePath, null, parameters); - } - - public IEnumerable> ExecuteSqlFromFileGeneric(string relativeFilePath, IDictionary literalReplacements) - { - return ExecuteSqlFromFileGeneric(relativeFilePath, literalReplacements, null); - } - - public IEnumerable> ExecuteSqlFromFileGeneric(string relativeFilePath, IDictionary literalReplacements, dynamic parameters) - { - var query = FileHelper.GetSqlQueryText(relativeFilePath, literalReplacements); - return _connection.Query(query, (object)parameters) - .Select(x => (IDictionary)x); - } - - public T ExecuteSqlFromFileScalar(string relativeFilePath) - { - return ExecuteSqlFromFileScalar(relativeFilePath, null, null); - } - - public T ExecuteSqlFromFileScalar(string relativeFilePath, dynamic parameters) - { - return ExecuteSqlFromFileScalar(relativeFilePath, null, parameters); - } - - public T ExecuteSqlFromFileScalar(string relativeFilePath, IDictionary literalReplacements) - { - return ExecuteSqlFromFileScalar(relativeFilePath, literalReplacements, null); - } - - public T ExecuteSqlFromFileScalar(string relativeFilePath, IDictionary literalReplacements, dynamic parameters) - { - var query = FileHelper.GetSqlQueryText(relativeFilePath, literalReplacements); - return _connection.QueryFirst(query, (object)parameters); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/Services/InstanceService.cs b/KenticoInspector.Infrastructure/Services/InstanceService.cs deleted file mode 100644 index ccb115c0..00000000 --- a/KenticoInspector.Infrastructure/Services/InstanceService.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.Collections.Generic; - -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Repositories.Interfaces; -using KenticoInspector.Core.Services.Interfaces; - -namespace KenticoInspector.Infrastructure.Services -{ - public class InstanceService : IInstanceService - { - private readonly IInstanceRepository _instanceRepository; - private readonly ISiteRepository _siteRepository; - private readonly IVersionRepository _versionRepository; - private readonly IDatabaseService _databaseService; - - public Instance CurrentInstance { get; private set; } - - public InstanceService( - IInstanceRepository instanceRepository, - IVersionRepository versionRepository, - ISiteRepository siteRepository, - IDatabaseService databaseService) - { - _instanceRepository = instanceRepository; - _versionRepository = versionRepository; - _siteRepository = siteRepository; - _databaseService = databaseService; - } - - public bool DeleteInstance(Guid instanceGuid) - { - return _instanceRepository.DeleteInstance(instanceGuid); - } - - public Instance GetInstance(Guid instanceGuid) - { - return _instanceRepository.GetInstance(instanceGuid); - } - - public Instance SetCurrentInstance(Guid instanceGuid) - { - CurrentInstance = _instanceRepository.GetInstance(instanceGuid); - - return CurrentInstance; - } - - public InstanceDetails GetInstanceDetails(Guid instanceGuid) - { - var instance = _instanceRepository.GetInstance(instanceGuid); - - return GetInstanceDetails(instance); - } - - public InstanceDetails GetInstanceDetails(Instance instance) - { - _databaseService.Configure(instance.DatabaseSettings); - - return new InstanceDetails - { - Guid = instance.Guid, - AdministrationVersion = _versionRepository.GetKenticoAdministrationVersion(instance), - DatabaseVersion = _versionRepository.GetKenticoDatabaseVersion(instance), - Sites = _siteRepository.GetSites(instance) - }; - } - - public IList GetInstances() - { - return _instanceRepository.GetInstances(); - } - - public Instance UpsertInstance(Instance instance) - { - return _instanceRepository.UpsertInstance(instance); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/Services/ModuleService.cs b/KenticoInspector.Infrastructure/Services/ModuleService.cs deleted file mode 100644 index adbaa954..00000000 --- a/KenticoInspector.Infrastructure/Services/ModuleService.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; - -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Modules; -using KenticoInspector.Core.Repositories.Interfaces; -using KenticoInspector.Core.Services.Interfaces; - -namespace KenticoInspector.Infrastructure.Services -{ - public class ModuleService : IModuleService - { - private readonly IDatabaseService databaseService; - private readonly IInstanceService instanceService; - private readonly IReportRepository reportRepository; - private readonly IActionRepository actionRepository; - - public ModuleService(IReportRepository reportRepository, IActionRepository actionRepository, IInstanceService instanceService, IDatabaseService databaseService) - { - this.reportRepository = reportRepository; - this.actionRepository = actionRepository; - this.instanceService = instanceService; - this.databaseService = databaseService; - } - - public ActionResults ExecuteAction(string codename, Guid instanceGuid, string optionsJson) - { - var action = actionRepository.GetAction(codename); - var instance = instanceService.SetCurrentInstance(instanceGuid); - databaseService.Configure(instance.DatabaseSettings); - - return action.Execute(optionsJson); - } - - public IAction GetAction(string codename) => actionRepository.GetAction(codename); - - public IEnumerable GetActions(Guid instanceGuid) - { - instanceService.SetCurrentInstance(instanceGuid); - return actionRepository.GetActions(); - } - - public IReport GetReport(string codename) => reportRepository.GetReport(codename); - - public ReportResults GetReportResults(string reportCodename, Guid instanceGuid) - { - var report = reportRepository.GetReport(reportCodename); - var instance = instanceService.SetCurrentInstance(instanceGuid); - - databaseService.Configure(instance.DatabaseSettings); - - return report.GetResults(); - } - - public IEnumerable GetReports(Guid instanceGuid) - { - instanceService.SetCurrentInstance(instanceGuid); - return reportRepository.GetReports(); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/editorconfig.txt b/KenticoInspector.Infrastructure/editorconfig.txt deleted file mode 100644 index 09c62a85..00000000 --- a/KenticoInspector.Infrastructure/editorconfig.txt +++ /dev/null @@ -1,1245 +0,0 @@ -root = true - -[*.cs] - -# ===== Active SonarLint rules ===== - -# [Category: Bug] -# S2757: "=+" should not be used instead of "+=" -dotnet_diagnostic.S2757.severity = warning - -# S3168: "async" methods should not return "void" -dotnet_diagnostic.S3168.severity = warning - -# S3397: "base.Equals" should not be used to check for reference equality in "Equals" if "base" is not "object" -dotnet_diagnostic.S3397.severity = warning - -# S1206: "Equals(Object)" and "GetHashCode()" should be overridden in pairs -dotnet_diagnostic.S1206.severity = warning - -# S2328: "GetHashCode" should not reference mutable fields -dotnet_diagnostic.S2328.severity = warning - -# S2997: "IDisposables" created in a "using" statement should not be returned -dotnet_diagnostic.S2997.severity = warning - -# S2930: "IDisposables" should be disposed -dotnet_diagnostic.S2930.severity = warning - -# S2688: "NaN" should not be used in comparisons -dotnet_diagnostic.S2688.severity = warning - -# S2995: "Object.ReferenceEquals" should not be used for value types -dotnet_diagnostic.S2995.severity = warning - -# S3869: "SafeHandle.DangerousGetHandle" should not be called -dotnet_diagnostic.S3869.severity = warning - -# S3456: "string.ToCharArray()" should not be called redundantly -dotnet_diagnostic.S3456.severity = warning - -# S2996: "ThreadStatic" fields should not be initialized -dotnet_diagnostic.S2996.severity = warning - -# S3005: "ThreadStatic" should not be used on non-static fields -dotnet_diagnostic.S3005.severity = warning - -# S2225: "ToString()" method should not return null -dotnet_diagnostic.S2225.severity = warning - -# S2251: A "for" loop update clause should move the counter in the right direction -dotnet_diagnostic.S2251.severity = warning - -# S3923: All branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S3923.severity = warning - -# S3244: Anonymous delegates should not be used to unsubscribe from Events -dotnet_diagnostic.S3244.severity = warning - -# S3343: Caller information parameters should come at the end of the parameter list -dotnet_diagnostic.S3343.severity = warning - -# S4583: Calls to delegate's method "BeginInvoke" should be paired with calls to "EndInvoke" -dotnet_diagnostic.S4583.severity = warning - -# S3249: Classes directly extending "object" should not call "base" in "GetHashCode" or "Equals" -dotnet_diagnostic.S3249.severity = warning - -# S3453: Classes should not have only "private" constructors -dotnet_diagnostic.S3453.severity = warning - -# S4143: Collection elements should not be replaced unconditionally -dotnet_diagnostic.S4143.severity = warning - -# S3981: Collection sizes and array length comparisons should make sense -dotnet_diagnostic.S3981.severity = warning - -# S2114: Collections should not be passed as arguments to their own methods -dotnet_diagnostic.S2114.severity = warning - -# S2275: Composite format strings should not lead to unexpected behavior at runtime -dotnet_diagnostic.S2275.severity = warning - -# S2583: Conditionally executed code should be reachable -dotnet_diagnostic.S2583.severity = warning - -# S3172: Delegates should not be subtracted -dotnet_diagnostic.S3172.severity = warning - -# S3926: Deserialization methods should be provided for "OptionalField" members -dotnet_diagnostic.S3926.severity = warning - -# S1048: Destructors should not throw exceptions -dotnet_diagnostic.S1048.severity = warning - -# S2761: Doubled prefix operators "!!" and "~~" should not be used -dotnet_diagnostic.S2761.severity = warning - -# S4158: Empty collections should not be accessed or iterated -dotnet_diagnostic.S4158.severity = warning - -# S3655: Empty nullable value should not be accessed -dotnet_diagnostic.S3655.severity = warning - -# S3984: Exceptions should not be created without being thrown -dotnet_diagnostic.S3984.severity = warning - -# S3346: Expressions used in "Debug.Assert" should not produce side effects -dotnet_diagnostic.S3346.severity = warning - -# S2345: Flags enumerations should explicitly initialize all their members -dotnet_diagnostic.S2345.severity = warning - -# S2252: For-loop conditions should be true at least once -dotnet_diagnostic.S2252.severity = warning - -# S4275: Getters and setters should access the expected fields -dotnet_diagnostic.S4275.severity = warning - -# S1764: Identical expressions should not be used on both sides of a binary operator -dotnet_diagnostic.S1764.severity = warning - -# S2183: Integral numbers should not be shifted by zero or more than their number of bits-1 -dotnet_diagnostic.S2183.severity = warning - -# S1751: Loops with at most one iteration should be refactored -dotnet_diagnostic.S1751.severity = warning - -# S3603: Methods with "Pure" attribute should return a value -dotnet_diagnostic.S3603.severity = warning - -# S3887: Mutable, non-private fields should not be "readonly" -dotnet_diagnostic.S3887.severity = warning - -# S3889: Neither "Thread.Resume" nor "Thread.Suspend" should be used -dotnet_diagnostic.S3889.severity = warning - -# S4586: Non-async "Task/Task" methods should not return null -dotnet_diagnostic.S4586.severity = warning - -# S2259: Null pointers should not be dereferenced -dotnet_diagnostic.S2259.severity = warning - -# S3610: Nullable type comparison should not be redundant -dotnet_diagnostic.S3610.severity = warning - -# S1848: Objects should not be created to be dropped immediately without being used -dotnet_diagnostic.S1848.severity = warning - -# S3598: One-way "OperationContract" methods should have "void" return type -dotnet_diagnostic.S3598.severity = warning - -# S3466: Optional parameters should be passed to "base" calls -dotnet_diagnostic.S3466.severity = warning - -# S2934: Property assignments should not be made for "readonly" fields not constrained to reference types -dotnet_diagnostic.S2934.severity = warning - -# S2190: Recursion should not be infinite -dotnet_diagnostic.S2190.severity = warning - -# S1862: Related "if/else if" statements should not have the same condition -dotnet_diagnostic.S1862.severity = warning - -# S2184: Results of integer division should not be assigned to floating point variables -dotnet_diagnostic.S2184.severity = warning - -# S2201: Return values from functions without side effects should not be ignored -dotnet_diagnostic.S2201.severity = warning - -# S3449: Right operands of shift operators should be integers -dotnet_diagnostic.S3449.severity = warning - -# S3927: Serialization event handlers should be implemented correctly -dotnet_diagnostic.S3927.severity = warning - -# S2551: Shared resources should not be used for locking -dotnet_diagnostic.S2551.severity = warning - -# S2857: SQL keywords should be delimited by whitespace -dotnet_diagnostic.S2857.severity = warning - -# S3263: Static fields should appear in the order they must be initialized -dotnet_diagnostic.S3263.severity = warning - -# S3464: Type inheritance should not be recursive -dotnet_diagnostic.S3464.severity = warning - -# S3903: Types should be defined in named namespaces -dotnet_diagnostic.S3903.severity = warning - -# S2123: Values should not be uselessly incremented -dotnet_diagnostic.S2123.severity = warning - -# S1656: Variables should not be self-assigned -dotnet_diagnostic.S1656.severity = warning - -# S2306: "async" and "await" should not be used as identifiers -dotnet_diagnostic.S2306.severity = warning - - -# [Category: Security] -# S3884: "CoSetProxyBlanket" and "CoInitializeSecurity" should not be used -dotnet_diagnostic.S3884.severity = warning - -# S2115: A secure password should be used when connecting to a database -dotnet_diagnostic.S2115.severity = warning - -# S5547: Cipher algorithms should be robust -dotnet_diagnostic.S5547.severity = warning - -# S3329: Cipher Block Chaining IVs should be unpredictable -dotnet_diagnostic.S3329.severity = warning - -# S5542: Encryption algorithms should be used with secure mode and padding scheme -dotnet_diagnostic.S5542.severity = warning - -# S5445: Insecure temporary file creation methods should not be used -dotnet_diagnostic.S5445.severity = warning - -# S5659: JWT should be signed and verified with strong cipher algorithms -dotnet_diagnostic.S5659.severity = warning - -# S4433: LDAP connections should be authenticated -dotnet_diagnostic.S4433.severity = warning - -# S4211: Members should not have conflicting transparency annotations -dotnet_diagnostic.S4211.severity = warning - -# S4423: Weak SSL/TLS protocols should not be used -dotnet_diagnostic.S4423.severity = warning - -# S2755: XML parsers should not be vulnerable to XXE attacks -dotnet_diagnostic.S2755.severity = warning - -# S2053: Hashes should include an unpredictable salt -dotnet_diagnostic.S2053.severity = warning - -# S4830: Server certificates should be verified during SSL/TLS connections -dotnet_diagnostic.S4830.severity = warning - -# S4426: Cryptographic keys should be robust -dotnet_diagnostic.S4426.severity = warning - -# S5773: Types allowed to be deserialized should be restricted -dotnet_diagnostic.S5773.severity = warning - - -# [Category: Security Hotspot] -# S5693: Allowing requests with excessive content length is security-sensitive -dotnet_diagnostic.S5693.severity = warning - -# S4792: Configuring loggers is security-sensitive -dotnet_diagnostic.S4792.severity = warning - -# S3330: Creating cookies without the "HttpOnly" flag is security-sensitive -dotnet_diagnostic.S3330.severity = warning - -# S2092: Creating cookies without the "secure" flag is security-sensitive -dotnet_diagnostic.S2092.severity = warning - -# S4507: Delivering code in production with debug features activated is security-sensitive -dotnet_diagnostic.S4507.severity = warning - -# S5766: Deserializing objects without performing data validation is security-sensitive -dotnet_diagnostic.S5766.severity = warning - -# S5753: Disabling ASP.NET "Request Validation" feature is security-sensitive -dotnet_diagnostic.S5753.severity = warning - -# S4502: Disabling CSRF protections is security-sensitive -dotnet_diagnostic.S4502.severity = warning - -# S5042: Expanding archive files without controlling resource consumption is security-sensitive -dotnet_diagnostic.S5042.severity = warning - -# S2077: Formatting SQL queries is security-sensitive -dotnet_diagnostic.S2077.severity = warning - -# S2068: Hard-coded credentials are security-sensitive -dotnet_diagnostic.S2068.severity = warning - -# S5122: Having a permissive Cross-Origin Resource Sharing policy is security-sensitive -dotnet_diagnostic.S5122.severity = warning - -# S4036: Searching OS commands in PATH is security-sensitive -dotnet_diagnostic.S4036.severity = warning - -# S2612: Setting loose file permissions is security-sensitive -dotnet_diagnostic.S2612.severity = warning - -# S5332: Using clear-text protocols is security-sensitive -dotnet_diagnostic.S5332.severity = warning - -# S1313: Using hardcoded IP addresses is security-sensitive -dotnet_diagnostic.S1313.severity = warning - -# S2257: Using non-standard cryptographic algorithms is security-sensitive -dotnet_diagnostic.S2257.severity = warning - -# S2245: Using pseudorandom number generators (PRNGs) is security-sensitive -dotnet_diagnostic.S2245.severity = warning - -# S5443: Using publicly writable directories is security-sensitive -dotnet_diagnostic.S5443.severity = warning - -# S4790: Using weak hashing algorithms is security-sensitive -dotnet_diagnostic.S4790.severity = warning - - -# [Category: Code Smell] -# S3451: "[DefaultValue]" should not be used when "[DefaultParameterValue]" is meant -dotnet_diagnostic.S3451.severity = warning - -# S3447: "[Optional]" should not be used on "ref" or "out" parameters -dotnet_diagnostic.S3447.severity = warning - -# S1155: "Any()" should be used to test for emptiness -dotnet_diagnostic.S1155.severity = warning - -# S2737: "catch" clauses should do more than rethrow -dotnet_diagnostic.S2737.severity = warning - -# S4524: "default" clauses should be first or last -dotnet_diagnostic.S4524.severity = warning - -# S3217: "Explicit" conversions of "foreach" loops should not be used -dotnet_diagnostic.S3217.severity = warning - -# S3971: "GC.SuppressFinalize" should not be called -dotnet_diagnostic.S3971.severity = warning - -# S907: "goto" statement should not be used -dotnet_diagnostic.S907.severity = warning - -# S2692: "IndexOf" checks should not be for positive numbers -dotnet_diagnostic.S2692.severity = warning - -# S3060: "is" should not be used with "this" -dotnet_diagnostic.S3060.severity = warning - -# S1123: "Obsolete" attributes should include explanations -dotnet_diagnostic.S1123.severity = warning - -# S4214: "P/Invoke" methods should not be visible -dotnet_diagnostic.S4214.severity = warning - -# S4061: "params" should be used instead of "varargs" -dotnet_diagnostic.S4061.severity = warning - -# S3262: "params" should be used on overrides -dotnet_diagnostic.S3262.severity = warning - -# S3600: "params" should not be introduced on overrides -dotnet_diagnostic.S3600.severity = warning - -# S3597: "ServiceContract" and "OperationContract" attributes should be used together -dotnet_diagnostic.S3597.severity = warning - -# S3963: "static" fields should be initialized inline -dotnet_diagnostic.S3963.severity = warning - -# S3256: "string.IsNullOrEmpty" should be used -dotnet_diagnostic.S3256.severity = warning - -# S1479: "switch" statements should not have too many "case" clauses -dotnet_diagnostic.S1479.severity = warning - -# S5034: "ValueTask" should be consumed correctly -dotnet_diagnostic.S5034.severity = warning - -# S1264: A "while" loop should be used instead of a "for" loop -dotnet_diagnostic.S1264.severity = warning - -# S3973: A conditionally executed single line should be denoted by indentation -dotnet_diagnostic.S3973.severity = warning - -# S3904: Assemblies should have version information -dotnet_diagnostic.S3904.severity = warning - -# S3415: Assertion arguments should be passed in the correct order -dotnet_diagnostic.S3415.severity = warning - -# S4019: Base class methods should not be hidden -dotnet_diagnostic.S4019.severity = warning - -# S1940: Boolean checks should not be inverted -dotnet_diagnostic.S1940.severity = warning - -# S3236: Caller information arguments should not be provided explicitly -dotnet_diagnostic.S3236.severity = warning - -# S3897: Classes that provide "Equals()" should implement "IEquatable" -dotnet_diagnostic.S3897.severity = warning - -# S3457: Composite format strings should be used correctly -dotnet_diagnostic.S3457.severity = warning - -# S3972: Conditionals should start on new lines -dotnet_diagnostic.S3972.severity = warning - -# S1116: Empty statements should be removed -dotnet_diagnostic.S1116.severity = warning - -# S3264: Events should be invoked -dotnet_diagnostic.S3264.severity = warning - -# S3445: Exceptions should not be explicitly rethrown -dotnet_diagnostic.S3445.severity = warning - -# S1163: Exceptions should not be thrown in finally blocks -dotnet_diagnostic.S1163.severity = warning - -# S2290: Field-like events should not be virtual -dotnet_diagnostic.S2290.severity = warning - -# S2346: Flags enumerations zero-value members should be named "warning" -dotnet_diagnostic.S2346.severity = warning - -# S3251: Implementations should be provided for "partial" methods -dotnet_diagnostic.S3251.severity = warning - -# S1944: Inappropriate casts should not be made -dotnet_diagnostic.S1944.severity = warning - -# S4015: Inherited member visibility should not be decreased -dotnet_diagnostic.S4015.severity = warning - -# S3444: Interfaces should not simply inherit from base interfaces with colliding members -dotnet_diagnostic.S3444.severity = warning - -# S818: Literal suffixes should be upper case -dotnet_diagnostic.S818.severity = warning - -# S3400: Methods should not return constants -dotnet_diagnostic.S3400.severity = warning - -# S2681: Multiline blocks should be enclosed in curly braces -dotnet_diagnostic.S2681.severity = warning - -# S3169: Multiple "OrderBy" calls should not be used -dotnet_diagnostic.S3169.severity = warning - -# S3261: Namespaces should not be empty -dotnet_diagnostic.S3261.severity = warning - -# S4200: Native methods should be wrapped -dotnet_diagnostic.S4200.severity = warning - -# S1199: Nested code blocks should not be used -dotnet_diagnostic.S1199.severity = warning - -# S4070: Non-flags enums should not be marked with "FlagsAttribute" -dotnet_diagnostic.S4070.severity = warning - -# S3265: Non-flags enums should not be used in bitwise operations -dotnet_diagnostic.S3265.severity = warning - -# S4201: Null checks should not be used with "is" -dotnet_diagnostic.S4201.severity = warning - -# S3966: Objects should not be disposed more than once -dotnet_diagnostic.S3966.severity = warning - -# S2291: Overflow checking should not be disabled for "Enumerable.Sum" -dotnet_diagnostic.S2291.severity = warning - -# S1185: Overriding members should do more than simply call the same member in the base class -dotnet_diagnostic.S1185.severity = warning - -# S2234: Parameters should be passed in the correct order -dotnet_diagnostic.S2234.severity = warning - -# S3450: Parameters with "[DefaultParameterValue]" attributes should also be marked "[Optional]" -dotnet_diagnostic.S3450.severity = warning - -# S1905: Redundant casts should not be used -dotnet_diagnostic.S1905.severity = warning - -# S1110: Redundant pairs of parentheses should be removed -dotnet_diagnostic.S1110.severity = warning - -# S2437: Silly bit operations should not be performed -dotnet_diagnostic.S2437.severity = warning - -# S3010: Static fields should not be updated in constructors -dotnet_diagnostic.S3010.severity = warning - -# S4635: String offset-based methods should be preferred for finding substrings from offsets -dotnet_diagnostic.S4635.severity = warning - -# S3998: Threads should not lock on objects with weak identity -dotnet_diagnostic.S3998.severity = warning - -# S1134: Track uses of "FIXME" tags -dotnet_diagnostic.S1134.severity = warning - -# S1135: Track uses of "TODO" tags -dotnet_diagnostic.S1135.severity = warning - -# S1871: Two branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S1871.severity = warning - -# S3443: Type should not be examined on "System.Type" instances -dotnet_diagnostic.S3443.severity = warning - -# S3459: Unassigned members should be removed -dotnet_diagnostic.S3459.severity = warning - -# S3440: Variables should not be checked against the values they're about to be assigned -dotnet_diagnostic.S3440.severity = warning - -# S2479: Whitespace and control characters in string literals should be explicit -dotnet_diagnostic.S2479.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S3442: "abstract" classes should not have "public" constructors -dotnet_diagnostic.S3442.severity = warning - -# S3885: "Assembly.Load" should be used -dotnet_diagnostic.S3885.severity = warning - -# S1210: "Equals" and the comparison operators should be overridden when implementing "IComparable" -dotnet_diagnostic.S1210.severity = warning - -# S1215: "GC.Collect" should not be called -dotnet_diagnostic.S1215.severity = warning - -# S3881: "IDisposable" should be implemented correctly -dotnet_diagnostic.S3881.severity = warning - -# S2971: "IEnumerable" LINQs should be simplified -dotnet_diagnostic.S2971.severity = warning - -# S3925: "ISerializable" should be implemented correctly -dotnet_diagnostic.S3925.severity = warning - -# S4581: "new Guid()" should not be used -dotnet_diagnostic.S4581.severity = warning - -# S3875: "operator==" should not be overloaded on reference types -dotnet_diagnostic.S3875.severity = warning - -# S3237: "value" parameters should be used -dotnet_diagnostic.S3237.severity = warning - -# S1121: Assignments should not be made from within sub-expressions -dotnet_diagnostic.S1121.severity = warning - -# S3376: Attribute, EventArgs, and Exception type names should end with the type being extended -dotnet_diagnostic.S3376.severity = warning - -# S2589: Boolean expressions should not be gratuitous -dotnet_diagnostic.S2589.severity = warning - -# S4035: Classes implementing "IEquatable" should be sealed -dotnet_diagnostic.S4035.severity = warning - -# S3776: Cognitive Complexity of methods should not be too high -dotnet_diagnostic.S3776.severity = warning - -# S1066: Collapsible "if" statements should be merged -dotnet_diagnostic.S1066.severity = warning - -# S1699: Constructors should only call non-overridable methods -dotnet_diagnostic.S1699.severity = warning - -# S2372: Exceptions should not be thrown from property getters -dotnet_diagnostic.S2372.severity = warning - -# S3877: Exceptions should not be thrown from unexpected methods -dotnet_diagnostic.S3877.severity = warning - -# S1104: Fields should not have public accessibility -dotnet_diagnostic.S1104.severity = warning - -# S2933: Fields that are only assigned in the constructor should be "readonly" -dotnet_diagnostic.S2933.severity = warning - -# S112: General exceptions should never be thrown -dotnet_diagnostic.S112.severity = warning - -# S2486: Generic exceptions should not be ignored -dotnet_diagnostic.S2486.severity = warning - -# S3246: Generic type parameters should be co/contravariant when possible -dotnet_diagnostic.S3246.severity = warning - -# S1939: Inheritance list should not be redundant -dotnet_diagnostic.S1939.severity = warning - -# S110: Inheritance tree of classes should not be too deep -dotnet_diagnostic.S110.severity = warning - -# S3218: Inner class members should not shadow outer class "static" or type members -dotnet_diagnostic.S3218.severity = warning - -# S2696: Instance members should not write to "static" fields -dotnet_diagnostic.S2696.severity = warning - -# S3626: Jump statements should not be redundant -dotnet_diagnostic.S3626.severity = warning - -# S1117: Local variables should not shadow class fields -dotnet_diagnostic.S1117.severity = warning - -# S3267: Loops should be simplified with "LINQ" expressions -dotnet_diagnostic.S3267.severity = warning - -# S3604: Member initializer values should not be redundant -dotnet_diagnostic.S3604.severity = warning - -# S3220: Method calls should not resolve ambiguously to overloads with "params" -dotnet_diagnostic.S3220.severity = warning - -# S4136: Method overloads should be grouped together -dotnet_diagnostic.S4136.severity = warning - -# S3427: Method overloads with default parameter values should not overlap -dotnet_diagnostic.S3427.severity = warning - -# S1006: Method overrides should not change parameter defaults -dotnet_diagnostic.S1006.severity = warning - -# S2953: Methods named "Dispose" should implement "IDisposable.Dispose" -dotnet_diagnostic.S2953.severity = warning - -# S1186: Methods should not be empty -dotnet_diagnostic.S1186.severity = warning - -# S4144: Methods should not have identical implementations -dotnet_diagnostic.S4144.severity = warning - -# S107: Methods should not have too many parameters -dotnet_diagnostic.S107.severity = warning - -# S3241: Methods should not return values that are never used -dotnet_diagnostic.S3241.severity = warning - -# S2386: Mutable fields should not be "public static" -dotnet_diagnostic.S2386.severity = warning - -# S108: Nested blocks of code should not be left empty -dotnet_diagnostic.S108.severity = warning - -# S2223: Non-constant static fields should not be visible -dotnet_diagnostic.S2223.severity = warning - -# S3260: Non-derived "private" classes and records should be "sealed" -dotnet_diagnostic.S3260.severity = warning - -# S927: Parameter names should match base declaration and other partial definitions -dotnet_diagnostic.S927.severity = warning - -# S3928: Parameter names used into ArgumentException constructors should match an existing one -dotnet_diagnostic.S3928.severity = warning - -# S4457: Parameter validation in "async"/"await" methods should be wrapped -dotnet_diagnostic.S4457.severity = warning - -# S4456: Parameter validation in yielding methods should be wrapped -dotnet_diagnostic.S4456.severity = warning - -# S1450: Private fields only used as local variables in methods should become local variables -dotnet_diagnostic.S1450.severity = warning - -# S2365: Properties should not make collection or array copies -dotnet_diagnostic.S2365.severity = warning - -# S2368: Public methods should not have multidimensional array parameters -dotnet_diagnostic.S2368.severity = warning - -# S3011: Reflection should not be used to increase accessibility of classes, methods, or fields -dotnet_diagnostic.S3011.severity = warning - -# S2219: Runtime type checking should be simplified -dotnet_diagnostic.S2219.severity = warning - -# S125: Sections of code should not be commented out -dotnet_diagnostic.S125.severity = warning - -# S2178: Short-circuit logic should be used in boolean contexts -dotnet_diagnostic.S2178.severity = warning - -# S2743: Static fields should not be used in generic types -dotnet_diagnostic.S2743.severity = warning - -# S1643: Strings should not be concatenated using '+' in a loop -dotnet_diagnostic.S1643.severity = warning - -# S3358: Ternary operators should not be nested -dotnet_diagnostic.S3358.severity = warning - -# S3433: Test method signatures should be correct -dotnet_diagnostic.S3433.severity = warning - -# S2187: TestCases should contain tests -dotnet_diagnostic.S2187.severity = warning - -# S2699: Tests should include assertions -dotnet_diagnostic.S2699.severity = warning - -# S1607: Tests should not be ignored -dotnet_diagnostic.S1607.severity = warning - -# S2292: Trivial properties should be auto-implemented -dotnet_diagnostic.S2292.severity = warning - -# S2436: Types and methods should not have too many generic parameters -dotnet_diagnostic.S2436.severity = warning - -# S101: Types should be named in PascalCase -dotnet_diagnostic.S101.severity = warning - -# S4487: Unread "private" fields should be removed -dotnet_diagnostic.S4487.severity = warning - -# S1854: Unused assignments should be removed -dotnet_diagnostic.S1854.severity = warning - -# S1481: Unused local variables should be removed -dotnet_diagnostic.S1481.severity = warning - -# S1172: Unused method parameters should be removed -dotnet_diagnostic.S1172.severity = warning - -# S1144: Unused private types or members should be removed -dotnet_diagnostic.S1144.severity = warning - -# S2326: Unused type parameters should be removed -dotnet_diagnostic.S2326.severity = warning - -# S1075: URIs should not be hardcoded -dotnet_diagnostic.S1075.severity = warning - -# S1118: Utility classes should not have public constructors -dotnet_diagnostic.S1118.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S1125: Boolean literals should not be redundant -dotnet_diagnostic.S1125.severity = warning - - -# ===== Inactive SonarLint rules (must be explicitly turned off) ===== - -# [Category: Bug] (All these are excluded because they're not applicable to our solution) -# S4428: "PartCreationPolicyAttribute" should be used with "ExportAttribute" -dotnet_diagnostic.S4428.severity = none - -# S4260: "ConstructorArgument" parameters should exist in constructors -dotnet_diagnostic.S4260.severity = none - -# S4277: "Shared" parts should not be created with "new" -dotnet_diagnostic.S4277.severity = none - -# S4159: Classes should implement their "ExportAttribute" interfaces -dotnet_diagnostic.S4159.severity = none - -# S4210: Windows Forms entry points should be marked with STAThread -dotnet_diagnostic.S4210.severity = none - - -# [Uncategorized] -# S6287: HTTP responses should not be vulnerable to session fixation -dotnet_diagnostic.S6287.severity = none - -# S6096: Extracting archives should not lead to zip slip vulnerabilities -dotnet_diagnostic.S6096.severity = none - -# S5334: Dynamic code execution should not be vulnerable to injection attacks -dotnet_diagnostic.S5334.severity = none - -# S5146: HTTP request redirections should not be open to forging attacks -dotnet_diagnostic.S5146.severity = none - -# S5135: Deserialization should not be vulnerable to injection attacks -dotnet_diagnostic.S5135.severity = none - -# S5131: Endpoints should not be vulnerable to reflected cross-site scripting (XSS) attacks -dotnet_diagnostic.S5131.severity = none - -# S3649: Database queries should not be vulnerable to injection attacks -dotnet_diagnostic.S3649.severity = none - -# S2091: XPath expressions should not be vulnerable to injection attacks -dotnet_diagnostic.S2091.severity = none - -# S2083: I/O function calls should not be vulnerable to path injection attacks -dotnet_diagnostic.S2083.severity = none - -# S2078: LDAP queries should not be vulnerable to injection attacks -dotnet_diagnostic.S2078.severity = none - -# S2076: OS commands should not be vulnerable to command injection attacks -dotnet_diagnostic.S2076.severity = none - -# S6424: Azure Functions: Restrictions on entity interfaces -dotnet_diagnostic.S6424.severity = none - -# S6422: Calls to "async" methods should not be blocking in Azure Functions -dotnet_diagnostic.S6422.severity = none - -# S2631: Regular expressions should not be vulnerable to Denial of Service attacks -dotnet_diagnostic.S2631.severity = none - -# S2222: Locks should be released -dotnet_diagnostic.S2222.severity = none - -# S5144: Server-side requests should not be vulnerable to forging attacks -dotnet_diagnostic.S5144.severity = none - -# S6350: Constructing arguments of system commands from user input is security-sensitive -dotnet_diagnostic.S6350.severity = none - -# S6420: Reuse client instances rather than creating new ones with each Azure Function invocation -dotnet_diagnostic.S6420.severity = none - -# S6419: Azure Functions should be stateless -dotnet_diagnostic.S6419.severity = none - -# S5883: OS commands should not be vulnerable to argument injection attacks -dotnet_diagnostic.S5883.severity = none - -# S5145: Logging should not be vulnerable to injection attacks -dotnet_diagnostic.S5145.severity = none - -# S2931: Classes with "IDisposable" members should implement "IDisposable" -dotnet_diagnostic.S2931.severity = none - -# S4462: Calls to "async" methods should not be blocking -dotnet_diagnostic.S4462.severity = none - -# S2387: Child class fields should not shadow parent class fields -dotnet_diagnostic.S2387.severity = none - -# S1451: Track lack of copyright and license headers -dotnet_diagnostic.S1451.severity = none - -# S1147: Exit methods should not be called -dotnet_diagnostic.S1147.severity = none - -# S2952: Classes should "Dispose" of members from the classes' own "Dispose" methods -dotnet_diagnostic.S2952.severity = none - -# S4829: Reading the Standard Input is security-sensitive -dotnet_diagnostic.S4829.severity = none - -# S4823: Using command line arguments is security-sensitive -dotnet_diagnostic.S4823.severity = none - -# S4818: Using Sockets is security-sensitive -dotnet_diagnostic.S4818.severity = none - -# S4787: Encrypting data is security-sensitive -dotnet_diagnostic.S4787.severity = none - -# S4784: Using regular expressions is security-sensitive -dotnet_diagnostic.S4784.severity = none - -# S4039: Interface methods should be callable by derived types -dotnet_diagnostic.S4039.severity = none - -# S4025: Child class fields should not differ from parent class fields only by capitalization -dotnet_diagnostic.S4025.severity = none - -# S4000: Pointers to unmanaged memory should not be visible -dotnet_diagnostic.S4000.severity = none - -# S3937: Number patterns should be regular -dotnet_diagnostic.S3937.severity = none - -# S3874: "out" and "ref" parameters should not be used -dotnet_diagnostic.S3874.severity = none - -# S3353: Unchanged local variables should be "const" -dotnet_diagnostic.S3353.severity = none - -# S3216: "ConfigureAwait(false)" should be used -dotnet_diagnostic.S3216.severity = none - -# S3215: "interface" instances should not be cast to concrete types -dotnet_diagnostic.S3215.severity = none - -# S2701: Literal boolean values should not be used in assertions -dotnet_diagnostic.S2701.severity = none - -# S2360: Optional parameters should not be used -dotnet_diagnostic.S2360.severity = none - -# S2339: Public constant members should not be used -dotnet_diagnostic.S2339.severity = none - -# S2330: Array covariance should not be used -dotnet_diagnostic.S2330.severity = none - -# S2302: "nameof" should be used -dotnet_diagnostic.S2302.severity = none - -# S2197: Modulus results should not be checked for direct equality -dotnet_diagnostic.S2197.severity = none - -# S1994: "for" loop increment clauses should modify the loops' counters -dotnet_diagnostic.S1994.severity = none - -# S1821: "switch" statements should not be nested -dotnet_diagnostic.S1821.severity = none - -# S1541: Methods and properties should not be too complex -dotnet_diagnostic.S1541.severity = none - -# S134: Control flow statements "if", "switch", "for", "foreach", "while", "do" and "try" should not be nested too deeply -dotnet_diagnostic.S134.severity = none - -# S131: "switch/Select" statements should contain a "default/Case Else" clauses -dotnet_diagnostic.S131.severity = none - -# S126: "if ... else if" constructs should end with "else" clauses -dotnet_diagnostic.S126.severity = none - -# S121: Control structures should use curly braces -dotnet_diagnostic.S121.severity = none - -# S1067: Expressions should not be too complex -dotnet_diagnostic.S1067.severity = none - -# S4564: ASP.NET HTTP request validation feature should not be disabled -dotnet_diagnostic.S4564.severity = none - -# S4212: Serialization constructors should be secured -dotnet_diagnostic.S4212.severity = none - -# S3949: Calculations should not overflow -dotnet_diagnostic.S3949.severity = none - -# S1244: Floating point numbers should not be tested for equality -dotnet_diagnostic.S1244.severity = none - -# S881: Increment (++) and decrement (--) operators should not be used in a method call or mixed with other operators in an expression -dotnet_diagnostic.S881.severity = none - -# S6423: Azure Functions should log all failures -dotnet_diagnostic.S6423.severity = none - -# S6421: Azure Functions should use Structured Error Handling -dotnet_diagnostic.S6421.severity = none - -# S6354: Use a testable date/time provider -dotnet_diagnostic.S6354.severity = none - -# S4059: Property names should not match get methods -dotnet_diagnostic.S4059.severity = none - -# S4057: Locales should be set for data types -dotnet_diagnostic.S4057.severity = none - -# S4055: Literals should not be passed as localized parameters -dotnet_diagnostic.S4055.severity = none - -# S4050: Operators should be overloaded consistently -dotnet_diagnostic.S4050.severity = none - -# S4017: Method signatures should not contain nested generic types -dotnet_diagnostic.S4017.severity = none - -# S4016: Enumeration members should not be named "Reserved" -dotnet_diagnostic.S4016.severity = none - -# S4005: "System.Uri" arguments should be used instead of strings -dotnet_diagnostic.S4005.severity = none - -# S4004: Collection properties should be readonly -dotnet_diagnostic.S4004.severity = none - -# S4002: Disposable types should declare finalizers -dotnet_diagnostic.S4002.severity = none - -# S3997: String URI overloads should call "System.Uri" overloads -dotnet_diagnostic.S3997.severity = none - -# S3996: URI properties should not be strings -dotnet_diagnostic.S3996.severity = none - -# S3995: URI return values should not be strings -dotnet_diagnostic.S3995.severity = none - -# S3994: URI Parameters should not be strings -dotnet_diagnostic.S3994.severity = none - -# S3993: Custom attributes should be marked with "System.AttributeUsageAttribute" -dotnet_diagnostic.S3993.severity = none - -# S3992: Assemblies should explicitly specify COM visibility -dotnet_diagnostic.S3992.severity = none - -# S3990: Assemblies should be marked as CLS compliant -dotnet_diagnostic.S3990.severity = none - -# S3956: "Generic.List" instances should not be part of public APIs -dotnet_diagnostic.S3956.severity = none - -# S3909: Collections should implement the generic interface -dotnet_diagnostic.S3909.severity = none - -# S3908: Generic event handlers should be used -dotnet_diagnostic.S3908.severity = none - -# S3906: Event Handlers should have the correct signature -dotnet_diagnostic.S3906.severity = none - -# S3902: "Assembly.GetExecutingAssembly" should not be called -dotnet_diagnostic.S3902.severity = none - -# S3900: Arguments of public methods should be validated against null -dotnet_diagnostic.S3900.severity = none - -# S3898: Value types should implement "IEquatable" -dotnet_diagnostic.S3898.severity = none - -# S3880: Finalizers should not be empty -dotnet_diagnostic.S3880.severity = none - -# S3431: "[ExpectedException]" should not be used -dotnet_diagnostic.S3431.severity = none - -# S3366: "this" should not be exposed from constructors -dotnet_diagnostic.S3366.severity = none - -# S3059: Types should not have members with visibility set higher than the type's visibility -dotnet_diagnostic.S3059.severity = none - -# S2357: Fields should be private -dotnet_diagnostic.S2357.severity = none - -# S2327: "try" statements with identical "catch" and/or "finally" blocks should be merged -dotnet_diagnostic.S2327.severity = none - -# S1696: NullReferenceException should not be caught -dotnet_diagnostic.S1696.severity = none - -# S138: Functions should not have too many lines of code -dotnet_diagnostic.S138.severity = none - -# S127: "for" loop stop conditions should be invariant -dotnet_diagnostic.S127.severity = none - -# S122: Statements should be on separate lines -dotnet_diagnostic.S122.severity = none - -# S1200: Classes should not be coupled to too many other classes (Single Responsibility Principle) -dotnet_diagnostic.S1200.severity = none - -# S1151: "switch case" clauses should not have too many lines of code -dotnet_diagnostic.S1151.severity = none - -# S109: Magic numbers should not be used -dotnet_diagnostic.S109.severity = none - -# S106: Standard outputs should not be used directly to log anything -dotnet_diagnostic.S106.severity = none - -# S104: Files should not have too many lines of code -dotnet_diagnostic.S104.severity = none - -# S103: Lines should not be too long -dotnet_diagnostic.S103.severity = none - -# S5167: HTTP response headers should not be vulnerable to injection attacks -dotnet_diagnostic.S5167.severity = none - -# S2228: Console logging should not be used -dotnet_diagnostic.S2228.severity = none - -# S2955: Generic parameters not constrained to reference types should not be compared to "null" -dotnet_diagnostic.S2955.severity = none - -# S2674: The length returned from a stream read should be checked -dotnet_diagnostic.S2674.severity = none - -# S1226: Method parameters, caught exceptions and foreach variables' initial values should not be ignored -dotnet_diagnostic.S1226.severity = none - -# S4834: Controlling permissions is security-sensitive -dotnet_diagnostic.S4834.severity = none - -# S2255: Writing cookies is security-sensitive -dotnet_diagnostic.S2255.severity = none - -# S4261: Methods should be named according to their synchronicities -dotnet_diagnostic.S4261.severity = none - -# S4226: Extensions should be in separate namespaces -dotnet_diagnostic.S4226.severity = none - -# S4225: Extension methods should not extend "object" -dotnet_diagnostic.S4225.severity = none - -# S4069: Operator overloads should have named alternatives -dotnet_diagnostic.S4069.severity = none - -# S4060: Non-abstract attributes should be sealed -dotnet_diagnostic.S4060.severity = none - -# S4058: Overloads with a "StringComparison" parameter should be used -dotnet_diagnostic.S4058.severity = none - -# S4056: Overloads with a "CultureInfo" or an "IFormatProvider" parameter should be used -dotnet_diagnostic.S4056.severity = none - -# S4052: Types should not extend outdated base types -dotnet_diagnostic.S4052.severity = none - -# S4049: Properties should be preferred -dotnet_diagnostic.S4049.severity = none - -# S4047: Generics should be used when appropriate -dotnet_diagnostic.S4047.severity = none - -# S4041: Type names should not match namespaces -dotnet_diagnostic.S4041.severity = none - -# S4040: Strings should be normalized to uppercase -dotnet_diagnostic.S4040.severity = none - -# S4027: Exceptions should provide standard constructors -dotnet_diagnostic.S4027.severity = none - -# S4026: Assemblies should be marked with "NeutralResourcesLanguageAttribute" -dotnet_diagnostic.S4026.severity = none - -# S4023: Interfaces should not be empty -dotnet_diagnostic.S4023.severity = none - -# S4022: Enumerations should have "Int32" storage -dotnet_diagnostic.S4022.severity = none - -# S4018: Generic methods should provide type parameters -dotnet_diagnostic.S4018.severity = none - -# S3967: Multidimensional arrays should not be used -dotnet_diagnostic.S3967.severity = none - -# S3962: "static readonly" constants should be "const" instead -dotnet_diagnostic.S3962.severity = none - -# S3876: Strings or integral types should be used for indexers -dotnet_diagnostic.S3876.severity = none - -# S3872: Parameter names should not duplicate the names of their methods -dotnet_diagnostic.S3872.severity = none - -# S3717: Track use of "NotImplementedException" -dotnet_diagnostic.S3717.severity = none - -# S3532: Empty "default" clauses should be removed -dotnet_diagnostic.S3532.severity = none - -# S3441: Redundant property names should be omitted in anonymous classes -dotnet_diagnostic.S3441.severity = none - -# S3257: Declarations and initializations should be as concise as possible -dotnet_diagnostic.S3257.severity = none - -# S3254: Default parameter values should not be passed as arguments -dotnet_diagnostic.S3254.severity = none - -# S3253: Constructor and destructor declarations should not be redundant -dotnet_diagnostic.S3253.severity = none - -# S3242: Method parameters should be declared with base types -dotnet_diagnostic.S3242.severity = none - -# S3240: The simplest possible condition syntax should be used -dotnet_diagnostic.S3240.severity = none - -# S3235: Redundant parentheses should not be used -dotnet_diagnostic.S3235.severity = none - -# S3234: "GC.SuppressFinalize" should not be invoked for types without destructors -dotnet_diagnostic.S3234.severity = none - -# S3052: Members should not be initialized to default values -dotnet_diagnostic.S3052.severity = none - -# S2760: Sequential tests should not check the same condition -dotnet_diagnostic.S2760.severity = none - -# S2333: Redundant modifiers should not be used -dotnet_diagnostic.S2333.severity = none - -# S2325: Methods and properties that don't access instance data should be static -dotnet_diagnostic.S2325.severity = none - -# S2221: "Exception" should not be caught when not required by called methods -dotnet_diagnostic.S2221.severity = none - -# S2156: "sealed" classes should not have "protected" members -dotnet_diagnostic.S2156.severity = none - -# S2148: Underscores should be used to make large numbers readable -dotnet_diagnostic.S2148.severity = none - -# S1858: "ToString()" calls should not be redundant -dotnet_diagnostic.S1858.severity = none - -# S1698: "=" should not be used when "Equals" is overridden -dotnet_diagnostic.S1698.severity = none - -# S1694: An abstract class should have both abstract and concrete methods -dotnet_diagnostic.S1694.severity = none - -# S1659: Multiple variables should not be declared on the same line -dotnet_diagnostic.S1659.severity = none - -# S1449: Culture should be specified for "string" operations -dotnet_diagnostic.S1449.severity = none - -# S1301: "switch" statements should have at least 3 "case" clauses -dotnet_diagnostic.S1301.severity = none - -# S1227: break statements should not be used except for switch cases -dotnet_diagnostic.S1227.severity = none - -# S1192: String literals should not be duplicated -dotnet_diagnostic.S1192.severity = none - -# S113: Files should contain an empty newline at the end -dotnet_diagnostic.S113.severity = none - -# S1128: Unused "using" should be removed -dotnet_diagnostic.S1128.severity = none - -# S1109: A close curly brace should be located at the beginning of a line -dotnet_diagnostic.S1109.severity = none - -# S105: Tabulation characters should not be used -dotnet_diagnostic.S105.severity = none - -# S100: Methods and properties should be named in PascalCase -dotnet_diagnostic.S100.severity = none - -# S1309: Track uses of in-source issue suppressions -dotnet_diagnostic.S1309.severity = none \ No newline at end of file diff --git a/KenticoInspector.Reports.Tests/ClassTableValidationTests.cs b/KenticoInspector.Reports.Tests/ClassTableValidationTests.cs deleted file mode 100644 index ff754383..00000000 --- a/KenticoInspector.Reports.Tests/ClassTableValidationTests.cs +++ /dev/null @@ -1,121 +0,0 @@ -using KenticoInspector.Core.Constants; -using KenticoInspector.Reports.ClassTableValidation; -using KenticoInspector.Reports.ClassTableValidation.Models; - -using NUnit.Framework; - -using System.Collections.Generic; - -namespace KenticoInspector.Reports.Tests -{ - [TestFixture(10)] - [TestFixture(11)] - [TestFixture(12)] - [TestFixture(13)] - public class ClassTableValidationTests : AbstractReportTest - { - private readonly Report _mockReport; - - public ClassTableValidationTests(int majorVersion) : base(majorVersion) - { - _mockReport = new Report(_mockDatabaseService.Object, _mockInstanceService.Object, _mockModuleMetadataService.Object); - } - - [Test] - public void Should_ReturnCleanResult_When_DatabaseIsClean() - { - // Arrange - var tableResults = GetCleanTableResults(); - _mockDatabaseService - .Setup(p => p.ExecuteSqlFromFile(Scripts.TablesWithNoClass)) - .Returns(tableResults); - - var classResults = GetCleanClassResults(); - _mockDatabaseService - .Setup(p => p.ExecuteSqlFromFile(Scripts.ClassesWithNoTable)) - .Returns(classResults); - - // Act - var results = _mockReport.GetResults(); - - // Assert - Assert.That(results.Data.TableResults.Rows.Count == 0); - Assert.That(results.Data.ClassResults.Rows.Count == 0); - Assert.That(results.Status == ResultsStatus.Good); - } - - [Test] - public void Should_ReturnErrorResult_When_DatabaseHasClassWithNoTable() - { - // Arrange - var tableResults = GetCleanTableResults(); - _mockDatabaseService - .Setup(p => p.ExecuteSqlFromFile(Scripts.TablesWithNoClass)) - .Returns(tableResults); - - var classResults = GetCleanClassResults(); - classResults.Add(new ClassWithNoTable - { - ClassDisplayName = "Has no table", - ClassName = "HasNoTable", - ClassTableName = "Custom_HasNoTable" - }); - - _mockDatabaseService - .Setup(p => p.ExecuteSqlFromFile(Scripts.ClassesWithNoTable)) - .Returns(classResults); - - // Act - var results = _mockReport.GetResults(); - - // Assert - Assert.That(results.Data.TableResults.Rows.Count == 0); - Assert.That(results.Data.ClassResults.Rows.Count == 1); - Assert.That(results.Status == ResultsStatus.Error); - } - - [Test] - public void Should_ReturnErrorResult_When_DatabaseHasTableWithNoClass() - { - // Arrange - var tableResults = GetCleanTableResults(false); - tableResults.Add(new TableWithNoClass - { - TableName = "HasNoClass" - }); - - _mockDatabaseService - .Setup(p => p.ExecuteSqlFromFile(Scripts.TablesWithNoClass)) - .Returns(tableResults); - - var classResults = GetCleanClassResults(); - _mockDatabaseService - .Setup(p => p.ExecuteSqlFromFile(Scripts.ClassesWithNoTable)) - .Returns(classResults); - - // Act - var results = _mockReport.GetResults(); - - // Assert - Assert.That(results.Data.TableResults.Rows.Count == 1); - Assert.That(results.Data.ClassResults.Rows.Count == 0); - Assert.That(results.Status == ResultsStatus.Error); - } - - private List GetCleanClassResults() - { - return new List(); - } - - private List GetCleanTableResults(bool includeWhitelistedTables = true) - { - var tableResults = new List(); - if (includeWhitelistedTables && _mockInstanceDetails.DatabaseVersion.Major >= 10) - { - tableResults.Add(new TableWithNoClass() { TableName = "CI_Migration" }); - } - - return tableResults; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports.Tests/Directory.Build.props b/KenticoInspector.Reports.Tests/Directory.Build.props deleted file mode 100644 index c4e59780..00000000 --- a/KenticoInspector.Reports.Tests/Directory.Build.props +++ /dev/null @@ -1,8 +0,0 @@ - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - \ No newline at end of file diff --git a/KenticoInspector.Reports.Tests/Helpers/MockInstanceDetails.cs b/KenticoInspector.Reports.Tests/Helpers/MockInstanceDetails.cs deleted file mode 100644 index 46dccb1d..00000000 --- a/KenticoInspector.Reports.Tests/Helpers/MockInstanceDetails.cs +++ /dev/null @@ -1,91 +0,0 @@ -using KenticoInspector.Core.Models; - -using System; -using System.Collections.Generic; - -namespace KenticoInspector.Reports.Tests.Helpers -{ - public static class MockInstanceDetails - { - public static InstanceDetails Kentico9 = new InstanceDetails - { - AdministrationVersion = new Version("9.0"), - DatabaseVersion = new Version("9.0"), - Sites = new List - { - new Site { DomainName = "kentico9.com" } - } - }; - - public static InstanceDetails Kentico10 = new InstanceDetails - { - AdministrationVersion = new Version("10.0"), - DatabaseVersion = new Version("10.0"), - Sites = new List - { - new Site { DomainName = "kentico10.com" } - } - }; - - public static InstanceDetails Kentico11 = new InstanceDetails - { - AdministrationVersion = new Version("11.0"), - DatabaseVersion = new Version("11.0"), - Sites = new List - { - new Site { DomainName = "kentico11.com" } - } - }; - - public static InstanceDetails Kentico12 = new InstanceDetails - { - AdministrationVersion = new Version("12.0"), - DatabaseVersion = new Version("12.0"), - Sites = new List - { - new Site { DomainName = "kentico12.com" } - } - }; - - public static InstanceDetails Kentico13 = new InstanceDetails - { - AdministrationVersion = new Version("13.0"), - DatabaseVersion = new Version("13.0"), - Sites = new List - { - new Site { DomainName = "kentico13.com" } - } - }; - - public static InstanceDetails Get(int majorVersion, Instance instance) - { - InstanceDetails instanceDetails = null; - - switch (majorVersion) - { - case 9: - instanceDetails = Kentico9; - break; - case 10: - instanceDetails = Kentico10; - break; - case 11: - instanceDetails = Kentico11; - break; - case 12: - instanceDetails = Kentico12; - break; - case 13: - instanceDetails = Kentico13; - break; - } - - if (instanceDetails != null) - { - instanceDetails.Guid = instance.Guid; - } - - return instanceDetails; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports.Tests/Helpers/MockInstances.cs b/KenticoInspector.Reports.Tests/Helpers/MockInstances.cs deleted file mode 100644 index 545676a9..00000000 --- a/KenticoInspector.Reports.Tests/Helpers/MockInstances.cs +++ /dev/null @@ -1,73 +0,0 @@ -using KenticoInspector.Core.Models; - -using System; - -namespace KenticoInspector.Reports.Tests.Helpers -{ - public static class MockInstances - { - public static Instance Kentico9 = new Instance - { - Name = "K9 Test Instance", - Guid = Guid.NewGuid(), - AdminPath = "C:\\inetpub\\wwwroot\\Kentico9", - AdminUrl = "http://kentico9.com", - DatabaseSettings = null - }; - - public static Instance Kentico10 = new Instance - { - Name = "K10 Test Instance", - Guid = Guid.NewGuid(), - AdminPath = "C:\\inetpub\\wwwroot\\Kentico10", - AdminUrl = "http://kentico10.com", - DatabaseSettings = null - }; - - public static Instance Kentico11 = new Instance - { - Name = "K11 Test Instance", - Guid = Guid.NewGuid(), - AdminPath = "C:\\inetpub\\wwwroot\\Kentico11", - AdminUrl = "http://kentico11.com", - DatabaseSettings = null - }; - - public static Instance Kentico12 = new Instance - { - Name = "K12 Test Instance", - Guid = Guid.NewGuid(), - AdminPath = "C:\\inetpub\\wwwroot\\Kentico12", - AdminUrl = "http://kentico12.com", - DatabaseSettings = null - }; - - public static Instance Kentico13 = new Instance - { - Name = "K13 Test Instance", - Guid = Guid.NewGuid(), - AdminPath = "C:\\inetpub\\wwwroot\\Kentico13", - AdminUrl = "http://kentico13.com", - DatabaseSettings = null - }; - - public static Instance Get(int majorVersion) - { - switch (majorVersion) - { - case 9: - return Kentico9; - case 10: - return Kentico10; - case 11: - return Kentico11; - case 12: - return Kentico12; - case 13: - return Kentico13; - } - - return null; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports.Tests/Helpers/ReflectionExtensions.cs b/KenticoInspector.Reports.Tests/Helpers/ReflectionExtensions.cs deleted file mode 100644 index 9f070cd1..00000000 --- a/KenticoInspector.Reports.Tests/Helpers/ReflectionExtensions.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace KenticoInspector.Reports.Tests.Helpers -{ - public static class ReflectionExtensions - { - public static T GetPropertyValue(this object obj, string propertyName) - { - return (T)obj.GetType().GetProperty(propertyName).GetValue(obj, null); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports.Tests/KenticoInspector.Reports.Tests.csproj b/KenticoInspector.Reports.Tests/KenticoInspector.Reports.Tests.csproj deleted file mode 100644 index 46f86c99..00000000 --- a/KenticoInspector.Reports.Tests/KenticoInspector.Reports.Tests.csproj +++ /dev/null @@ -1,65 +0,0 @@ - - - - net8.0 - false - 9.0 - - - - - - - - - - - - - - - - - - - - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - Always - - - - diff --git a/KenticoInspector.Reports.Tests/UnusedPageTypeSummaryTest.cs b/KenticoInspector.Reports.Tests/UnusedPageTypeSummaryTest.cs deleted file mode 100644 index 855d9802..00000000 --- a/KenticoInspector.Reports.Tests/UnusedPageTypeSummaryTest.cs +++ /dev/null @@ -1,54 +0,0 @@ -using KenticoInspector.Core.Constants; -using KenticoInspector.Reports.UnusedPageTypeSummary; -using KenticoInspector.Reports.UnusedPageTypeSummary.Models; - -using NUnit.Framework; - -using System.Collections.Generic; - -namespace KenticoInspector.Reports.Tests -{ - [TestFixture(10)] - [TestFixture(11)] - [TestFixture(12)] - [TestFixture(13)] - public class UnusedPageTypeSummaryTest : AbstractReportTest - { - private readonly Report _mockReport; - - public UnusedPageTypeSummaryTest(int majorVersion) : base(majorVersion) - { - _mockReport = new Report(_mockDatabaseService.Object, _mockModuleMetadataService.Object); - } - - [Test] - public void Should_ReturnInformationStatusAndAllUnusedPageTypes() - { - // Arrange - var unusedPageTypes = GetUnusedPageTypes(); - _mockDatabaseService - .Setup(p => p.ExecuteSqlFromFile(Scripts.GetUnusedPageTypes)) - .Returns(unusedPageTypes); - - // Act - var results = _mockReport.GetResults(); - - // Assert - Assert.That(results.Data.Rows.Count == 6); - Assert.That(results.Status == ResultsStatus.Information); - } - - public IEnumerable GetUnusedPageTypes() - { - return new List - { - new PageType{ ClassDisplayName = "Blog", ClassName = "CMS.Blog" }, - new PageType{ ClassDisplayName = "Blog month", ClassName = "CMS.BlogMonth" }, - new PageType{ ClassDisplayName = "Blog post", ClassName = "CMS.BlogPost" }, - new PageType{ ClassDisplayName = "Chat - Transformation", ClassName = "Chat.Transformations" }, - new PageType{ ClassDisplayName = "Dancing Goat site - Transformations", ClassName = "DancingGoat.Transformations" }, - new PageType{ ClassDisplayName = "E-commerce - Transformations", ClassName = "Ecommerce.Transformations" } - }; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports.Tests/WebPartPerformanceAnalysisTests.cs b/KenticoInspector.Reports.Tests/WebPartPerformanceAnalysisTests.cs deleted file mode 100644 index a67bc788..00000000 --- a/KenticoInspector.Reports.Tests/WebPartPerformanceAnalysisTests.cs +++ /dev/null @@ -1,72 +0,0 @@ -using KenticoInspector.Core.Constants; -using KenticoInspector.Reports.Tests.Helpers; -using KenticoInspector.Reports.WebPartPerformanceAnalysis; -using KenticoInspector.Reports.WebPartPerformanceAnalysis.Models; - -using NUnit.Framework; - -using System.Collections.Generic; -using System.Linq; -using System.Xml.Linq; - -namespace KenticoInspector.Reports.Tests -{ - [TestFixture(10)] - [TestFixture(11)] - [TestFixture(12)] - [TestFixture(13)] - public class WebPartPerformanceAnalysisTest : AbstractReportTest - { - private readonly Report _mockReport; - - public WebPartPerformanceAnalysisTest(int majorVersion) : base(majorVersion) - { - _mockReport = new Report(_mockDatabaseService.Object, _mockModuleMetadataService.Object); - } - - [Test] - public void Should_ReturnGoodStatus_When_NoWebPartsHaveUnspecifiedColumns() - { - // Arrange - ArrangeAllQueries(); - - // Act - var results = _mockReport.GetResults(); - - // Assert - Assert.That(results.Status == ResultsStatus.Good, $"Expected status when no web parts have unspecified columns is 'Good' not '{results.Status}'."); - } - - [Test] - public void Should_ReturnWarningStatus_When_ThereAreWebPartsWithUnspecifiedColumns() - { - // Arrange - var affectedTemplates = new List(); - affectedTemplates.Add(new PageTemplate() - { - PageTemplateCodeName = "cms.blog", - PageTemplateDisplayName = "Blog", - PageTemplateID = 25807, - PageTemplateWebParts = XDocument.Parse("##DEFAULT##TrueBlackBoxTagsTagCloudFalseFalse/Blogs/My-blog-1TrueFalse9be345f1-a4c1-4f57-a996-594e1aed0d4e2010##DEFAULT##tagidTrueMyBloginheritFalseFalseTrueTagCloudNo data foundsplit##DEFAULT##Falsecms.blogBlackBoxMy favorite websitesrptSideColumnFalseFalseFalseFalseFalseFalse390ccd7c-8216-4f8f-aacd-00380990d3b6-1NodeLevel DESC-bottom10querystring##DEFAULT##/%Falseisrelatedto00000000-0000-0000-0000-000000000000topTrue1FalseTruecms.blog;cms.blogmonth;cms.blogpostFalseinheritcms.blog.SideColumnFalseTruerepeaterNo data foundBlackBoxRecent postsRecentPostsFalseFalseFalseFalse964520b0-deab-47ff-9870-77b40235c7d1##DEFAULT##205cms.blog;cms.blogmonth;cms.blogpostinheritcms.blogpost.RecentPostsFalseTrueRecentPostsNo recent postsBlackBoxPost archivePostArchiveFalseFalse4be02b0b-5205-4e2e-ad0e-9e148de15c9fcms.blog;cms.blogmonth;cms.blogpostcms.blogpost.ArchiveTruePostArchiveNo data in archivesplit##DEFAULT##0Falsecms.blogBlackBoxTitle</div><div class=\"TextContent\">rptBlogDescriptionFalseFalseFalseFalseFalseFalsed5b7eb38-6869-4e00-bb32-312808424ec1-1NodeLevel DESC-bottom10querystring##DEFAULT##/%Falseisrelatedto00000000-0000-0000-0000-000000000000topTrue1FalseTruecms.blog;cms.blogmonth;cms.blogpostFalseinheritcms.blog.DescriptionFalseTruerepeater'{%nodealiaspath%}' LIKE NodeAliasPath + '%'No data foundsplit##DEFAULT##0Falsecms.blogpostFalserptAllPostsAsuncionFalseFalseFalseFalseFalseTrueFalse8679aa66-d6f1-438a-8c03-c12034731651-1BlogPostDate DESCnoneTrueTrueTrueTrueTrueTrueTrue-bottom10postback##DEFAULT##Falseisrelatedto00000000-0000-0000-0000-000000000000topcms.blogpost.DefaultTrue5FalseTruecms.blog;cms.blogpostFalsecustomcms.blog.PostPreviewFalseTruerepeater('{?ToInt(tagid, \"\")?}' = 0 AND N'{?tagname?}'=N'') OR (DocumentID IN (SELECT DocumentID FROM CMS_DocumentTag WHERE TagID = {?ToInt(tagid, \"\")?} )) OR (DocumentID IN (SELECT DocumentID FROM CMS_DocumentTag WHERE TagID IN (SELECT TagID FROM CMS_Tag WHERE TagName = N'{?tagname?}' AND TagGroupID = {?ToInt(groupid, \"\")?} )))No data found0False<hr class=\"PostCommentSeparatorLine\" /></div><div class=\"comments TextContent\">CommentViewFalseFalseTrueFalseFalse39bbf7ba-5a9a-46bd-a72e-de50c724c2b7##DEFAULT##0TrueTruecms.blogpostinherit5060FalseTrueCommentViewTrueJavascriptFalseFalseTrueFalseHeader69bc22d5-36eb-4246-a6a6-4b261b85abb0jqueryHeaderTruejavascriptTrue&gt;&lt;Falsecms.blog;cms.blogmonth;cms.blogpost;CMS.MenuItemBox.GraybreadcrumbsFalseFalseTrueTrueFalseFalse34e1d3c7-54c4-488a-a606-04a0175a2c48False/TrueTrueFalseinheritTrueFalseTruebreadcrumbsNo data found") - }); - - ArrangeAllQueries(affectedTemplates); - - // Act - var results = _mockReport.GetResults(); - - // Assert - Assert.That(results.Status == ResultsStatus.Warning, $"Expected status when web parts have unspecified columns is 'Warning' not '{results.Status}'."); - } - - private void ArrangeAllQueries(List affectedTemplates = null) - { - affectedTemplates = affectedTemplates ?? new List(); - _mockDatabaseService.SetupExecuteSqlFromFile(Scripts.GetAffectedTemplates, affectedTemplates); - - var affectedTemplateIds = affectedTemplates.Select(x => x.PageTemplateID); - var affectedDocuments = new List(); - _mockDatabaseService.SetupExecuteSqlFromFileWithListParameter(Scripts.GetDocumentsByPageTemplateIds, "IDs", affectedTemplateIds, affectedDocuments); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports.Tests/editorconfig.txt b/KenticoInspector.Reports.Tests/editorconfig.txt deleted file mode 100644 index 09c62a85..00000000 --- a/KenticoInspector.Reports.Tests/editorconfig.txt +++ /dev/null @@ -1,1245 +0,0 @@ -root = true - -[*.cs] - -# ===== Active SonarLint rules ===== - -# [Category: Bug] -# S2757: "=+" should not be used instead of "+=" -dotnet_diagnostic.S2757.severity = warning - -# S3168: "async" methods should not return "void" -dotnet_diagnostic.S3168.severity = warning - -# S3397: "base.Equals" should not be used to check for reference equality in "Equals" if "base" is not "object" -dotnet_diagnostic.S3397.severity = warning - -# S1206: "Equals(Object)" and "GetHashCode()" should be overridden in pairs -dotnet_diagnostic.S1206.severity = warning - -# S2328: "GetHashCode" should not reference mutable fields -dotnet_diagnostic.S2328.severity = warning - -# S2997: "IDisposables" created in a "using" statement should not be returned -dotnet_diagnostic.S2997.severity = warning - -# S2930: "IDisposables" should be disposed -dotnet_diagnostic.S2930.severity = warning - -# S2688: "NaN" should not be used in comparisons -dotnet_diagnostic.S2688.severity = warning - -# S2995: "Object.ReferenceEquals" should not be used for value types -dotnet_diagnostic.S2995.severity = warning - -# S3869: "SafeHandle.DangerousGetHandle" should not be called -dotnet_diagnostic.S3869.severity = warning - -# S3456: "string.ToCharArray()" should not be called redundantly -dotnet_diagnostic.S3456.severity = warning - -# S2996: "ThreadStatic" fields should not be initialized -dotnet_diagnostic.S2996.severity = warning - -# S3005: "ThreadStatic" should not be used on non-static fields -dotnet_diagnostic.S3005.severity = warning - -# S2225: "ToString()" method should not return null -dotnet_diagnostic.S2225.severity = warning - -# S2251: A "for" loop update clause should move the counter in the right direction -dotnet_diagnostic.S2251.severity = warning - -# S3923: All branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S3923.severity = warning - -# S3244: Anonymous delegates should not be used to unsubscribe from Events -dotnet_diagnostic.S3244.severity = warning - -# S3343: Caller information parameters should come at the end of the parameter list -dotnet_diagnostic.S3343.severity = warning - -# S4583: Calls to delegate's method "BeginInvoke" should be paired with calls to "EndInvoke" -dotnet_diagnostic.S4583.severity = warning - -# S3249: Classes directly extending "object" should not call "base" in "GetHashCode" or "Equals" -dotnet_diagnostic.S3249.severity = warning - -# S3453: Classes should not have only "private" constructors -dotnet_diagnostic.S3453.severity = warning - -# S4143: Collection elements should not be replaced unconditionally -dotnet_diagnostic.S4143.severity = warning - -# S3981: Collection sizes and array length comparisons should make sense -dotnet_diagnostic.S3981.severity = warning - -# S2114: Collections should not be passed as arguments to their own methods -dotnet_diagnostic.S2114.severity = warning - -# S2275: Composite format strings should not lead to unexpected behavior at runtime -dotnet_diagnostic.S2275.severity = warning - -# S2583: Conditionally executed code should be reachable -dotnet_diagnostic.S2583.severity = warning - -# S3172: Delegates should not be subtracted -dotnet_diagnostic.S3172.severity = warning - -# S3926: Deserialization methods should be provided for "OptionalField" members -dotnet_diagnostic.S3926.severity = warning - -# S1048: Destructors should not throw exceptions -dotnet_diagnostic.S1048.severity = warning - -# S2761: Doubled prefix operators "!!" and "~~" should not be used -dotnet_diagnostic.S2761.severity = warning - -# S4158: Empty collections should not be accessed or iterated -dotnet_diagnostic.S4158.severity = warning - -# S3655: Empty nullable value should not be accessed -dotnet_diagnostic.S3655.severity = warning - -# S3984: Exceptions should not be created without being thrown -dotnet_diagnostic.S3984.severity = warning - -# S3346: Expressions used in "Debug.Assert" should not produce side effects -dotnet_diagnostic.S3346.severity = warning - -# S2345: Flags enumerations should explicitly initialize all their members -dotnet_diagnostic.S2345.severity = warning - -# S2252: For-loop conditions should be true at least once -dotnet_diagnostic.S2252.severity = warning - -# S4275: Getters and setters should access the expected fields -dotnet_diagnostic.S4275.severity = warning - -# S1764: Identical expressions should not be used on both sides of a binary operator -dotnet_diagnostic.S1764.severity = warning - -# S2183: Integral numbers should not be shifted by zero or more than their number of bits-1 -dotnet_diagnostic.S2183.severity = warning - -# S1751: Loops with at most one iteration should be refactored -dotnet_diagnostic.S1751.severity = warning - -# S3603: Methods with "Pure" attribute should return a value -dotnet_diagnostic.S3603.severity = warning - -# S3887: Mutable, non-private fields should not be "readonly" -dotnet_diagnostic.S3887.severity = warning - -# S3889: Neither "Thread.Resume" nor "Thread.Suspend" should be used -dotnet_diagnostic.S3889.severity = warning - -# S4586: Non-async "Task/Task" methods should not return null -dotnet_diagnostic.S4586.severity = warning - -# S2259: Null pointers should not be dereferenced -dotnet_diagnostic.S2259.severity = warning - -# S3610: Nullable type comparison should not be redundant -dotnet_diagnostic.S3610.severity = warning - -# S1848: Objects should not be created to be dropped immediately without being used -dotnet_diagnostic.S1848.severity = warning - -# S3598: One-way "OperationContract" methods should have "void" return type -dotnet_diagnostic.S3598.severity = warning - -# S3466: Optional parameters should be passed to "base" calls -dotnet_diagnostic.S3466.severity = warning - -# S2934: Property assignments should not be made for "readonly" fields not constrained to reference types -dotnet_diagnostic.S2934.severity = warning - -# S2190: Recursion should not be infinite -dotnet_diagnostic.S2190.severity = warning - -# S1862: Related "if/else if" statements should not have the same condition -dotnet_diagnostic.S1862.severity = warning - -# S2184: Results of integer division should not be assigned to floating point variables -dotnet_diagnostic.S2184.severity = warning - -# S2201: Return values from functions without side effects should not be ignored -dotnet_diagnostic.S2201.severity = warning - -# S3449: Right operands of shift operators should be integers -dotnet_diagnostic.S3449.severity = warning - -# S3927: Serialization event handlers should be implemented correctly -dotnet_diagnostic.S3927.severity = warning - -# S2551: Shared resources should not be used for locking -dotnet_diagnostic.S2551.severity = warning - -# S2857: SQL keywords should be delimited by whitespace -dotnet_diagnostic.S2857.severity = warning - -# S3263: Static fields should appear in the order they must be initialized -dotnet_diagnostic.S3263.severity = warning - -# S3464: Type inheritance should not be recursive -dotnet_diagnostic.S3464.severity = warning - -# S3903: Types should be defined in named namespaces -dotnet_diagnostic.S3903.severity = warning - -# S2123: Values should not be uselessly incremented -dotnet_diagnostic.S2123.severity = warning - -# S1656: Variables should not be self-assigned -dotnet_diagnostic.S1656.severity = warning - -# S2306: "async" and "await" should not be used as identifiers -dotnet_diagnostic.S2306.severity = warning - - -# [Category: Security] -# S3884: "CoSetProxyBlanket" and "CoInitializeSecurity" should not be used -dotnet_diagnostic.S3884.severity = warning - -# S2115: A secure password should be used when connecting to a database -dotnet_diagnostic.S2115.severity = warning - -# S5547: Cipher algorithms should be robust -dotnet_diagnostic.S5547.severity = warning - -# S3329: Cipher Block Chaining IVs should be unpredictable -dotnet_diagnostic.S3329.severity = warning - -# S5542: Encryption algorithms should be used with secure mode and padding scheme -dotnet_diagnostic.S5542.severity = warning - -# S5445: Insecure temporary file creation methods should not be used -dotnet_diagnostic.S5445.severity = warning - -# S5659: JWT should be signed and verified with strong cipher algorithms -dotnet_diagnostic.S5659.severity = warning - -# S4433: LDAP connections should be authenticated -dotnet_diagnostic.S4433.severity = warning - -# S4211: Members should not have conflicting transparency annotations -dotnet_diagnostic.S4211.severity = warning - -# S4423: Weak SSL/TLS protocols should not be used -dotnet_diagnostic.S4423.severity = warning - -# S2755: XML parsers should not be vulnerable to XXE attacks -dotnet_diagnostic.S2755.severity = warning - -# S2053: Hashes should include an unpredictable salt -dotnet_diagnostic.S2053.severity = warning - -# S4830: Server certificates should be verified during SSL/TLS connections -dotnet_diagnostic.S4830.severity = warning - -# S4426: Cryptographic keys should be robust -dotnet_diagnostic.S4426.severity = warning - -# S5773: Types allowed to be deserialized should be restricted -dotnet_diagnostic.S5773.severity = warning - - -# [Category: Security Hotspot] -# S5693: Allowing requests with excessive content length is security-sensitive -dotnet_diagnostic.S5693.severity = warning - -# S4792: Configuring loggers is security-sensitive -dotnet_diagnostic.S4792.severity = warning - -# S3330: Creating cookies without the "HttpOnly" flag is security-sensitive -dotnet_diagnostic.S3330.severity = warning - -# S2092: Creating cookies without the "secure" flag is security-sensitive -dotnet_diagnostic.S2092.severity = warning - -# S4507: Delivering code in production with debug features activated is security-sensitive -dotnet_diagnostic.S4507.severity = warning - -# S5766: Deserializing objects without performing data validation is security-sensitive -dotnet_diagnostic.S5766.severity = warning - -# S5753: Disabling ASP.NET "Request Validation" feature is security-sensitive -dotnet_diagnostic.S5753.severity = warning - -# S4502: Disabling CSRF protections is security-sensitive -dotnet_diagnostic.S4502.severity = warning - -# S5042: Expanding archive files without controlling resource consumption is security-sensitive -dotnet_diagnostic.S5042.severity = warning - -# S2077: Formatting SQL queries is security-sensitive -dotnet_diagnostic.S2077.severity = warning - -# S2068: Hard-coded credentials are security-sensitive -dotnet_diagnostic.S2068.severity = warning - -# S5122: Having a permissive Cross-Origin Resource Sharing policy is security-sensitive -dotnet_diagnostic.S5122.severity = warning - -# S4036: Searching OS commands in PATH is security-sensitive -dotnet_diagnostic.S4036.severity = warning - -# S2612: Setting loose file permissions is security-sensitive -dotnet_diagnostic.S2612.severity = warning - -# S5332: Using clear-text protocols is security-sensitive -dotnet_diagnostic.S5332.severity = warning - -# S1313: Using hardcoded IP addresses is security-sensitive -dotnet_diagnostic.S1313.severity = warning - -# S2257: Using non-standard cryptographic algorithms is security-sensitive -dotnet_diagnostic.S2257.severity = warning - -# S2245: Using pseudorandom number generators (PRNGs) is security-sensitive -dotnet_diagnostic.S2245.severity = warning - -# S5443: Using publicly writable directories is security-sensitive -dotnet_diagnostic.S5443.severity = warning - -# S4790: Using weak hashing algorithms is security-sensitive -dotnet_diagnostic.S4790.severity = warning - - -# [Category: Code Smell] -# S3451: "[DefaultValue]" should not be used when "[DefaultParameterValue]" is meant -dotnet_diagnostic.S3451.severity = warning - -# S3447: "[Optional]" should not be used on "ref" or "out" parameters -dotnet_diagnostic.S3447.severity = warning - -# S1155: "Any()" should be used to test for emptiness -dotnet_diagnostic.S1155.severity = warning - -# S2737: "catch" clauses should do more than rethrow -dotnet_diagnostic.S2737.severity = warning - -# S4524: "default" clauses should be first or last -dotnet_diagnostic.S4524.severity = warning - -# S3217: "Explicit" conversions of "foreach" loops should not be used -dotnet_diagnostic.S3217.severity = warning - -# S3971: "GC.SuppressFinalize" should not be called -dotnet_diagnostic.S3971.severity = warning - -# S907: "goto" statement should not be used -dotnet_diagnostic.S907.severity = warning - -# S2692: "IndexOf" checks should not be for positive numbers -dotnet_diagnostic.S2692.severity = warning - -# S3060: "is" should not be used with "this" -dotnet_diagnostic.S3060.severity = warning - -# S1123: "Obsolete" attributes should include explanations -dotnet_diagnostic.S1123.severity = warning - -# S4214: "P/Invoke" methods should not be visible -dotnet_diagnostic.S4214.severity = warning - -# S4061: "params" should be used instead of "varargs" -dotnet_diagnostic.S4061.severity = warning - -# S3262: "params" should be used on overrides -dotnet_diagnostic.S3262.severity = warning - -# S3600: "params" should not be introduced on overrides -dotnet_diagnostic.S3600.severity = warning - -# S3597: "ServiceContract" and "OperationContract" attributes should be used together -dotnet_diagnostic.S3597.severity = warning - -# S3963: "static" fields should be initialized inline -dotnet_diagnostic.S3963.severity = warning - -# S3256: "string.IsNullOrEmpty" should be used -dotnet_diagnostic.S3256.severity = warning - -# S1479: "switch" statements should not have too many "case" clauses -dotnet_diagnostic.S1479.severity = warning - -# S5034: "ValueTask" should be consumed correctly -dotnet_diagnostic.S5034.severity = warning - -# S1264: A "while" loop should be used instead of a "for" loop -dotnet_diagnostic.S1264.severity = warning - -# S3973: A conditionally executed single line should be denoted by indentation -dotnet_diagnostic.S3973.severity = warning - -# S3904: Assemblies should have version information -dotnet_diagnostic.S3904.severity = warning - -# S3415: Assertion arguments should be passed in the correct order -dotnet_diagnostic.S3415.severity = warning - -# S4019: Base class methods should not be hidden -dotnet_diagnostic.S4019.severity = warning - -# S1940: Boolean checks should not be inverted -dotnet_diagnostic.S1940.severity = warning - -# S3236: Caller information arguments should not be provided explicitly -dotnet_diagnostic.S3236.severity = warning - -# S3897: Classes that provide "Equals()" should implement "IEquatable" -dotnet_diagnostic.S3897.severity = warning - -# S3457: Composite format strings should be used correctly -dotnet_diagnostic.S3457.severity = warning - -# S3972: Conditionals should start on new lines -dotnet_diagnostic.S3972.severity = warning - -# S1116: Empty statements should be removed -dotnet_diagnostic.S1116.severity = warning - -# S3264: Events should be invoked -dotnet_diagnostic.S3264.severity = warning - -# S3445: Exceptions should not be explicitly rethrown -dotnet_diagnostic.S3445.severity = warning - -# S1163: Exceptions should not be thrown in finally blocks -dotnet_diagnostic.S1163.severity = warning - -# S2290: Field-like events should not be virtual -dotnet_diagnostic.S2290.severity = warning - -# S2346: Flags enumerations zero-value members should be named "warning" -dotnet_diagnostic.S2346.severity = warning - -# S3251: Implementations should be provided for "partial" methods -dotnet_diagnostic.S3251.severity = warning - -# S1944: Inappropriate casts should not be made -dotnet_diagnostic.S1944.severity = warning - -# S4015: Inherited member visibility should not be decreased -dotnet_diagnostic.S4015.severity = warning - -# S3444: Interfaces should not simply inherit from base interfaces with colliding members -dotnet_diagnostic.S3444.severity = warning - -# S818: Literal suffixes should be upper case -dotnet_diagnostic.S818.severity = warning - -# S3400: Methods should not return constants -dotnet_diagnostic.S3400.severity = warning - -# S2681: Multiline blocks should be enclosed in curly braces -dotnet_diagnostic.S2681.severity = warning - -# S3169: Multiple "OrderBy" calls should not be used -dotnet_diagnostic.S3169.severity = warning - -# S3261: Namespaces should not be empty -dotnet_diagnostic.S3261.severity = warning - -# S4200: Native methods should be wrapped -dotnet_diagnostic.S4200.severity = warning - -# S1199: Nested code blocks should not be used -dotnet_diagnostic.S1199.severity = warning - -# S4070: Non-flags enums should not be marked with "FlagsAttribute" -dotnet_diagnostic.S4070.severity = warning - -# S3265: Non-flags enums should not be used in bitwise operations -dotnet_diagnostic.S3265.severity = warning - -# S4201: Null checks should not be used with "is" -dotnet_diagnostic.S4201.severity = warning - -# S3966: Objects should not be disposed more than once -dotnet_diagnostic.S3966.severity = warning - -# S2291: Overflow checking should not be disabled for "Enumerable.Sum" -dotnet_diagnostic.S2291.severity = warning - -# S1185: Overriding members should do more than simply call the same member in the base class -dotnet_diagnostic.S1185.severity = warning - -# S2234: Parameters should be passed in the correct order -dotnet_diagnostic.S2234.severity = warning - -# S3450: Parameters with "[DefaultParameterValue]" attributes should also be marked "[Optional]" -dotnet_diagnostic.S3450.severity = warning - -# S1905: Redundant casts should not be used -dotnet_diagnostic.S1905.severity = warning - -# S1110: Redundant pairs of parentheses should be removed -dotnet_diagnostic.S1110.severity = warning - -# S2437: Silly bit operations should not be performed -dotnet_diagnostic.S2437.severity = warning - -# S3010: Static fields should not be updated in constructors -dotnet_diagnostic.S3010.severity = warning - -# S4635: String offset-based methods should be preferred for finding substrings from offsets -dotnet_diagnostic.S4635.severity = warning - -# S3998: Threads should not lock on objects with weak identity -dotnet_diagnostic.S3998.severity = warning - -# S1134: Track uses of "FIXME" tags -dotnet_diagnostic.S1134.severity = warning - -# S1135: Track uses of "TODO" tags -dotnet_diagnostic.S1135.severity = warning - -# S1871: Two branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S1871.severity = warning - -# S3443: Type should not be examined on "System.Type" instances -dotnet_diagnostic.S3443.severity = warning - -# S3459: Unassigned members should be removed -dotnet_diagnostic.S3459.severity = warning - -# S3440: Variables should not be checked against the values they're about to be assigned -dotnet_diagnostic.S3440.severity = warning - -# S2479: Whitespace and control characters in string literals should be explicit -dotnet_diagnostic.S2479.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S3442: "abstract" classes should not have "public" constructors -dotnet_diagnostic.S3442.severity = warning - -# S3885: "Assembly.Load" should be used -dotnet_diagnostic.S3885.severity = warning - -# S1210: "Equals" and the comparison operators should be overridden when implementing "IComparable" -dotnet_diagnostic.S1210.severity = warning - -# S1215: "GC.Collect" should not be called -dotnet_diagnostic.S1215.severity = warning - -# S3881: "IDisposable" should be implemented correctly -dotnet_diagnostic.S3881.severity = warning - -# S2971: "IEnumerable" LINQs should be simplified -dotnet_diagnostic.S2971.severity = warning - -# S3925: "ISerializable" should be implemented correctly -dotnet_diagnostic.S3925.severity = warning - -# S4581: "new Guid()" should not be used -dotnet_diagnostic.S4581.severity = warning - -# S3875: "operator==" should not be overloaded on reference types -dotnet_diagnostic.S3875.severity = warning - -# S3237: "value" parameters should be used -dotnet_diagnostic.S3237.severity = warning - -# S1121: Assignments should not be made from within sub-expressions -dotnet_diagnostic.S1121.severity = warning - -# S3376: Attribute, EventArgs, and Exception type names should end with the type being extended -dotnet_diagnostic.S3376.severity = warning - -# S2589: Boolean expressions should not be gratuitous -dotnet_diagnostic.S2589.severity = warning - -# S4035: Classes implementing "IEquatable" should be sealed -dotnet_diagnostic.S4035.severity = warning - -# S3776: Cognitive Complexity of methods should not be too high -dotnet_diagnostic.S3776.severity = warning - -# S1066: Collapsible "if" statements should be merged -dotnet_diagnostic.S1066.severity = warning - -# S1699: Constructors should only call non-overridable methods -dotnet_diagnostic.S1699.severity = warning - -# S2372: Exceptions should not be thrown from property getters -dotnet_diagnostic.S2372.severity = warning - -# S3877: Exceptions should not be thrown from unexpected methods -dotnet_diagnostic.S3877.severity = warning - -# S1104: Fields should not have public accessibility -dotnet_diagnostic.S1104.severity = warning - -# S2933: Fields that are only assigned in the constructor should be "readonly" -dotnet_diagnostic.S2933.severity = warning - -# S112: General exceptions should never be thrown -dotnet_diagnostic.S112.severity = warning - -# S2486: Generic exceptions should not be ignored -dotnet_diagnostic.S2486.severity = warning - -# S3246: Generic type parameters should be co/contravariant when possible -dotnet_diagnostic.S3246.severity = warning - -# S1939: Inheritance list should not be redundant -dotnet_diagnostic.S1939.severity = warning - -# S110: Inheritance tree of classes should not be too deep -dotnet_diagnostic.S110.severity = warning - -# S3218: Inner class members should not shadow outer class "static" or type members -dotnet_diagnostic.S3218.severity = warning - -# S2696: Instance members should not write to "static" fields -dotnet_diagnostic.S2696.severity = warning - -# S3626: Jump statements should not be redundant -dotnet_diagnostic.S3626.severity = warning - -# S1117: Local variables should not shadow class fields -dotnet_diagnostic.S1117.severity = warning - -# S3267: Loops should be simplified with "LINQ" expressions -dotnet_diagnostic.S3267.severity = warning - -# S3604: Member initializer values should not be redundant -dotnet_diagnostic.S3604.severity = warning - -# S3220: Method calls should not resolve ambiguously to overloads with "params" -dotnet_diagnostic.S3220.severity = warning - -# S4136: Method overloads should be grouped together -dotnet_diagnostic.S4136.severity = warning - -# S3427: Method overloads with default parameter values should not overlap -dotnet_diagnostic.S3427.severity = warning - -# S1006: Method overrides should not change parameter defaults -dotnet_diagnostic.S1006.severity = warning - -# S2953: Methods named "Dispose" should implement "IDisposable.Dispose" -dotnet_diagnostic.S2953.severity = warning - -# S1186: Methods should not be empty -dotnet_diagnostic.S1186.severity = warning - -# S4144: Methods should not have identical implementations -dotnet_diagnostic.S4144.severity = warning - -# S107: Methods should not have too many parameters -dotnet_diagnostic.S107.severity = warning - -# S3241: Methods should not return values that are never used -dotnet_diagnostic.S3241.severity = warning - -# S2386: Mutable fields should not be "public static" -dotnet_diagnostic.S2386.severity = warning - -# S108: Nested blocks of code should not be left empty -dotnet_diagnostic.S108.severity = warning - -# S2223: Non-constant static fields should not be visible -dotnet_diagnostic.S2223.severity = warning - -# S3260: Non-derived "private" classes and records should be "sealed" -dotnet_diagnostic.S3260.severity = warning - -# S927: Parameter names should match base declaration and other partial definitions -dotnet_diagnostic.S927.severity = warning - -# S3928: Parameter names used into ArgumentException constructors should match an existing one -dotnet_diagnostic.S3928.severity = warning - -# S4457: Parameter validation in "async"/"await" methods should be wrapped -dotnet_diagnostic.S4457.severity = warning - -# S4456: Parameter validation in yielding methods should be wrapped -dotnet_diagnostic.S4456.severity = warning - -# S1450: Private fields only used as local variables in methods should become local variables -dotnet_diagnostic.S1450.severity = warning - -# S2365: Properties should not make collection or array copies -dotnet_diagnostic.S2365.severity = warning - -# S2368: Public methods should not have multidimensional array parameters -dotnet_diagnostic.S2368.severity = warning - -# S3011: Reflection should not be used to increase accessibility of classes, methods, or fields -dotnet_diagnostic.S3011.severity = warning - -# S2219: Runtime type checking should be simplified -dotnet_diagnostic.S2219.severity = warning - -# S125: Sections of code should not be commented out -dotnet_diagnostic.S125.severity = warning - -# S2178: Short-circuit logic should be used in boolean contexts -dotnet_diagnostic.S2178.severity = warning - -# S2743: Static fields should not be used in generic types -dotnet_diagnostic.S2743.severity = warning - -# S1643: Strings should not be concatenated using '+' in a loop -dotnet_diagnostic.S1643.severity = warning - -# S3358: Ternary operators should not be nested -dotnet_diagnostic.S3358.severity = warning - -# S3433: Test method signatures should be correct -dotnet_diagnostic.S3433.severity = warning - -# S2187: TestCases should contain tests -dotnet_diagnostic.S2187.severity = warning - -# S2699: Tests should include assertions -dotnet_diagnostic.S2699.severity = warning - -# S1607: Tests should not be ignored -dotnet_diagnostic.S1607.severity = warning - -# S2292: Trivial properties should be auto-implemented -dotnet_diagnostic.S2292.severity = warning - -# S2436: Types and methods should not have too many generic parameters -dotnet_diagnostic.S2436.severity = warning - -# S101: Types should be named in PascalCase -dotnet_diagnostic.S101.severity = warning - -# S4487: Unread "private" fields should be removed -dotnet_diagnostic.S4487.severity = warning - -# S1854: Unused assignments should be removed -dotnet_diagnostic.S1854.severity = warning - -# S1481: Unused local variables should be removed -dotnet_diagnostic.S1481.severity = warning - -# S1172: Unused method parameters should be removed -dotnet_diagnostic.S1172.severity = warning - -# S1144: Unused private types or members should be removed -dotnet_diagnostic.S1144.severity = warning - -# S2326: Unused type parameters should be removed -dotnet_diagnostic.S2326.severity = warning - -# S1075: URIs should not be hardcoded -dotnet_diagnostic.S1075.severity = warning - -# S1118: Utility classes should not have public constructors -dotnet_diagnostic.S1118.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S1125: Boolean literals should not be redundant -dotnet_diagnostic.S1125.severity = warning - - -# ===== Inactive SonarLint rules (must be explicitly turned off) ===== - -# [Category: Bug] (All these are excluded because they're not applicable to our solution) -# S4428: "PartCreationPolicyAttribute" should be used with "ExportAttribute" -dotnet_diagnostic.S4428.severity = none - -# S4260: "ConstructorArgument" parameters should exist in constructors -dotnet_diagnostic.S4260.severity = none - -# S4277: "Shared" parts should not be created with "new" -dotnet_diagnostic.S4277.severity = none - -# S4159: Classes should implement their "ExportAttribute" interfaces -dotnet_diagnostic.S4159.severity = none - -# S4210: Windows Forms entry points should be marked with STAThread -dotnet_diagnostic.S4210.severity = none - - -# [Uncategorized] -# S6287: HTTP responses should not be vulnerable to session fixation -dotnet_diagnostic.S6287.severity = none - -# S6096: Extracting archives should not lead to zip slip vulnerabilities -dotnet_diagnostic.S6096.severity = none - -# S5334: Dynamic code execution should not be vulnerable to injection attacks -dotnet_diagnostic.S5334.severity = none - -# S5146: HTTP request redirections should not be open to forging attacks -dotnet_diagnostic.S5146.severity = none - -# S5135: Deserialization should not be vulnerable to injection attacks -dotnet_diagnostic.S5135.severity = none - -# S5131: Endpoints should not be vulnerable to reflected cross-site scripting (XSS) attacks -dotnet_diagnostic.S5131.severity = none - -# S3649: Database queries should not be vulnerable to injection attacks -dotnet_diagnostic.S3649.severity = none - -# S2091: XPath expressions should not be vulnerable to injection attacks -dotnet_diagnostic.S2091.severity = none - -# S2083: I/O function calls should not be vulnerable to path injection attacks -dotnet_diagnostic.S2083.severity = none - -# S2078: LDAP queries should not be vulnerable to injection attacks -dotnet_diagnostic.S2078.severity = none - -# S2076: OS commands should not be vulnerable to command injection attacks -dotnet_diagnostic.S2076.severity = none - -# S6424: Azure Functions: Restrictions on entity interfaces -dotnet_diagnostic.S6424.severity = none - -# S6422: Calls to "async" methods should not be blocking in Azure Functions -dotnet_diagnostic.S6422.severity = none - -# S2631: Regular expressions should not be vulnerable to Denial of Service attacks -dotnet_diagnostic.S2631.severity = none - -# S2222: Locks should be released -dotnet_diagnostic.S2222.severity = none - -# S5144: Server-side requests should not be vulnerable to forging attacks -dotnet_diagnostic.S5144.severity = none - -# S6350: Constructing arguments of system commands from user input is security-sensitive -dotnet_diagnostic.S6350.severity = none - -# S6420: Reuse client instances rather than creating new ones with each Azure Function invocation -dotnet_diagnostic.S6420.severity = none - -# S6419: Azure Functions should be stateless -dotnet_diagnostic.S6419.severity = none - -# S5883: OS commands should not be vulnerable to argument injection attacks -dotnet_diagnostic.S5883.severity = none - -# S5145: Logging should not be vulnerable to injection attacks -dotnet_diagnostic.S5145.severity = none - -# S2931: Classes with "IDisposable" members should implement "IDisposable" -dotnet_diagnostic.S2931.severity = none - -# S4462: Calls to "async" methods should not be blocking -dotnet_diagnostic.S4462.severity = none - -# S2387: Child class fields should not shadow parent class fields -dotnet_diagnostic.S2387.severity = none - -# S1451: Track lack of copyright and license headers -dotnet_diagnostic.S1451.severity = none - -# S1147: Exit methods should not be called -dotnet_diagnostic.S1147.severity = none - -# S2952: Classes should "Dispose" of members from the classes' own "Dispose" methods -dotnet_diagnostic.S2952.severity = none - -# S4829: Reading the Standard Input is security-sensitive -dotnet_diagnostic.S4829.severity = none - -# S4823: Using command line arguments is security-sensitive -dotnet_diagnostic.S4823.severity = none - -# S4818: Using Sockets is security-sensitive -dotnet_diagnostic.S4818.severity = none - -# S4787: Encrypting data is security-sensitive -dotnet_diagnostic.S4787.severity = none - -# S4784: Using regular expressions is security-sensitive -dotnet_diagnostic.S4784.severity = none - -# S4039: Interface methods should be callable by derived types -dotnet_diagnostic.S4039.severity = none - -# S4025: Child class fields should not differ from parent class fields only by capitalization -dotnet_diagnostic.S4025.severity = none - -# S4000: Pointers to unmanaged memory should not be visible -dotnet_diagnostic.S4000.severity = none - -# S3937: Number patterns should be regular -dotnet_diagnostic.S3937.severity = none - -# S3874: "out" and "ref" parameters should not be used -dotnet_diagnostic.S3874.severity = none - -# S3353: Unchanged local variables should be "const" -dotnet_diagnostic.S3353.severity = none - -# S3216: "ConfigureAwait(false)" should be used -dotnet_diagnostic.S3216.severity = none - -# S3215: "interface" instances should not be cast to concrete types -dotnet_diagnostic.S3215.severity = none - -# S2701: Literal boolean values should not be used in assertions -dotnet_diagnostic.S2701.severity = none - -# S2360: Optional parameters should not be used -dotnet_diagnostic.S2360.severity = none - -# S2339: Public constant members should not be used -dotnet_diagnostic.S2339.severity = none - -# S2330: Array covariance should not be used -dotnet_diagnostic.S2330.severity = none - -# S2302: "nameof" should be used -dotnet_diagnostic.S2302.severity = none - -# S2197: Modulus results should not be checked for direct equality -dotnet_diagnostic.S2197.severity = none - -# S1994: "for" loop increment clauses should modify the loops' counters -dotnet_diagnostic.S1994.severity = none - -# S1821: "switch" statements should not be nested -dotnet_diagnostic.S1821.severity = none - -# S1541: Methods and properties should not be too complex -dotnet_diagnostic.S1541.severity = none - -# S134: Control flow statements "if", "switch", "for", "foreach", "while", "do" and "try" should not be nested too deeply -dotnet_diagnostic.S134.severity = none - -# S131: "switch/Select" statements should contain a "default/Case Else" clauses -dotnet_diagnostic.S131.severity = none - -# S126: "if ... else if" constructs should end with "else" clauses -dotnet_diagnostic.S126.severity = none - -# S121: Control structures should use curly braces -dotnet_diagnostic.S121.severity = none - -# S1067: Expressions should not be too complex -dotnet_diagnostic.S1067.severity = none - -# S4564: ASP.NET HTTP request validation feature should not be disabled -dotnet_diagnostic.S4564.severity = none - -# S4212: Serialization constructors should be secured -dotnet_diagnostic.S4212.severity = none - -# S3949: Calculations should not overflow -dotnet_diagnostic.S3949.severity = none - -# S1244: Floating point numbers should not be tested for equality -dotnet_diagnostic.S1244.severity = none - -# S881: Increment (++) and decrement (--) operators should not be used in a method call or mixed with other operators in an expression -dotnet_diagnostic.S881.severity = none - -# S6423: Azure Functions should log all failures -dotnet_diagnostic.S6423.severity = none - -# S6421: Azure Functions should use Structured Error Handling -dotnet_diagnostic.S6421.severity = none - -# S6354: Use a testable date/time provider -dotnet_diagnostic.S6354.severity = none - -# S4059: Property names should not match get methods -dotnet_diagnostic.S4059.severity = none - -# S4057: Locales should be set for data types -dotnet_diagnostic.S4057.severity = none - -# S4055: Literals should not be passed as localized parameters -dotnet_diagnostic.S4055.severity = none - -# S4050: Operators should be overloaded consistently -dotnet_diagnostic.S4050.severity = none - -# S4017: Method signatures should not contain nested generic types -dotnet_diagnostic.S4017.severity = none - -# S4016: Enumeration members should not be named "Reserved" -dotnet_diagnostic.S4016.severity = none - -# S4005: "System.Uri" arguments should be used instead of strings -dotnet_diagnostic.S4005.severity = none - -# S4004: Collection properties should be readonly -dotnet_diagnostic.S4004.severity = none - -# S4002: Disposable types should declare finalizers -dotnet_diagnostic.S4002.severity = none - -# S3997: String URI overloads should call "System.Uri" overloads -dotnet_diagnostic.S3997.severity = none - -# S3996: URI properties should not be strings -dotnet_diagnostic.S3996.severity = none - -# S3995: URI return values should not be strings -dotnet_diagnostic.S3995.severity = none - -# S3994: URI Parameters should not be strings -dotnet_diagnostic.S3994.severity = none - -# S3993: Custom attributes should be marked with "System.AttributeUsageAttribute" -dotnet_diagnostic.S3993.severity = none - -# S3992: Assemblies should explicitly specify COM visibility -dotnet_diagnostic.S3992.severity = none - -# S3990: Assemblies should be marked as CLS compliant -dotnet_diagnostic.S3990.severity = none - -# S3956: "Generic.List" instances should not be part of public APIs -dotnet_diagnostic.S3956.severity = none - -# S3909: Collections should implement the generic interface -dotnet_diagnostic.S3909.severity = none - -# S3908: Generic event handlers should be used -dotnet_diagnostic.S3908.severity = none - -# S3906: Event Handlers should have the correct signature -dotnet_diagnostic.S3906.severity = none - -# S3902: "Assembly.GetExecutingAssembly" should not be called -dotnet_diagnostic.S3902.severity = none - -# S3900: Arguments of public methods should be validated against null -dotnet_diagnostic.S3900.severity = none - -# S3898: Value types should implement "IEquatable" -dotnet_diagnostic.S3898.severity = none - -# S3880: Finalizers should not be empty -dotnet_diagnostic.S3880.severity = none - -# S3431: "[ExpectedException]" should not be used -dotnet_diagnostic.S3431.severity = none - -# S3366: "this" should not be exposed from constructors -dotnet_diagnostic.S3366.severity = none - -# S3059: Types should not have members with visibility set higher than the type's visibility -dotnet_diagnostic.S3059.severity = none - -# S2357: Fields should be private -dotnet_diagnostic.S2357.severity = none - -# S2327: "try" statements with identical "catch" and/or "finally" blocks should be merged -dotnet_diagnostic.S2327.severity = none - -# S1696: NullReferenceException should not be caught -dotnet_diagnostic.S1696.severity = none - -# S138: Functions should not have too many lines of code -dotnet_diagnostic.S138.severity = none - -# S127: "for" loop stop conditions should be invariant -dotnet_diagnostic.S127.severity = none - -# S122: Statements should be on separate lines -dotnet_diagnostic.S122.severity = none - -# S1200: Classes should not be coupled to too many other classes (Single Responsibility Principle) -dotnet_diagnostic.S1200.severity = none - -# S1151: "switch case" clauses should not have too many lines of code -dotnet_diagnostic.S1151.severity = none - -# S109: Magic numbers should not be used -dotnet_diagnostic.S109.severity = none - -# S106: Standard outputs should not be used directly to log anything -dotnet_diagnostic.S106.severity = none - -# S104: Files should not have too many lines of code -dotnet_diagnostic.S104.severity = none - -# S103: Lines should not be too long -dotnet_diagnostic.S103.severity = none - -# S5167: HTTP response headers should not be vulnerable to injection attacks -dotnet_diagnostic.S5167.severity = none - -# S2228: Console logging should not be used -dotnet_diagnostic.S2228.severity = none - -# S2955: Generic parameters not constrained to reference types should not be compared to "null" -dotnet_diagnostic.S2955.severity = none - -# S2674: The length returned from a stream read should be checked -dotnet_diagnostic.S2674.severity = none - -# S1226: Method parameters, caught exceptions and foreach variables' initial values should not be ignored -dotnet_diagnostic.S1226.severity = none - -# S4834: Controlling permissions is security-sensitive -dotnet_diagnostic.S4834.severity = none - -# S2255: Writing cookies is security-sensitive -dotnet_diagnostic.S2255.severity = none - -# S4261: Methods should be named according to their synchronicities -dotnet_diagnostic.S4261.severity = none - -# S4226: Extensions should be in separate namespaces -dotnet_diagnostic.S4226.severity = none - -# S4225: Extension methods should not extend "object" -dotnet_diagnostic.S4225.severity = none - -# S4069: Operator overloads should have named alternatives -dotnet_diagnostic.S4069.severity = none - -# S4060: Non-abstract attributes should be sealed -dotnet_diagnostic.S4060.severity = none - -# S4058: Overloads with a "StringComparison" parameter should be used -dotnet_diagnostic.S4058.severity = none - -# S4056: Overloads with a "CultureInfo" or an "IFormatProvider" parameter should be used -dotnet_diagnostic.S4056.severity = none - -# S4052: Types should not extend outdated base types -dotnet_diagnostic.S4052.severity = none - -# S4049: Properties should be preferred -dotnet_diagnostic.S4049.severity = none - -# S4047: Generics should be used when appropriate -dotnet_diagnostic.S4047.severity = none - -# S4041: Type names should not match namespaces -dotnet_diagnostic.S4041.severity = none - -# S4040: Strings should be normalized to uppercase -dotnet_diagnostic.S4040.severity = none - -# S4027: Exceptions should provide standard constructors -dotnet_diagnostic.S4027.severity = none - -# S4026: Assemblies should be marked with "NeutralResourcesLanguageAttribute" -dotnet_diagnostic.S4026.severity = none - -# S4023: Interfaces should not be empty -dotnet_diagnostic.S4023.severity = none - -# S4022: Enumerations should have "Int32" storage -dotnet_diagnostic.S4022.severity = none - -# S4018: Generic methods should provide type parameters -dotnet_diagnostic.S4018.severity = none - -# S3967: Multidimensional arrays should not be used -dotnet_diagnostic.S3967.severity = none - -# S3962: "static readonly" constants should be "const" instead -dotnet_diagnostic.S3962.severity = none - -# S3876: Strings or integral types should be used for indexers -dotnet_diagnostic.S3876.severity = none - -# S3872: Parameter names should not duplicate the names of their methods -dotnet_diagnostic.S3872.severity = none - -# S3717: Track use of "NotImplementedException" -dotnet_diagnostic.S3717.severity = none - -# S3532: Empty "default" clauses should be removed -dotnet_diagnostic.S3532.severity = none - -# S3441: Redundant property names should be omitted in anonymous classes -dotnet_diagnostic.S3441.severity = none - -# S3257: Declarations and initializations should be as concise as possible -dotnet_diagnostic.S3257.severity = none - -# S3254: Default parameter values should not be passed as arguments -dotnet_diagnostic.S3254.severity = none - -# S3253: Constructor and destructor declarations should not be redundant -dotnet_diagnostic.S3253.severity = none - -# S3242: Method parameters should be declared with base types -dotnet_diagnostic.S3242.severity = none - -# S3240: The simplest possible condition syntax should be used -dotnet_diagnostic.S3240.severity = none - -# S3235: Redundant parentheses should not be used -dotnet_diagnostic.S3235.severity = none - -# S3234: "GC.SuppressFinalize" should not be invoked for types without destructors -dotnet_diagnostic.S3234.severity = none - -# S3052: Members should not be initialized to default values -dotnet_diagnostic.S3052.severity = none - -# S2760: Sequential tests should not check the same condition -dotnet_diagnostic.S2760.severity = none - -# S2333: Redundant modifiers should not be used -dotnet_diagnostic.S2333.severity = none - -# S2325: Methods and properties that don't access instance data should be static -dotnet_diagnostic.S2325.severity = none - -# S2221: "Exception" should not be caught when not required by called methods -dotnet_diagnostic.S2221.severity = none - -# S2156: "sealed" classes should not have "protected" members -dotnet_diagnostic.S2156.severity = none - -# S2148: Underscores should be used to make large numbers readable -dotnet_diagnostic.S2148.severity = none - -# S1858: "ToString()" calls should not be redundant -dotnet_diagnostic.S1858.severity = none - -# S1698: "=" should not be used when "Equals" is overridden -dotnet_diagnostic.S1698.severity = none - -# S1694: An abstract class should have both abstract and concrete methods -dotnet_diagnostic.S1694.severity = none - -# S1659: Multiple variables should not be declared on the same line -dotnet_diagnostic.S1659.severity = none - -# S1449: Culture should be specified for "string" operations -dotnet_diagnostic.S1449.severity = none - -# S1301: "switch" statements should have at least 3 "case" clauses -dotnet_diagnostic.S1301.severity = none - -# S1227: break statements should not be used except for switch cases -dotnet_diagnostic.S1227.severity = none - -# S1192: String literals should not be duplicated -dotnet_diagnostic.S1192.severity = none - -# S113: Files should contain an empty newline at the end -dotnet_diagnostic.S113.severity = none - -# S1128: Unused "using" should be removed -dotnet_diagnostic.S1128.severity = none - -# S1109: A close curly brace should be located at the beginning of a line -dotnet_diagnostic.S1109.severity = none - -# S105: Tabulation characters should not be used -dotnet_diagnostic.S105.severity = none - -# S100: Methods and properties should be named in PascalCase -dotnet_diagnostic.S100.severity = none - -# S1309: Track uses of in-source issue suppressions -dotnet_diagnostic.S1309.severity = none \ No newline at end of file diff --git a/KenticoInspector.Reports/ApplicationRestartAnalysis/Models/Data/CmsEventLog.cs b/KenticoInspector.Reports/ApplicationRestartAnalysis/Models/Data/CmsEventLog.cs deleted file mode 100644 index ed2431e1..00000000 --- a/KenticoInspector.Reports/ApplicationRestartAnalysis/Models/Data/CmsEventLog.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace KenticoInspector.Reports.ApplicationRestartAnalysis.Models.Data -{ - public class CmsEventLog - { - public int EventID { get; set; } - - public string EventCode { get; set; } - - public DateTime EventTime { get; set; } - - public string EventMachineName { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ApplicationRestartAnalysis/Models/Terms.cs b/KenticoInspector.Reports/ApplicationRestartAnalysis/Models/Terms.cs deleted file mode 100644 index ed09d154..00000000 --- a/KenticoInspector.Reports/ApplicationRestartAnalysis/Models/Terms.cs +++ /dev/null @@ -1,23 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.ApplicationRestartAnalysis.Models -{ - public class Terms - { - public Summaries Summaries { get; set; } - - public TableTitles TableTitles { get; set; } - } - - public class Summaries - { - public Term Good { get; set; } - - public Term Information { get; set; } - } - - public class TableTitles - { - public Term ApplicationRestartEvents { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ClassTableValidation/Models/ClassWithNoTable.cs b/KenticoInspector.Reports/ClassTableValidation/Models/ClassWithNoTable.cs deleted file mode 100644 index 07d186ca..00000000 --- a/KenticoInspector.Reports/ClassTableValidation/Models/ClassWithNoTable.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace KenticoInspector.Reports.ClassTableValidation.Models -{ - public class ClassWithNoTable - { - public string ClassDisplayName { get; set; } - - public string ClassName { get; set; } - - public string ClassTableName { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ClassTableValidation/Models/TableWithNoClass.cs b/KenticoInspector.Reports/ClassTableValidation/Models/TableWithNoClass.cs deleted file mode 100644 index a0ba5b85..00000000 --- a/KenticoInspector.Reports/ClassTableValidation/Models/TableWithNoClass.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace KenticoInspector.Reports.ClassTableValidation.Models -{ - public class TableWithNoClass - { - public string TableName { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ClassTableValidation/Models/Terms.cs b/KenticoInspector.Reports/ClassTableValidation/Models/Terms.cs deleted file mode 100644 index ec986fd1..00000000 --- a/KenticoInspector.Reports/ClassTableValidation/Models/Terms.cs +++ /dev/null @@ -1,12 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.ClassTableValidation.Models -{ - public class Terms - { - public Term CountIssueFound { get; set; } - public Term DatabaseTablesWithMissingKenticoClasses { get; set; } - public Term KenticoClassesWithMissingDatabaseTables { get; set; } - public Term NoIssuesFound { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ColumnFieldValidation/Models/Data/CmsClass.cs b/KenticoInspector.Reports/ColumnFieldValidation/Models/Data/CmsClass.cs deleted file mode 100644 index 7a13130d..00000000 --- a/KenticoInspector.Reports/ColumnFieldValidation/Models/Data/CmsClass.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Xml.Linq; - -namespace KenticoInspector.Reports.ColumnFieldValidation.Models.Data -{ - public class CmsClass - { - public int ClassID { get; set; } - - public string ClassName { get; set; } - - public string ClassDisplayName { get; set; } - - public string ClassTableName { get; set; } - - public XDocument ClassXmlSchema { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ColumnFieldValidation/Models/Data/TableColumn.cs b/KenticoInspector.Reports/ColumnFieldValidation/Models/Data/TableColumn.cs deleted file mode 100644 index cc6adc7a..00000000 --- a/KenticoInspector.Reports/ColumnFieldValidation/Models/Data/TableColumn.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace KenticoInspector.Reports.ColumnFieldValidation.Models.Data -{ - public class TableColumn - { - public string Table_Name { get; set; } - - public string Column_Name { get; set; } - - public string Data_Type { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ColumnFieldValidation/Models/Results/CmsClassResult.cs b/KenticoInspector.Reports/ColumnFieldValidation/Models/Results/CmsClassResult.cs deleted file mode 100644 index e6111bb6..00000000 --- a/KenticoInspector.Reports/ColumnFieldValidation/Models/Results/CmsClassResult.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace KenticoInspector.Reports.ColumnFieldValidation.Models.Results -{ - public class CmsClassResult - { - public int ClassID { get; set; } - - public string ClassName { get; set; } - - public string ClassDisplayName { get; set; } - - public string ClassTableName { get; set; } - - public string ClassFieldsNotInTable { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ColumnFieldValidation/Models/Results/TableResult.cs b/KenticoInspector.Reports/ColumnFieldValidation/Models/Results/TableResult.cs deleted file mode 100644 index ad20b5a0..00000000 --- a/KenticoInspector.Reports/ColumnFieldValidation/Models/Results/TableResult.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KenticoInspector.Reports.ColumnFieldValidation.Models.Results -{ - public class TableResult - { - public string TableName { get; set; } - - public string TableColumnsNotInClass { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ColumnFieldValidation/Models/Terms.cs b/KenticoInspector.Reports/ColumnFieldValidation/Models/Terms.cs deleted file mode 100644 index ec2dc160..00000000 --- a/KenticoInspector.Reports/ColumnFieldValidation/Models/Terms.cs +++ /dev/null @@ -1,25 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.ColumnFieldValidation.Models -{ - public class Terms - { - public Summaries Summaries { get; set; } - - public TableTitles TableTitles { get; set; } - } - - public class Summaries - { - public Term Error { get; set; } - - public Term Good { get; set; } - } - - public class TableTitles - { - public Term ClassesWithAddedFields { get; set; } - - public Term TablesWithAddedColumns { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/CoupledDataScriptReplacements.cs b/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/CoupledDataScriptReplacements.cs deleted file mode 100644 index 56bb4706..00000000 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/CoupledDataScriptReplacements.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Collections.Generic; - -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis -{ - public class CoupledDataScriptReplacements - { - public Dictionary Dictionary { get; set; } - - public CoupledDataScriptReplacements(string tableName, string idColumnName) - { - Dictionary = new Dictionary(); - Dictionary.Add("TableName", tableName); - Dictionary.Add("IdColumnName", idColumnName); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassField.cs b/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassField.cs deleted file mode 100644 index 136e5277..00000000 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassField.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis.Models -{ - public class CmsClassField - { - public string Caption { get; set; } - - public string Column { get; set; } - - public string ColumnType { get; set; } - - public string DefaultValue { get; set; } - - public bool IsIdColumn { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassItem.cs b/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassItem.cs deleted file mode 100644 index 9135e40c..00000000 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassItem.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Xml; - -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis.Models -{ - public class CmsClassItem - { - private string _classIdColumn = null; - private List _classFields = null; - - public string ClassDisplayName { get; set; } - - public XmlDocument ClassFormDefinitionXml { get; set; } - - public int ClassID { get; set; } - - public string ClassName { get; set; } - - public string ClassTableName { get; set; } - - public List ClassFields - { - get - { - if (_classFields == null && ClassFormDefinitionXml != null) - { - _classFields = GetFieldsFromXml(); - } - - return _classFields; - } - } - - public string ClassIDColumn - { - get - { - if (_classIdColumn == null && ClassFormDefinitionXml != null) - { - _classIdColumn = ClassFields.Where(x => x.IsIdColumn).Select(x => x.Column).FirstOrDefault(); - } - - return _classIdColumn; - } - } - - private List GetFieldsFromXml() - { - var fields = new List(); - var fieldsXml = ClassFormDefinitionXml.SelectNodes("/form/field"); - - foreach (XmlNode field in fieldsXml) - { - var isIdColumnRaw = field.Attributes["isPK"]?.Value; - var isIdColumn = !string.IsNullOrWhiteSpace(isIdColumnRaw) ? bool.Parse(isIdColumnRaw) : false; - - fields.Add(new CmsClassField - { - Caption = field.SelectSingleNode("properties/fieldcaption")?.InnerText, - Column = field.Attributes["column"].Value, - ColumnType = field.Attributes["columntype"].Value, - DefaultValue = field.SelectSingleNode("properties/defaultvalue")?.InnerText, - IsIdColumn = isIdColumn - }); - } - - return fields; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/GetDetailsParameters.cs b/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/GetDetailsParameters.cs deleted file mode 100644 index 42eae9a8..00000000 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/GetDetailsParameters.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis.Models -{ - public class GetDetailsParameters - { - public int[] IDs { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/Terms.cs b/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/Terms.cs deleted file mode 100644 index 61f4bf2b..00000000 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/Terms.cs +++ /dev/null @@ -1,19 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis.Models -{ - public class Terms - { - public Term DocumentNodesWithNoTreeNode { get; set; } - public Term NameFound { get; set; } - public Term NoContentTreeConsistencyIssuesFound { get; set; } - public Term TreeNodesWithABadParentNode { get; set; } - public Term TreeNodesWithABadParentSite { get; set; } - public Term TreeNodesWithDuplicatedAliasPath { get; set; } - public Term TreeNodesWithLevelInconsistencyAliasPath { get; set; } - public Term TreeNodesWithLevelInconsistencyParent { get; set; } - public Term TreeNodesWithNoDocumentNode { get; set; } - public Term TreeNodesWithPageTypeNotAssignedToSite { get; set; } - public Term WorkflowInconsistencies { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Report.cs b/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Report.cs deleted file mode 100644 index a136eda3..00000000 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Report.cs +++ /dev/null @@ -1,197 +0,0 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.ContentTreeConsistencyAnalysis.Models; - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis -{ - public class Report : AbstractReport - { - private readonly IDatabaseService databaseService; - - public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) - { - this.databaseService = databaseService; - } - - public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); - - public override IList Tags => new List() - { - ReportTags.Health, - ReportTags.Consistency - }; - - public override ReportResults GetResults() - { - var treeNodeWithBadParentSiteResults = GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithABadParentSite, Scripts.GetTreeNodeIdsWithBadParentSiteId); - var treeNodeWithBadParentNodeResults = GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithABadParentNode, Scripts.GetTreeNodeIdsWithBadParentNodeId); - var treeNodeWithLevelInconsistencyAliasatPathTestResults = GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithLevelInconsistencyAliasPath, Scripts.GetTreeNodeIdsWithLevelMismatchByAliasPathTest); - var treeNodeWithLevelInconsistencyParentChildLevelTestResults = GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithLevelInconsistencyParent, Scripts.GetTreeNodeIdsWithLevelMismatchByNodeLevelTest); - var treeNodeWithMissingDocumentResults = GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithNoDocumentNode, Scripts.GetTreeNodeIdsWithMissingDocument); - var treeNodeWithDuplicateAliasPathResults = GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithDuplicatedAliasPath, Scripts.GetTreeNodeIdsWithDuplicatedAliasPath); - var treeNodeWithPageTypeNotAssignedToSiteResults = GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithPageTypeNotAssignedToSite, Scripts.GetTreeNodeIdsWithPageTypeNotAssignedToSite); - var documentNodesWithMissingTreeNodeResults = GetDocumentNodeTestResult(Metadata.Terms.DocumentNodesWithNoTreeNode, Scripts.GetDocumentIdsWithMissingTreeNode); - - var workflowInconsistenciesResults = GetWorkflowInconsistencyResult(); - - return CompileResults( - treeNodeWithBadParentSiteResults, - treeNodeWithBadParentNodeResults, - treeNodeWithLevelInconsistencyAliasatPathTestResults, - treeNodeWithLevelInconsistencyParentChildLevelTestResults, - treeNodeWithMissingDocumentResults, - treeNodeWithDuplicateAliasPathResults, - treeNodeWithPageTypeNotAssignedToSiteResults, - documentNodesWithMissingTreeNodeResults, - workflowInconsistenciesResults - ); - } - - private IEnumerable CompareVersionHistoryItemsWithPublishedItems(IEnumerable versionHistoryItems, IEnumerable> coupledData, IEnumerable cmsClassFields) - { - var issues = new List(); - var idColumnName = cmsClassFields.FirstOrDefault(x => x.IsIdColumn).Column; - - foreach (var versionHistoryItem in versionHistoryItems) - { - var coupledDataItem = coupledData.FirstOrDefault(x => (int)x[idColumnName] == versionHistoryItem.CoupledDataID); - - if (coupledDataItem != null) - { - foreach (var cmsClassField in cmsClassFields) - { - var historyVersionValueRaw = versionHistoryItem.NodeXml.SelectSingleNode($"//{cmsClassField.Column}")?.InnerText ?? cmsClassField.DefaultValue; - var coupledDataItemValue = coupledDataItem[cmsClassField.Column]; - var columnName = cmsClassField.Caption ?? cmsClassField.Column; - var versionHistoryMismatchResult = new VersionHistoryMismatchResult(versionHistoryItem.DocumentID, columnName, cmsClassField.ColumnType, historyVersionValueRaw, coupledDataItemValue); - - if (!versionHistoryMismatchResult.FieldValuesMatch) - { - issues.Add(versionHistoryMismatchResult); - } - } - } - } - - return issues; - } - - private ReportResults CompileResults(params ReportResults[] allReportResults) - { - var combinedResults = new ReportResults(); - - combinedResults.Type = ResultsType.TableList; - combinedResults.Status = ResultsStatus.Good; - - var summaryBuilder = new StringBuilder(); - foreach (var reportResults in allReportResults) - { - var name = ((string)reportResults.Data.Name); - ((IDictionary)combinedResults.Data).Add(reportResults.Data.Name, reportResults.Data); - if (reportResults.Status == ResultsStatus.Error) - { - summaryBuilder.Append(Metadata.Terms.NameFound.With(new { name })); - combinedResults.Status = ResultsStatus.Error; - } - } - - combinedResults.Summary = summaryBuilder.ToString(); - if (combinedResults.Status == ResultsStatus.Good) - { - combinedResults.Summary = Metadata.Terms.NoContentTreeConsistencyIssuesFound; - } - - return combinedResults; - } - - private IEnumerable GetCmsClassItems(IEnumerable versionHistoryItems) - { - var cmsClassIds = versionHistoryItems.Select(vhi => vhi.VersionClassID); - return databaseService.ExecuteSqlFromFile(Scripts.GetCmsClassItems, new { IDs = cmsClassIds.ToArray() }); - } - - private IEnumerable> GetCoupledData(CmsClassItem cmsClassItem, IEnumerable Ids) - { - var replacements = new CoupledDataScriptReplacements(cmsClassItem.ClassTableName, cmsClassItem.ClassIDColumn); - return databaseService.ExecuteSqlFromFileGeneric(Scripts.GetCmsDocumentCoupledDataItems, replacements.Dictionary, new { IDs = Ids.ToArray() }); - } - - private ReportResults GetDocumentNodeTestResult(string name, string script) - { - return GetTestResult(name, script, Scripts.GetDocumentNodeDetails); - } - - private ReportResults GetTestResult(string name, string script, string getDetailsScript) - { - var nodeIds = databaseService.ExecuteSqlFromFile(script); - var details = databaseService.ExecuteSqlFromFile(getDetailsScript, new { IDs = nodeIds.ToArray() }); - - var data = new TableResult - { - Name = name, - Rows = details - }; - - return new ReportResults - { - Data = data, - Status = data.Rows.Any() ? ResultsStatus.Error : ResultsStatus.Good, - Summary = string.Empty, - Type = ResultsType.Table, - }; - } - - private ReportResults GetTreeNodeTestResult(string name, string script) - { - return GetTestResult(name, script, Scripts.GetTreeNodeDetails); - } - - private IEnumerable GetVersionHistoryItems() - { - var latestVersionHistoryIds = databaseService.ExecuteSqlFromFile(Scripts.GetLatestVersionHistoryIdForAllDocuments); - return databaseService.ExecuteSqlFromFile(Scripts.GetVersionHistoryDetails, new { IDs = latestVersionHistoryIds.ToArray() }); - } - - private ReportResults GetWorkflowInconsistencyResult() - { - var versionHistoryItems = GetVersionHistoryItems(); - var cmsClassItems = GetCmsClassItems(versionHistoryItems); - var comparisonResults = new List(); - foreach (var cmsClass in cmsClassItems) - { - var cmsClassVersionHistoryItems = versionHistoryItems.Where(vhi => vhi.VersionClassID == cmsClass.ClassID); - var coupledDataIds = cmsClassVersionHistoryItems.Select(x => x.CoupledDataID).Where(x => x > 0); - if (!coupledDataIds.Any()) - { - continue; - } - - var coupledData = GetCoupledData(cmsClass, coupledDataIds); - var classComparisionResults = CompareVersionHistoryItemsWithPublishedItems(versionHistoryItems, coupledData, cmsClass.ClassFields); - comparisonResults.AddRange(classComparisionResults); - } - - var data = new TableResult - { - Name = Metadata.Terms.WorkflowInconsistencies, - Rows = comparisonResults - }; - - return new ReportResults - { - Data = data, - Status = data.Rows.Any() ? ResultsStatus.Error : ResultsStatus.Good, - Summary = string.Empty, - Type = ResultsType.Table, - }; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/DatabaseConsistencyCheck/Models/Terms.cs b/KenticoInspector.Reports/DatabaseConsistencyCheck/Models/Terms.cs deleted file mode 100644 index a0982fd2..00000000 --- a/KenticoInspector.Reports/DatabaseConsistencyCheck/Models/Terms.cs +++ /dev/null @@ -1,11 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.DatabaseConsistencyCheck.Models -{ - public class Terms - { - public Term CheckResultsTableForAnyIssues { get; set; } - - public Term NoIssuesFound { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/DatabaseTableSizeAnalysis/Models/Terms.cs b/KenticoInspector.Reports/DatabaseTableSizeAnalysis/Models/Terms.cs deleted file mode 100644 index 30588036..00000000 --- a/KenticoInspector.Reports/DatabaseTableSizeAnalysis/Models/Terms.cs +++ /dev/null @@ -1,11 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.DatabaseTableSizeAnalysis.Models -{ - public class Terms - { - public Term CheckResultsTableForAnyIssues { get; set; } - - public Term Top25Results { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/DatabaseTableSizeAnalysis/Report.cs b/KenticoInspector.Reports/DatabaseTableSizeAnalysis/Report.cs deleted file mode 100644 index ea70affd..00000000 --- a/KenticoInspector.Reports/DatabaseTableSizeAnalysis/Report.cs +++ /dev/null @@ -1,45 +0,0 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.DatabaseTableSizeAnalysis.Models; - -using System; -using System.Collections.Generic; - -namespace KenticoInspector.Reports.DatabaseTableSizeAnalysis -{ - public class Report : AbstractReport - { - private readonly IDatabaseService databaseService; - - public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) - { - this.databaseService = databaseService; - } - - public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); - - public override IList Tags => new List { - ReportTags.Health - }; - - public override ReportResults GetResults() - { - var top25LargestTables = databaseService.ExecuteSqlFromFile(Scripts.GetTop25LargestTables); - - return new ReportResults - { - Type = ResultsType.Table, - Status = ResultsStatus.Information, - Summary = Metadata.Terms.CheckResultsTableForAnyIssues, - Data = new TableResult() - { - Name = Metadata.Terms.Top25Results, - Rows = top25LargestTables - } - }; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/DebugConfigurationAnalysis/Models/Terms.cs b/KenticoInspector.Reports/DebugConfigurationAnalysis/Models/Terms.cs deleted file mode 100644 index 0826b521..00000000 --- a/KenticoInspector.Reports/DebugConfigurationAnalysis/Models/Terms.cs +++ /dev/null @@ -1,33 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.DebugConfigurationAnalysis.Models -{ - public class DatabaseTerms - { - public Term ExplicitlyEnabledSettingsTableHeader { get; set; } - - public Term OverviewTableHeader { get; set; } - - public Term Summary { get; set; } - } - - public class Terms - { - public DatabaseTerms Database { get; set; } - - public WebConfigTerms WebConfig { get; set; } - - public Term CheckResultsTableForAnyIssues { get; set; } - } - - public class WebConfigTerms - { - public Term DebugKeyDisplayName { get; set; } - - public Term OverviewTableHeader { get; set; } - - public Term Summary { get; set; } - - public Term TraceKeyDisplayName { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/Directory.Build.props b/KenticoInspector.Reports/Directory.Build.props deleted file mode 100644 index c4e59780..00000000 --- a/KenticoInspector.Reports/Directory.Build.props +++ /dev/null @@ -1,8 +0,0 @@ - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - \ No newline at end of file diff --git a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/AutomationTriggerResult.cs b/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/AutomationTriggerResult.cs deleted file mode 100644 index e0521157..00000000 --- a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/AutomationTriggerResult.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace KenticoInspector.Reports.OnlineMarketingMacroAnalysis.Models -{ - public class AutomationTriggerResult - { - public string ProcessName { get; set; } - - public string TriggerName { get; set; } - - public string Macro { get; set; } - } -} diff --git a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ContactGroupResult.cs b/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ContactGroupResult.cs deleted file mode 100644 index 37128f4b..00000000 --- a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ContactGroupResult.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KenticoInspector.Reports.OnlineMarketingMacroAnalysis.Models -{ - public class ContactGroupResult - { - public string ContactGroup { get; set; } - - public string Macro { get; set; } - } -} diff --git a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ScoreRuleResult.cs b/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ScoreRuleResult.cs deleted file mode 100644 index 030909f3..00000000 --- a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ScoreRuleResult.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace KenticoInspector.Reports.OnlineMarketingMacroAnalysis.Models -{ - public class ScoreRuleResult - { - public string ScoreName { get; set; } - - public string RuleName { get; set; } - - public string Macro { get; set; } - } -} diff --git a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Terms.cs b/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Terms.cs deleted file mode 100644 index 7e4af8cd..00000000 --- a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Models/Terms.cs +++ /dev/null @@ -1,17 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.OnlineMarketingMacroAnalysis.Models -{ - public class Terms - { - public Term Good { get; set; } - - public Term IssuesFound { get; set; } - - public Term ContactGroupTable { get; set; } - - public Term AutomationTriggerTable { get; set; } - - public Term ScoreRuleTable { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Report.cs b/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Report.cs deleted file mode 100644 index 5c78d132..00000000 --- a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Report.cs +++ /dev/null @@ -1,79 +0,0 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.OnlineMarketingMacroAnalysis.Models; - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace KenticoInspector.Reports.OnlineMarketingMacroAnalysis -{ - public class Report : AbstractReport - { - private readonly IDatabaseService databaseService; - - public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) - { - this.databaseService = databaseService; - } - - public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); - - public override IList Tags => new List { - ReportTags.Performance, - ReportTags.OnlineMarketing - }; - - public override ReportResults GetResults() - { - var contactGroups = databaseService.ExecuteSqlFromFile(Scripts.GetManualContactGroupMacroConditions); - var automationTriggers = databaseService.ExecuteSqlFromFile(Scripts.GetManualTimeBasedTriggerMacroConditions); - var scoreRules = databaseService.ExecuteSqlFromFile(Scripts.GetManualScoreRuleMacroConditions); - if (!contactGroups.Any() && !automationTriggers.Any() && !scoreRules.Any()) - { - return new ReportResults - { - Status = ResultsStatus.Good, - Summary = Metadata.Terms.Good - }; - } - - var totalIssues = contactGroups.Count() + automationTriggers.Count() + scoreRules.Count(); - var results = new ReportResults - { - Type = ResultsType.TableList, - Status = ResultsStatus.Warning, - Summary = Metadata.Terms.IssuesFound.With(new - { - totalIssues - }) - }; - var contactGroupResults = new TableResult() - { - Name = Metadata.Terms.ContactGroupTable, - Rows = contactGroups - }; - - var automationTriggerResults = new TableResult() - { - Name = Metadata.Terms.AutomationTriggerTable, - Rows = automationTriggers - }; - - var scoreRuleResults = new TableResult() - { - Name = Metadata.Terms.ScoreRuleTable, - Rows = scoreRules - }; - - results.Data.AutomationTriggerTable = automationTriggerResults; - results.Data.ContactGroupTable = contactGroupResults; - results.Data.ScoreRuleTable = scoreRuleResults; - - return results; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Models/PageType.cs b/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Models/PageType.cs deleted file mode 100644 index 722a3ded..00000000 --- a/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Models/PageType.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace KenticoInspector.Reports.PageTypeAssignmentAnalysis.Models -{ - public class PageType - { - public string ClassDisplayName { get; set; } - - public string ClassName { get; set; } - - public int NodeClassID { get; set; } - - public int NodeSiteID { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Models/Terms.cs b/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Models/Terms.cs deleted file mode 100644 index e69402d8..00000000 --- a/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Models/Terms.cs +++ /dev/null @@ -1,13 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.PageTypeAssignmentAnalysis.Models -{ - public class Terms - { - public Term WarningSummary { get; set; } - - public Term UnassignedPageTypesTableHeader { get; set; } - - public Term NoIssuesFound { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Report.cs b/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Report.cs deleted file mode 100644 index 7a6e5659..00000000 --- a/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Report.cs +++ /dev/null @@ -1,62 +0,0 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.PageTypeAssignmentAnalysis.Models; - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace KenticoInspector.Reports.PageTypeAssignmentAnalysis -{ - public class Report : AbstractReport - { - private readonly IDatabaseService databaseService; - - public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) - { - this.databaseService = databaseService; - } - - public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); - - public override IList Tags => new List - { - ReportTags.Health, - ReportTags.Consistency - }; - - public override ReportResults GetResults() - { - var unassignedPageTypes = databaseService.ExecuteSqlFromFile(Scripts.GetPageTypesNotAssignedToSite); - - return CompileResults(unassignedPageTypes); - } - - private ReportResults CompileResults(IEnumerable unassignedPageTypes) - { - var results = new ReportResults - { - Status = ResultsStatus.Good, - Summary = Metadata.Terms.NoIssuesFound, - Type = ResultsType.Table, - Data = new TableResult() - { - Name = Metadata.Terms.UnassignedPageTypesTableHeader, - Rows = unassignedPageTypes - } - }; - - var unassignedPageTypeCount = unassignedPageTypes.Count(); - if (unassignedPageTypeCount > 0) - { - results.Status = ResultsStatus.Warning; - results.Summary = Metadata.Terms.WarningSummary.With(new { unassignedPageTypeCount }); - } - - return results; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/PageTypeFieldAnalysis/Models/Terms.cs b/KenticoInspector.Reports/PageTypeFieldAnalysis/Models/Terms.cs deleted file mode 100644 index 1c440bff..00000000 --- a/KenticoInspector.Reports/PageTypeFieldAnalysis/Models/Terms.cs +++ /dev/null @@ -1,23 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.PageTypeFieldAnalysis.Models -{ - public class Terms - { - public Summaries Summaries { get; set; } - - public TableTitles TableTitles { get; set; } - } - - public class Summaries - { - public Term Information { get; set; } - - public Term Good { get; set; } - } - - public class TableTitles - { - public Term MatchingPageTypeFieldsWithDifferentDataTypes { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/PageTypeFieldAnalysis/Report.cs b/KenticoInspector.Reports/PageTypeFieldAnalysis/Report.cs deleted file mode 100644 index 995300ba..00000000 --- a/KenticoInspector.Reports/PageTypeFieldAnalysis/Report.cs +++ /dev/null @@ -1,85 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.PageTypeFieldAnalysis.Models; - -namespace KenticoInspector.Reports.PageTypeFieldAnalysis -{ - public class Report : AbstractReport - { - private readonly IDatabaseService databaseService; - - public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) - : base(moduleMetadataService) - { - this.databaseService = databaseService; - } - - public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); - - public override IList Tags => new List - { - ReportTags.Information, - ReportTags.Health - }; - - public override ReportResults GetResults() - { - var pagetypeFields = databaseService.ExecuteSqlFromFile(Scripts.GetCmsPageTypeFields); - var fieldsWithMismatchedTypes = CheckForMismatchedTypes(pagetypeFields); - - return CompileResults(fieldsWithMismatchedTypes); - } - - - private ReportResults CompileResults(IEnumerable fieldsWithMismatchedTypes) - { - if (!fieldsWithMismatchedTypes.Any()) - { - return new ReportResults - { - Status = ResultsStatus.Good, - Summary = Metadata.Terms.Summaries.Good - }; - } - - var fieldResultCount = fieldsWithMismatchedTypes.Count(); - var fieldResults = new TableResult() - { - Name = Metadata.Terms.TableTitles.MatchingPageTypeFieldsWithDifferentDataTypes, - Rows = fieldsWithMismatchedTypes - }; - - var results = new ReportResults - { - Type = ResultsType.TableList, - Status = ResultsStatus.Information, - Summary = Metadata.Terms.Summaries.Information.With(new { fieldResultCount }), - - }; - - results.Data.FieldResults = fieldResults; - - return results; - } - - private IEnumerable CheckForMismatchedTypes(IEnumerable pagetypeFields) - { - var fieldsWithMismatchedTypes = - pagetypeFields - .Distinct() - .GroupBy(x => x.FieldName) - .Where(g => g.Count() > 1) - .SelectMany(g => g) - .OrderBy(i => i.FieldName); - - return fieldsWithMismatchedTypes; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/RobotsTxtConfigurationSummary/Models/Terms.cs b/KenticoInspector.Reports/RobotsTxtConfigurationSummary/Models/Terms.cs deleted file mode 100644 index dc34addd..00000000 --- a/KenticoInspector.Reports/RobotsTxtConfigurationSummary/Models/Terms.cs +++ /dev/null @@ -1,11 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.RobotsTxtConfigurationSummary.Models -{ - public class Terms - { - public Term RobotsTxtFound { get; set; } - - public Term RobotsTxtNotFound { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/RobotsTxtConfigurationSummary/Report.cs b/KenticoInspector.Reports/RobotsTxtConfigurationSummary/Report.cs deleted file mode 100644 index 91336f2e..00000000 --- a/KenticoInspector.Reports/RobotsTxtConfigurationSummary/Report.cs +++ /dev/null @@ -1,70 +0,0 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.RobotsTxtConfigurationSummary.Models; - -using System; -using System.Collections.Generic; -using System.Net; -using System.Net.Http; -using System.Net.Security; -using System.Threading.Tasks; - -namespace KenticoInspector.Reports.RobotsTxtConfigurationSummary -{ - public class Report : AbstractReport - { - private readonly IInstanceService instanceService; - private readonly HttpClient _httpClient = new HttpClient(); - - public Report( - IInstanceService instanceService, - IModuleMetadataService moduleMetadataService, - HttpClient httpClient = null - ) : base(moduleMetadataService) - - { - this.instanceService = instanceService; - - if (httpClient != null) - { - _httpClient = httpClient; - } - } - - public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12"); - - public override IList IncompatibleVersions => VersionHelper.GetVersionList("13"); - - public override IList Tags => new List - { - ReportTags.Information, - ReportTags.SEO, - }; - - public override ReportResults GetResults() - { - var instanceUri = new Uri(instanceService.CurrentInstance.AdminUrl); - var testUri = new Uri(instanceUri, Constants.RobotsTxtRelativePath); - var found = ConfirmUriStatusCode(testUri, HttpStatusCode.OK).Result; - - return new ReportResults - { - Data = string.Empty, - Status = found ? ResultsStatus.Good : ResultsStatus.Warning, - Summary = found ? Metadata.Terms.RobotsTxtFound : Metadata.Terms.RobotsTxtNotFound, - Type = ResultsType.String - }; - } - - private async Task ConfirmUriStatusCode(Uri testUri, HttpStatusCode expectedStatusCode) - { - // Ignore invalid certificates - ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((a, b, c, d) => { return true; }); - HttpResponseMessage response = await _httpClient.GetAsync(testUri); - return response.StatusCode == expectedStatusCode; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/SampleReport/Models/Terms.cs b/KenticoInspector.Reports/SampleReport/Models/Terms.cs deleted file mode 100644 index cc49495b..00000000 --- a/KenticoInspector.Reports/SampleReport/Models/Terms.cs +++ /dev/null @@ -1,11 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.SampleReport.Models -{ - public class Terms - { - public Term DetailedResult { get; set; } - - public Term Summary { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/SampleReport/Report.cs b/KenticoInspector.Reports/SampleReport/Report.cs deleted file mode 100644 index 151ce2c2..00000000 --- a/KenticoInspector.Reports/SampleReport/Report.cs +++ /dev/null @@ -1,64 +0,0 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.SampleReport.Models; - -using System; -using System.Collections.Generic; -using System.Text; - -namespace KenticoInspector.Reports.SampleReport -{ - public class Report : AbstractReport - { - private readonly IDatabaseService databaseService; - - public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) - { - this.databaseService = databaseService; - } - - // Hide sample report in UI - public override IList CompatibleVersions => new Version[0]; - - public override IList Tags => new List { - ReportTags.Consistency - }; - - public override ReportResults GetResults() - { - var random = new Random(); - var issueCount = random.Next(0, 3); - var data = new List(); - for (int i = 0; i < issueCount; i++) - { - var name = $"test-{i}"; - var problem = GetRandomString(10); - data.Add(Metadata.Terms.DetailedResult.With(new { name, problem })); - } - - return new ReportResults() - { - Data = data, - Type = ResultsType.StringList, - Status = ResultsStatus.Information, - Summary = Metadata.Terms.Summary.With(new { issueCount }) - }; - } - - private string GetRandomString(int size) - { - var builder = new StringBuilder(); - var random = new Random(); - char ch; - for (int i = 0; i < size; i++) - { - ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); - builder.Append(ch); - } - - return builder.ToString(); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsCategory.cs b/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsCategory.cs deleted file mode 100644 index 19626f23..00000000 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsCategory.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Data -{ - public class CmsSettingsCategory - { - public int CategoryID { get; set; } - - public string CategoryDisplayName { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsKey.cs b/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsKey.cs deleted file mode 100644 index 190fd5b6..00000000 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsKey.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Data -{ - public class CmsSettingsKey - { - public int SiteID { get; set; } - - public int KeyID { get; set; } - - public string KeyName { get; set; } - - public string KeyDisplayName { get; set; } - - public string KeyValue { get; set; } - - public string KeyDefaultValue { get; set; } - - public int KeyCategoryID { get; set; } - - public string CategoryIDPath { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Terms.cs b/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Terms.cs deleted file mode 100644 index a90e421d..00000000 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Terms.cs +++ /dev/null @@ -1,137 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.SecuritySettingsAnalysis.Models -{ - public class Terms - { - public Term GlobalSiteName { get; set; } - - public RecommendationReasons RecommendationReasons { get; set; } - - public RecommendedValues RecommendedValues { get; set; } - - public Summaries Summaries { get; set; } - - public TableTitles TableTitles { get; set; } - } - - public class RecommendedValues - { - public Term Empty { get; set; } - - public Term InvalidLogonAttempts { get; set; } - - public Term NoDangerousExtensions { get; set; } - - public Term NotEmpty { get; set; } - - public Term NotOn { get; set; } - - public Term NotSaUser { get; set; } - - public Term ResetPasswordInterval { get; set; } - - public Term PasswordMinimalLength { get; set; } - - public Term PasswordNumberOfNonAlphaNumChars { get; set; } - - public Term ReCaptcha { get; set; } - } - - public class RecommendationReasons - { - public AppSettings AppSettings { get; set; } - - public ConnectionStrings ConnectionStrings { get; set; } - - public SettingsKeys SettingsKeys { get; set; } - - public SystemWebSettings SystemWebSettings { get; set; } - } - - public class AppSettings - { - public Term CMSEnableCsrfProtection { get; set; } - - public Term CMSHashStringSalt { get; set; } - - public Term CMSRenewSessionAuthChange { get; set; } - - public Term CMSXFrameOptionsExcluded { get; set; } - } - - public class ConnectionStrings - { - public Term SaUser { get; set; } - } - - public class SettingsKeys - { - public Term CMSAutocompleteEnableForLogin { get; set; } - - public Term CMSCaptchaControl { get; set; } - - public Term CMSChatEnableFloodProtection { get; set; } - - public Term CMSFloodProtectionEnabled { get; set; } - - public Term CMSForumAttachmentExtensions { get; set; } - - public Term CMSMaximumInvalidLogonAttempts { get; set; } - - public Term CMSMediaFileAllowedExtensions { get; set; } - - public Term CMSPasswordExpiration { get; set; } - - public Term CMSPasswordExpirationBehaviour { get; set; } - - public Term CMSPasswordFormat { get; set; } - - public Term CMSPolicyMinimalLength { get; set; } - - public Term CMSPolicyNumberOfNonAlphaNumChars { get; set; } - - public Term CMSRegistrationEmailConfirmation { get; set; } - - public Term CMSResetPasswordInterval { get; set; } - - public Term CMSRESTServiceEnabled { get; set; } - - public Term CMSUploadExtensions { get; set; } - - public Term CMSUsePasswordPolicy { get; set; } - - public Term CMSUseSSLForAdministrationInterface { get; set; } - } - - public class SystemWebSettings - { - public Term AuthenticationCookieless { get; set; } - - public Term CompilationDebug { get; set; } - - public Term CustomErrorsMode { get; set; } - - public Term HttpCookiesHttpOnlyCookies { get; set; } - - public Term PagesEnableViewState { get; set; } - - public Term PagesEnableViewStateMac { get; set; } - - public Term TraceEnabled { get; set; } - } - - public class Summaries - { - public Term Warning { get; set; } - - public Term Good { get; set; } - } - - public class TableTitles - { - public Term AdminSecuritySettings { get; set; } - - public Term WebConfigSecuritySettings { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/TaskProcessingAnalysis/Models/Terms.cs b/KenticoInspector.Reports/TaskProcessingAnalysis/Models/Terms.cs deleted file mode 100644 index 3de360cd..00000000 --- a/KenticoInspector.Reports/TaskProcessingAnalysis/Models/Terms.cs +++ /dev/null @@ -1,19 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.TaskProcessingAnalysis.Models -{ - public class Terms - { - public Term CountIntegrationBusTask { get; set; } - - public Term CountScheduledTask { get; set; } - - public Term CountSearchTask { get; set; } - - public Term CountStagingTask { get; set; } - - public Term CountUnprocessedTask { get; set; } - - public Term CountWebFarmTask { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/TaskProcessingAnalysis/Report.cs b/KenticoInspector.Reports/TaskProcessingAnalysis/Report.cs deleted file mode 100644 index d8719c93..00000000 --- a/KenticoInspector.Reports/TaskProcessingAnalysis/Report.cs +++ /dev/null @@ -1,94 +0,0 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.TaskProcessingAnalysis.Models; - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace KenticoInspector.Reports.TaskProcessingAnalysis -{ - public class Report : AbstractReport - { - private readonly IDatabaseService databaseService; - - public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) - { - this.databaseService = databaseService; - } - - public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); - - public override IList Tags => new List { - ReportTags.Health - }; - - public override ReportResults GetResults() - { - var unprocessedIntegrationBusTasks = databaseService.ExecuteSqlFromFileScalar(Scripts.GetCountOfUnprocessedIntegrationBusTasks); - var unprocessedScheduledTasks = databaseService.ExecuteSqlFromFileScalar(Scripts.GetCountOfUnprocessedScheduledTasks); - var unprocessedSearchTasks = databaseService.ExecuteSqlFromFileScalar(Scripts.GetCountOfUnprocessedSearchTasks); - var unprocessedStagingTasks = databaseService.ExecuteSqlFromFileScalar(Scripts.GetCountOfUnprocessedStagingTasks); - var unprocessedWebFarmTasks = databaseService.ExecuteSqlFromFileScalar(Scripts.GetCountOfUnprocessedWebFarmTasks); - - var rawResults = new Dictionary - { - { TaskType.IntegrationBusTask, unprocessedIntegrationBusTasks }, - { TaskType.ScheduledTask, unprocessedScheduledTasks }, - { TaskType.SearchTask, unprocessedSearchTasks }, - { TaskType.StagingTask, unprocessedStagingTasks }, - { TaskType.WebFarmTask, unprocessedWebFarmTasks } - }; - - return CompileResults(rawResults); - } - - private string AsTaskCountLabel(KeyValuePair taskTypeCount) - { - Term label = string.Empty; - var count = taskTypeCount.Value; - - switch (taskTypeCount.Key) - { - case TaskType.IntegrationBusTask: - label = Metadata.Terms.CountIntegrationBusTask.With(new { count }); - break; - - case TaskType.ScheduledTask: - label = Metadata.Terms.CountScheduledTask.With(new { count }); - break; - - case TaskType.SearchTask: - label = Metadata.Terms.CountSearchTask.With(new { count }); - break; - - case TaskType.StagingTask: - label = Metadata.Terms.CountStagingTask.With(new { count }); - break; - - case TaskType.WebFarmTask: - label = Metadata.Terms.CountWebFarmTask.With(new { count }); - break; - } - - return label.With(new { count }); - } - - private ReportResults CompileResults(Dictionary taskResults) - { - var totalUnprocessedTasks = taskResults.Sum(x => x.Value); - return new ReportResults() - { - Data = taskResults - .Where(x => x.Value > 0) - .Select(AsTaskCountLabel), - Status = totalUnprocessedTasks > 0 ? ResultsStatus.Warning : ResultsStatus.Good, - Summary = Metadata.Terms.CountUnprocessedTask.With(new { count = totalUnprocessedTasks }), - Type = ResultsType.StringList - }; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/TemplateLayoutAnalysis/Models/IdenticalPageLayouts.cs b/KenticoInspector.Reports/TemplateLayoutAnalysis/Models/IdenticalPageLayouts.cs deleted file mode 100644 index 18bb063d..00000000 --- a/KenticoInspector.Reports/TemplateLayoutAnalysis/Models/IdenticalPageLayouts.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KenticoInspector.Reports.TemplateLayoutAnalysis.Models -{ - public class IdenticalPageLayouts - { - public string CodeNames { get; set; } - - public string PageTemplateLayout { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/TemplateLayoutAnalysis/Models/Terms.cs b/KenticoInspector.Reports/TemplateLayoutAnalysis/Models/Terms.cs deleted file mode 100644 index 4fdbba27..00000000 --- a/KenticoInspector.Reports/TemplateLayoutAnalysis/Models/Terms.cs +++ /dev/null @@ -1,13 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.TemplateLayoutAnalysis.Models -{ - public class Terms - { - public Term CountIdenticalPageLayoutFound { get; set; } - - public Term IdenticalPageLayouts { get; set; } - - public Term NoIdenticalPageLayoutsFound { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/TemplateLayoutAnalysis/Report.cs b/KenticoInspector.Reports/TemplateLayoutAnalysis/Report.cs deleted file mode 100644 index 60c1c29c..00000000 --- a/KenticoInspector.Reports/TemplateLayoutAnalysis/Report.cs +++ /dev/null @@ -1,64 +0,0 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.TemplateLayoutAnalysis.Models; - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace KenticoInspector.Reports.TemplateLayoutAnalysis -{ - public class Report : AbstractReport - { - private readonly IDatabaseService databaseService; - - public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) - { - this.databaseService = databaseService; - } - - public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); - - public override IList Tags => new List - { - ReportTags.Information, - ReportTags.PortalEngine - }; - - public override ReportResults GetResults() - { - var identicalLayouts = databaseService.ExecuteSqlFromFile(Scripts.GetIdenticalLayouts); - - return CompileResults(identicalLayouts); - } - - private ReportResults CompileResults(IEnumerable identicalPageLayouts) - { - var countIdenticalPageLayouts = identicalPageLayouts.Count(); - var results = new ReportResults - { - Status = ResultsStatus.Information, - Type = ResultsType.Table, - Data = new TableResult() - { - Name = Metadata.Terms.IdenticalPageLayouts, - Rows = identicalPageLayouts - } - }; - - if (countIdenticalPageLayouts == 0) - { - results.Summary = Metadata.Terms.NoIdenticalPageLayoutsFound; - } - else - { - results.Summary = Metadata.Terms.CountIdenticalPageLayoutFound.With(new { count = countIdenticalPageLayouts }); - } - - return results; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/TransformationSecurityAnalysis/Models/Data/TransformationDto.cs b/KenticoInspector.Reports/TransformationSecurityAnalysis/Models/Data/TransformationDto.cs deleted file mode 100644 index dac923be..00000000 --- a/KenticoInspector.Reports/TransformationSecurityAnalysis/Models/Data/TransformationDto.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace KenticoInspector.Reports.TransformationSecurityAnalysis.Models.Data -{ - /// - /// Transformation of type . - /// - public class TransformationDto - { - public string TransformationName { get; set; } - - public string TransformationCode { get; set; } - - public TransformationType Type { get; set; } - - public string ClassName { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/TransformationSecurityAnalysis/Models/Terms.cs b/KenticoInspector.Reports/TransformationSecurityAnalysis/Models/Terms.cs deleted file mode 100644 index a8bbd991..00000000 --- a/KenticoInspector.Reports/TransformationSecurityAnalysis/Models/Terms.cs +++ /dev/null @@ -1,49 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.TransformationSecurityAnalysis.Models -{ - public class Terms - { - public Term WarningSummary { get; set; } - - public Term GoodSummary { get; set; } - - public TableTitlesTerms TableTitles { get; set; } - - public IssueDescriptionsTerms IssueDescriptions { get; set; } - } - - public class TableTitlesTerms - { - public Term IssueTypes { get; set; } - - public Term TransformationsWithIssues { get; set; } - - public Term TransformationUsage { get; set; } - - public Term TemplateUsage { get; set; } - } - - public class IssueDescriptionsTerms - { - public Term XssQueryHelper { get; set; } - - public Term XssQueryString { get; set; } - - public Term XssHttpContext { get; set; } - - public Term XssServer { get; set; } - - public Term XssRequest { get; set; } - - public Term XssDocument { get; set; } - - public Term XssWindow { get; set; } - - public Term ServerSideScript { get; set; } - - public Term DocumentsMacro { get; set; } - - public Term QueryMacro { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/UnusedPageTypeSummary/Models/Terms.cs b/KenticoInspector.Reports/UnusedPageTypeSummary/Models/Terms.cs deleted file mode 100644 index c788ce45..00000000 --- a/KenticoInspector.Reports/UnusedPageTypeSummary/Models/Terms.cs +++ /dev/null @@ -1,11 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.UnusedPageTypeSummary.Models -{ - public class Terms - { - public Term CountUnusedPageType { get; set; } - - public Term UnusedPageTypes { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/UnusedPageTypeSummary/Models/UnusedPageTypes.cs b/KenticoInspector.Reports/UnusedPageTypeSummary/Models/UnusedPageTypes.cs deleted file mode 100644 index ab0d4502..00000000 --- a/KenticoInspector.Reports/UnusedPageTypeSummary/Models/UnusedPageTypes.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KenticoInspector.Reports.UnusedPageTypeSummary.Models -{ - public class PageType - { - public string ClassDisplayName { get; set; } - - public string ClassName { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/UnusedPageTypeSummary/Report.cs b/KenticoInspector.Reports/UnusedPageTypeSummary/Report.cs deleted file mode 100644 index 9bbd616b..00000000 --- a/KenticoInspector.Reports/UnusedPageTypeSummary/Report.cs +++ /dev/null @@ -1,48 +0,0 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.UnusedPageTypeSummary.Models; - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace KenticoInspector.Reports.UnusedPageTypeSummary -{ - public class Report : AbstractReport - { - private readonly IDatabaseService databaseService; - - public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) - { - this.databaseService = databaseService; - } - - public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); - - public override IList Tags => new List - { - ReportTags.Information - }; - - public override ReportResults GetResults() - { - var unusedPageTypes = databaseService.ExecuteSqlFromFile(Scripts.GetUnusedPageTypes); - var countOfUnusedPageTypes = unusedPageTypes.Count(); - - return new ReportResults - { - Type = ResultsType.Table, - Status = ResultsStatus.Information, - Summary = Metadata.Terms.CountUnusedPageType.With(new { count = countOfUnusedPageTypes }), - Data = new TableResult() - { - Name = Metadata.Terms.UnusedPageTypes, - Rows = unusedPageTypes - } - }; - } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/UserPasswordAnalysis/Models/Data/CmsUser.cs b/KenticoInspector.Reports/UserPasswordAnalysis/Models/Data/CmsUser.cs deleted file mode 100644 index 1f1d9bb4..00000000 --- a/KenticoInspector.Reports/UserPasswordAnalysis/Models/Data/CmsUser.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Newtonsoft.Json; - -namespace KenticoInspector.Reports.UserPasswordAnalysis.Models.Data -{ - public class CmsUser - { - public int UserID { get; set; } - - public string UserName { get; set; } - - public string Email { get; set; } - - [JsonIgnore] - public string UserPassword { get; set; } - - [JsonIgnore] - public string UserPasswordFormat { get; set; } - - public string UserPrivilegeLevel { get; set; } - - [JsonIgnore] - public string FirstName { get; set; } - - [JsonIgnore] - public string MiddleName { get; set; } - - [JsonIgnore] - public string LastName { get; set; } - - public string FullName { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/UserPasswordAnalysis/Models/Terms.cs b/KenticoInspector.Reports/UserPasswordAnalysis/Models/Terms.cs deleted file mode 100644 index ee96d5a6..00000000 --- a/KenticoInspector.Reports/UserPasswordAnalysis/Models/Terms.cs +++ /dev/null @@ -1,20 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.UserPasswordAnalysis.Models -{ - public class Terms - { - public Term ErrorSummary { get; set; } - - public Term GoodSummary { get; set; } - - public TableTitlesTerms TableTitles { get; set; } - } - - public class TableTitlesTerms - { - public Term EmptyPasswords { get; set; } - - public Term PlaintextPasswords { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/Document.cs b/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/Document.cs deleted file mode 100644 index f9f669ae..00000000 --- a/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/Document.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Newtonsoft.Json; - -namespace KenticoInspector.Reports.WebPartPerformanceAnalysis.Models -{ - public class Document - { - public string DocumentName { get; set; } - - public int DocumentPageTemplateID { get; set; } - - [JsonIgnore] - public string DocumentWebParts { get; set; } - - public string NodeAliasPath { get; set; } - - public int NodeSiteID { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/PageTemplate.cs b/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/PageTemplate.cs deleted file mode 100644 index 6822e676..00000000 --- a/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/PageTemplate.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Xml.Linq; - -namespace KenticoInspector.Reports.WebPartPerformanceAnalysis.Models -{ - public class PageTemplate - { - public string PageTemplateCodeName { get; set; } - - public string PageTemplateDisplayName { get; set; } - - public int PageTemplateID { get; set; } - - public XDocument PageTemplateWebParts { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/Terms.cs b/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/Terms.cs deleted file mode 100644 index 6e185cda..00000000 --- a/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/Terms.cs +++ /dev/null @@ -1,20 +0,0 @@ -using KenticoInspector.Core.Models; - -namespace KenticoInspector.Reports.WebPartPerformanceAnalysis.Models -{ - public class HeaderTerms - { - public Term DocumentSummary { get; set; } - - public Term TemplateSummary { get; set; } - - public Term WebPartSummary { get; set; } - } - - public class Terms - { - public HeaderTerms Headers { get; set; } - - public Term Summary { get; set; } - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/WebPartSummary.cs b/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/WebPartSummary.cs deleted file mode 100644 index 1e16e593..00000000 --- a/KenticoInspector.Reports/WebPartPerformanceAnalysis/Models/WebPartSummary.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Newtonsoft.Json; - -using System.Collections.Generic; -using System.Linq; - -namespace KenticoInspector.Reports.WebPartPerformanceAnalysis.Models -{ - public class WebPartSummary - { - public string ID { get; set; } - - public string Name { get; set; } - - public string Type { get; set; } - - public int TemplateId { get; set; } - - [JsonIgnore] - public IEnumerable Documents { get; set; } - - public int DocumentCount => Documents.Count(); - } -} \ No newline at end of file diff --git a/KenticoInspector.Reports/editorconfig.txt b/KenticoInspector.Reports/editorconfig.txt deleted file mode 100644 index 09c62a85..00000000 --- a/KenticoInspector.Reports/editorconfig.txt +++ /dev/null @@ -1,1245 +0,0 @@ -root = true - -[*.cs] - -# ===== Active SonarLint rules ===== - -# [Category: Bug] -# S2757: "=+" should not be used instead of "+=" -dotnet_diagnostic.S2757.severity = warning - -# S3168: "async" methods should not return "void" -dotnet_diagnostic.S3168.severity = warning - -# S3397: "base.Equals" should not be used to check for reference equality in "Equals" if "base" is not "object" -dotnet_diagnostic.S3397.severity = warning - -# S1206: "Equals(Object)" and "GetHashCode()" should be overridden in pairs -dotnet_diagnostic.S1206.severity = warning - -# S2328: "GetHashCode" should not reference mutable fields -dotnet_diagnostic.S2328.severity = warning - -# S2997: "IDisposables" created in a "using" statement should not be returned -dotnet_diagnostic.S2997.severity = warning - -# S2930: "IDisposables" should be disposed -dotnet_diagnostic.S2930.severity = warning - -# S2688: "NaN" should not be used in comparisons -dotnet_diagnostic.S2688.severity = warning - -# S2995: "Object.ReferenceEquals" should not be used for value types -dotnet_diagnostic.S2995.severity = warning - -# S3869: "SafeHandle.DangerousGetHandle" should not be called -dotnet_diagnostic.S3869.severity = warning - -# S3456: "string.ToCharArray()" should not be called redundantly -dotnet_diagnostic.S3456.severity = warning - -# S2996: "ThreadStatic" fields should not be initialized -dotnet_diagnostic.S2996.severity = warning - -# S3005: "ThreadStatic" should not be used on non-static fields -dotnet_diagnostic.S3005.severity = warning - -# S2225: "ToString()" method should not return null -dotnet_diagnostic.S2225.severity = warning - -# S2251: A "for" loop update clause should move the counter in the right direction -dotnet_diagnostic.S2251.severity = warning - -# S3923: All branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S3923.severity = warning - -# S3244: Anonymous delegates should not be used to unsubscribe from Events -dotnet_diagnostic.S3244.severity = warning - -# S3343: Caller information parameters should come at the end of the parameter list -dotnet_diagnostic.S3343.severity = warning - -# S4583: Calls to delegate's method "BeginInvoke" should be paired with calls to "EndInvoke" -dotnet_diagnostic.S4583.severity = warning - -# S3249: Classes directly extending "object" should not call "base" in "GetHashCode" or "Equals" -dotnet_diagnostic.S3249.severity = warning - -# S3453: Classes should not have only "private" constructors -dotnet_diagnostic.S3453.severity = warning - -# S4143: Collection elements should not be replaced unconditionally -dotnet_diagnostic.S4143.severity = warning - -# S3981: Collection sizes and array length comparisons should make sense -dotnet_diagnostic.S3981.severity = warning - -# S2114: Collections should not be passed as arguments to their own methods -dotnet_diagnostic.S2114.severity = warning - -# S2275: Composite format strings should not lead to unexpected behavior at runtime -dotnet_diagnostic.S2275.severity = warning - -# S2583: Conditionally executed code should be reachable -dotnet_diagnostic.S2583.severity = warning - -# S3172: Delegates should not be subtracted -dotnet_diagnostic.S3172.severity = warning - -# S3926: Deserialization methods should be provided for "OptionalField" members -dotnet_diagnostic.S3926.severity = warning - -# S1048: Destructors should not throw exceptions -dotnet_diagnostic.S1048.severity = warning - -# S2761: Doubled prefix operators "!!" and "~~" should not be used -dotnet_diagnostic.S2761.severity = warning - -# S4158: Empty collections should not be accessed or iterated -dotnet_diagnostic.S4158.severity = warning - -# S3655: Empty nullable value should not be accessed -dotnet_diagnostic.S3655.severity = warning - -# S3984: Exceptions should not be created without being thrown -dotnet_diagnostic.S3984.severity = warning - -# S3346: Expressions used in "Debug.Assert" should not produce side effects -dotnet_diagnostic.S3346.severity = warning - -# S2345: Flags enumerations should explicitly initialize all their members -dotnet_diagnostic.S2345.severity = warning - -# S2252: For-loop conditions should be true at least once -dotnet_diagnostic.S2252.severity = warning - -# S4275: Getters and setters should access the expected fields -dotnet_diagnostic.S4275.severity = warning - -# S1764: Identical expressions should not be used on both sides of a binary operator -dotnet_diagnostic.S1764.severity = warning - -# S2183: Integral numbers should not be shifted by zero or more than their number of bits-1 -dotnet_diagnostic.S2183.severity = warning - -# S1751: Loops with at most one iteration should be refactored -dotnet_diagnostic.S1751.severity = warning - -# S3603: Methods with "Pure" attribute should return a value -dotnet_diagnostic.S3603.severity = warning - -# S3887: Mutable, non-private fields should not be "readonly" -dotnet_diagnostic.S3887.severity = warning - -# S3889: Neither "Thread.Resume" nor "Thread.Suspend" should be used -dotnet_diagnostic.S3889.severity = warning - -# S4586: Non-async "Task/Task" methods should not return null -dotnet_diagnostic.S4586.severity = warning - -# S2259: Null pointers should not be dereferenced -dotnet_diagnostic.S2259.severity = warning - -# S3610: Nullable type comparison should not be redundant -dotnet_diagnostic.S3610.severity = warning - -# S1848: Objects should not be created to be dropped immediately without being used -dotnet_diagnostic.S1848.severity = warning - -# S3598: One-way "OperationContract" methods should have "void" return type -dotnet_diagnostic.S3598.severity = warning - -# S3466: Optional parameters should be passed to "base" calls -dotnet_diagnostic.S3466.severity = warning - -# S2934: Property assignments should not be made for "readonly" fields not constrained to reference types -dotnet_diagnostic.S2934.severity = warning - -# S2190: Recursion should not be infinite -dotnet_diagnostic.S2190.severity = warning - -# S1862: Related "if/else if" statements should not have the same condition -dotnet_diagnostic.S1862.severity = warning - -# S2184: Results of integer division should not be assigned to floating point variables -dotnet_diagnostic.S2184.severity = warning - -# S2201: Return values from functions without side effects should not be ignored -dotnet_diagnostic.S2201.severity = warning - -# S3449: Right operands of shift operators should be integers -dotnet_diagnostic.S3449.severity = warning - -# S3927: Serialization event handlers should be implemented correctly -dotnet_diagnostic.S3927.severity = warning - -# S2551: Shared resources should not be used for locking -dotnet_diagnostic.S2551.severity = warning - -# S2857: SQL keywords should be delimited by whitespace -dotnet_diagnostic.S2857.severity = warning - -# S3263: Static fields should appear in the order they must be initialized -dotnet_diagnostic.S3263.severity = warning - -# S3464: Type inheritance should not be recursive -dotnet_diagnostic.S3464.severity = warning - -# S3903: Types should be defined in named namespaces -dotnet_diagnostic.S3903.severity = warning - -# S2123: Values should not be uselessly incremented -dotnet_diagnostic.S2123.severity = warning - -# S1656: Variables should not be self-assigned -dotnet_diagnostic.S1656.severity = warning - -# S2306: "async" and "await" should not be used as identifiers -dotnet_diagnostic.S2306.severity = warning - - -# [Category: Security] -# S3884: "CoSetProxyBlanket" and "CoInitializeSecurity" should not be used -dotnet_diagnostic.S3884.severity = warning - -# S2115: A secure password should be used when connecting to a database -dotnet_diagnostic.S2115.severity = warning - -# S5547: Cipher algorithms should be robust -dotnet_diagnostic.S5547.severity = warning - -# S3329: Cipher Block Chaining IVs should be unpredictable -dotnet_diagnostic.S3329.severity = warning - -# S5542: Encryption algorithms should be used with secure mode and padding scheme -dotnet_diagnostic.S5542.severity = warning - -# S5445: Insecure temporary file creation methods should not be used -dotnet_diagnostic.S5445.severity = warning - -# S5659: JWT should be signed and verified with strong cipher algorithms -dotnet_diagnostic.S5659.severity = warning - -# S4433: LDAP connections should be authenticated -dotnet_diagnostic.S4433.severity = warning - -# S4211: Members should not have conflicting transparency annotations -dotnet_diagnostic.S4211.severity = warning - -# S4423: Weak SSL/TLS protocols should not be used -dotnet_diagnostic.S4423.severity = warning - -# S2755: XML parsers should not be vulnerable to XXE attacks -dotnet_diagnostic.S2755.severity = warning - -# S2053: Hashes should include an unpredictable salt -dotnet_diagnostic.S2053.severity = warning - -# S4830: Server certificates should be verified during SSL/TLS connections -dotnet_diagnostic.S4830.severity = warning - -# S4426: Cryptographic keys should be robust -dotnet_diagnostic.S4426.severity = warning - -# S5773: Types allowed to be deserialized should be restricted -dotnet_diagnostic.S5773.severity = warning - - -# [Category: Security Hotspot] -# S5693: Allowing requests with excessive content length is security-sensitive -dotnet_diagnostic.S5693.severity = warning - -# S4792: Configuring loggers is security-sensitive -dotnet_diagnostic.S4792.severity = warning - -# S3330: Creating cookies without the "HttpOnly" flag is security-sensitive -dotnet_diagnostic.S3330.severity = warning - -# S2092: Creating cookies without the "secure" flag is security-sensitive -dotnet_diagnostic.S2092.severity = warning - -# S4507: Delivering code in production with debug features activated is security-sensitive -dotnet_diagnostic.S4507.severity = warning - -# S5766: Deserializing objects without performing data validation is security-sensitive -dotnet_diagnostic.S5766.severity = warning - -# S5753: Disabling ASP.NET "Request Validation" feature is security-sensitive -dotnet_diagnostic.S5753.severity = warning - -# S4502: Disabling CSRF protections is security-sensitive -dotnet_diagnostic.S4502.severity = warning - -# S5042: Expanding archive files without controlling resource consumption is security-sensitive -dotnet_diagnostic.S5042.severity = warning - -# S2077: Formatting SQL queries is security-sensitive -dotnet_diagnostic.S2077.severity = warning - -# S2068: Hard-coded credentials are security-sensitive -dotnet_diagnostic.S2068.severity = warning - -# S5122: Having a permissive Cross-Origin Resource Sharing policy is security-sensitive -dotnet_diagnostic.S5122.severity = warning - -# S4036: Searching OS commands in PATH is security-sensitive -dotnet_diagnostic.S4036.severity = warning - -# S2612: Setting loose file permissions is security-sensitive -dotnet_diagnostic.S2612.severity = warning - -# S5332: Using clear-text protocols is security-sensitive -dotnet_diagnostic.S5332.severity = warning - -# S1313: Using hardcoded IP addresses is security-sensitive -dotnet_diagnostic.S1313.severity = warning - -# S2257: Using non-standard cryptographic algorithms is security-sensitive -dotnet_diagnostic.S2257.severity = warning - -# S2245: Using pseudorandom number generators (PRNGs) is security-sensitive -dotnet_diagnostic.S2245.severity = warning - -# S5443: Using publicly writable directories is security-sensitive -dotnet_diagnostic.S5443.severity = warning - -# S4790: Using weak hashing algorithms is security-sensitive -dotnet_diagnostic.S4790.severity = warning - - -# [Category: Code Smell] -# S3451: "[DefaultValue]" should not be used when "[DefaultParameterValue]" is meant -dotnet_diagnostic.S3451.severity = warning - -# S3447: "[Optional]" should not be used on "ref" or "out" parameters -dotnet_diagnostic.S3447.severity = warning - -# S1155: "Any()" should be used to test for emptiness -dotnet_diagnostic.S1155.severity = warning - -# S2737: "catch" clauses should do more than rethrow -dotnet_diagnostic.S2737.severity = warning - -# S4524: "default" clauses should be first or last -dotnet_diagnostic.S4524.severity = warning - -# S3217: "Explicit" conversions of "foreach" loops should not be used -dotnet_diagnostic.S3217.severity = warning - -# S3971: "GC.SuppressFinalize" should not be called -dotnet_diagnostic.S3971.severity = warning - -# S907: "goto" statement should not be used -dotnet_diagnostic.S907.severity = warning - -# S2692: "IndexOf" checks should not be for positive numbers -dotnet_diagnostic.S2692.severity = warning - -# S3060: "is" should not be used with "this" -dotnet_diagnostic.S3060.severity = warning - -# S1123: "Obsolete" attributes should include explanations -dotnet_diagnostic.S1123.severity = warning - -# S4214: "P/Invoke" methods should not be visible -dotnet_diagnostic.S4214.severity = warning - -# S4061: "params" should be used instead of "varargs" -dotnet_diagnostic.S4061.severity = warning - -# S3262: "params" should be used on overrides -dotnet_diagnostic.S3262.severity = warning - -# S3600: "params" should not be introduced on overrides -dotnet_diagnostic.S3600.severity = warning - -# S3597: "ServiceContract" and "OperationContract" attributes should be used together -dotnet_diagnostic.S3597.severity = warning - -# S3963: "static" fields should be initialized inline -dotnet_diagnostic.S3963.severity = warning - -# S3256: "string.IsNullOrEmpty" should be used -dotnet_diagnostic.S3256.severity = warning - -# S1479: "switch" statements should not have too many "case" clauses -dotnet_diagnostic.S1479.severity = warning - -# S5034: "ValueTask" should be consumed correctly -dotnet_diagnostic.S5034.severity = warning - -# S1264: A "while" loop should be used instead of a "for" loop -dotnet_diagnostic.S1264.severity = warning - -# S3973: A conditionally executed single line should be denoted by indentation -dotnet_diagnostic.S3973.severity = warning - -# S3904: Assemblies should have version information -dotnet_diagnostic.S3904.severity = warning - -# S3415: Assertion arguments should be passed in the correct order -dotnet_diagnostic.S3415.severity = warning - -# S4019: Base class methods should not be hidden -dotnet_diagnostic.S4019.severity = warning - -# S1940: Boolean checks should not be inverted -dotnet_diagnostic.S1940.severity = warning - -# S3236: Caller information arguments should not be provided explicitly -dotnet_diagnostic.S3236.severity = warning - -# S3897: Classes that provide "Equals()" should implement "IEquatable" -dotnet_diagnostic.S3897.severity = warning - -# S3457: Composite format strings should be used correctly -dotnet_diagnostic.S3457.severity = warning - -# S3972: Conditionals should start on new lines -dotnet_diagnostic.S3972.severity = warning - -# S1116: Empty statements should be removed -dotnet_diagnostic.S1116.severity = warning - -# S3264: Events should be invoked -dotnet_diagnostic.S3264.severity = warning - -# S3445: Exceptions should not be explicitly rethrown -dotnet_diagnostic.S3445.severity = warning - -# S1163: Exceptions should not be thrown in finally blocks -dotnet_diagnostic.S1163.severity = warning - -# S2290: Field-like events should not be virtual -dotnet_diagnostic.S2290.severity = warning - -# S2346: Flags enumerations zero-value members should be named "warning" -dotnet_diagnostic.S2346.severity = warning - -# S3251: Implementations should be provided for "partial" methods -dotnet_diagnostic.S3251.severity = warning - -# S1944: Inappropriate casts should not be made -dotnet_diagnostic.S1944.severity = warning - -# S4015: Inherited member visibility should not be decreased -dotnet_diagnostic.S4015.severity = warning - -# S3444: Interfaces should not simply inherit from base interfaces with colliding members -dotnet_diagnostic.S3444.severity = warning - -# S818: Literal suffixes should be upper case -dotnet_diagnostic.S818.severity = warning - -# S3400: Methods should not return constants -dotnet_diagnostic.S3400.severity = warning - -# S2681: Multiline blocks should be enclosed in curly braces -dotnet_diagnostic.S2681.severity = warning - -# S3169: Multiple "OrderBy" calls should not be used -dotnet_diagnostic.S3169.severity = warning - -# S3261: Namespaces should not be empty -dotnet_diagnostic.S3261.severity = warning - -# S4200: Native methods should be wrapped -dotnet_diagnostic.S4200.severity = warning - -# S1199: Nested code blocks should not be used -dotnet_diagnostic.S1199.severity = warning - -# S4070: Non-flags enums should not be marked with "FlagsAttribute" -dotnet_diagnostic.S4070.severity = warning - -# S3265: Non-flags enums should not be used in bitwise operations -dotnet_diagnostic.S3265.severity = warning - -# S4201: Null checks should not be used with "is" -dotnet_diagnostic.S4201.severity = warning - -# S3966: Objects should not be disposed more than once -dotnet_diagnostic.S3966.severity = warning - -# S2291: Overflow checking should not be disabled for "Enumerable.Sum" -dotnet_diagnostic.S2291.severity = warning - -# S1185: Overriding members should do more than simply call the same member in the base class -dotnet_diagnostic.S1185.severity = warning - -# S2234: Parameters should be passed in the correct order -dotnet_diagnostic.S2234.severity = warning - -# S3450: Parameters with "[DefaultParameterValue]" attributes should also be marked "[Optional]" -dotnet_diagnostic.S3450.severity = warning - -# S1905: Redundant casts should not be used -dotnet_diagnostic.S1905.severity = warning - -# S1110: Redundant pairs of parentheses should be removed -dotnet_diagnostic.S1110.severity = warning - -# S2437: Silly bit operations should not be performed -dotnet_diagnostic.S2437.severity = warning - -# S3010: Static fields should not be updated in constructors -dotnet_diagnostic.S3010.severity = warning - -# S4635: String offset-based methods should be preferred for finding substrings from offsets -dotnet_diagnostic.S4635.severity = warning - -# S3998: Threads should not lock on objects with weak identity -dotnet_diagnostic.S3998.severity = warning - -# S1134: Track uses of "FIXME" tags -dotnet_diagnostic.S1134.severity = warning - -# S1135: Track uses of "TODO" tags -dotnet_diagnostic.S1135.severity = warning - -# S1871: Two branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S1871.severity = warning - -# S3443: Type should not be examined on "System.Type" instances -dotnet_diagnostic.S3443.severity = warning - -# S3459: Unassigned members should be removed -dotnet_diagnostic.S3459.severity = warning - -# S3440: Variables should not be checked against the values they're about to be assigned -dotnet_diagnostic.S3440.severity = warning - -# S2479: Whitespace and control characters in string literals should be explicit -dotnet_diagnostic.S2479.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S3442: "abstract" classes should not have "public" constructors -dotnet_diagnostic.S3442.severity = warning - -# S3885: "Assembly.Load" should be used -dotnet_diagnostic.S3885.severity = warning - -# S1210: "Equals" and the comparison operators should be overridden when implementing "IComparable" -dotnet_diagnostic.S1210.severity = warning - -# S1215: "GC.Collect" should not be called -dotnet_diagnostic.S1215.severity = warning - -# S3881: "IDisposable" should be implemented correctly -dotnet_diagnostic.S3881.severity = warning - -# S2971: "IEnumerable" LINQs should be simplified -dotnet_diagnostic.S2971.severity = warning - -# S3925: "ISerializable" should be implemented correctly -dotnet_diagnostic.S3925.severity = warning - -# S4581: "new Guid()" should not be used -dotnet_diagnostic.S4581.severity = warning - -# S3875: "operator==" should not be overloaded on reference types -dotnet_diagnostic.S3875.severity = warning - -# S3237: "value" parameters should be used -dotnet_diagnostic.S3237.severity = warning - -# S1121: Assignments should not be made from within sub-expressions -dotnet_diagnostic.S1121.severity = warning - -# S3376: Attribute, EventArgs, and Exception type names should end with the type being extended -dotnet_diagnostic.S3376.severity = warning - -# S2589: Boolean expressions should not be gratuitous -dotnet_diagnostic.S2589.severity = warning - -# S4035: Classes implementing "IEquatable" should be sealed -dotnet_diagnostic.S4035.severity = warning - -# S3776: Cognitive Complexity of methods should not be too high -dotnet_diagnostic.S3776.severity = warning - -# S1066: Collapsible "if" statements should be merged -dotnet_diagnostic.S1066.severity = warning - -# S1699: Constructors should only call non-overridable methods -dotnet_diagnostic.S1699.severity = warning - -# S2372: Exceptions should not be thrown from property getters -dotnet_diagnostic.S2372.severity = warning - -# S3877: Exceptions should not be thrown from unexpected methods -dotnet_diagnostic.S3877.severity = warning - -# S1104: Fields should not have public accessibility -dotnet_diagnostic.S1104.severity = warning - -# S2933: Fields that are only assigned in the constructor should be "readonly" -dotnet_diagnostic.S2933.severity = warning - -# S112: General exceptions should never be thrown -dotnet_diagnostic.S112.severity = warning - -# S2486: Generic exceptions should not be ignored -dotnet_diagnostic.S2486.severity = warning - -# S3246: Generic type parameters should be co/contravariant when possible -dotnet_diagnostic.S3246.severity = warning - -# S1939: Inheritance list should not be redundant -dotnet_diagnostic.S1939.severity = warning - -# S110: Inheritance tree of classes should not be too deep -dotnet_diagnostic.S110.severity = warning - -# S3218: Inner class members should not shadow outer class "static" or type members -dotnet_diagnostic.S3218.severity = warning - -# S2696: Instance members should not write to "static" fields -dotnet_diagnostic.S2696.severity = warning - -# S3626: Jump statements should not be redundant -dotnet_diagnostic.S3626.severity = warning - -# S1117: Local variables should not shadow class fields -dotnet_diagnostic.S1117.severity = warning - -# S3267: Loops should be simplified with "LINQ" expressions -dotnet_diagnostic.S3267.severity = warning - -# S3604: Member initializer values should not be redundant -dotnet_diagnostic.S3604.severity = warning - -# S3220: Method calls should not resolve ambiguously to overloads with "params" -dotnet_diagnostic.S3220.severity = warning - -# S4136: Method overloads should be grouped together -dotnet_diagnostic.S4136.severity = warning - -# S3427: Method overloads with default parameter values should not overlap -dotnet_diagnostic.S3427.severity = warning - -# S1006: Method overrides should not change parameter defaults -dotnet_diagnostic.S1006.severity = warning - -# S2953: Methods named "Dispose" should implement "IDisposable.Dispose" -dotnet_diagnostic.S2953.severity = warning - -# S1186: Methods should not be empty -dotnet_diagnostic.S1186.severity = warning - -# S4144: Methods should not have identical implementations -dotnet_diagnostic.S4144.severity = warning - -# S107: Methods should not have too many parameters -dotnet_diagnostic.S107.severity = warning - -# S3241: Methods should not return values that are never used -dotnet_diagnostic.S3241.severity = warning - -# S2386: Mutable fields should not be "public static" -dotnet_diagnostic.S2386.severity = warning - -# S108: Nested blocks of code should not be left empty -dotnet_diagnostic.S108.severity = warning - -# S2223: Non-constant static fields should not be visible -dotnet_diagnostic.S2223.severity = warning - -# S3260: Non-derived "private" classes and records should be "sealed" -dotnet_diagnostic.S3260.severity = warning - -# S927: Parameter names should match base declaration and other partial definitions -dotnet_diagnostic.S927.severity = warning - -# S3928: Parameter names used into ArgumentException constructors should match an existing one -dotnet_diagnostic.S3928.severity = warning - -# S4457: Parameter validation in "async"/"await" methods should be wrapped -dotnet_diagnostic.S4457.severity = warning - -# S4456: Parameter validation in yielding methods should be wrapped -dotnet_diagnostic.S4456.severity = warning - -# S1450: Private fields only used as local variables in methods should become local variables -dotnet_diagnostic.S1450.severity = warning - -# S2365: Properties should not make collection or array copies -dotnet_diagnostic.S2365.severity = warning - -# S2368: Public methods should not have multidimensional array parameters -dotnet_diagnostic.S2368.severity = warning - -# S3011: Reflection should not be used to increase accessibility of classes, methods, or fields -dotnet_diagnostic.S3011.severity = warning - -# S2219: Runtime type checking should be simplified -dotnet_diagnostic.S2219.severity = warning - -# S125: Sections of code should not be commented out -dotnet_diagnostic.S125.severity = warning - -# S2178: Short-circuit logic should be used in boolean contexts -dotnet_diagnostic.S2178.severity = warning - -# S2743: Static fields should not be used in generic types -dotnet_diagnostic.S2743.severity = warning - -# S1643: Strings should not be concatenated using '+' in a loop -dotnet_diagnostic.S1643.severity = warning - -# S3358: Ternary operators should not be nested -dotnet_diagnostic.S3358.severity = warning - -# S3433: Test method signatures should be correct -dotnet_diagnostic.S3433.severity = warning - -# S2187: TestCases should contain tests -dotnet_diagnostic.S2187.severity = warning - -# S2699: Tests should include assertions -dotnet_diagnostic.S2699.severity = warning - -# S1607: Tests should not be ignored -dotnet_diagnostic.S1607.severity = warning - -# S2292: Trivial properties should be auto-implemented -dotnet_diagnostic.S2292.severity = warning - -# S2436: Types and methods should not have too many generic parameters -dotnet_diagnostic.S2436.severity = warning - -# S101: Types should be named in PascalCase -dotnet_diagnostic.S101.severity = warning - -# S4487: Unread "private" fields should be removed -dotnet_diagnostic.S4487.severity = warning - -# S1854: Unused assignments should be removed -dotnet_diagnostic.S1854.severity = warning - -# S1481: Unused local variables should be removed -dotnet_diagnostic.S1481.severity = warning - -# S1172: Unused method parameters should be removed -dotnet_diagnostic.S1172.severity = warning - -# S1144: Unused private types or members should be removed -dotnet_diagnostic.S1144.severity = warning - -# S2326: Unused type parameters should be removed -dotnet_diagnostic.S2326.severity = warning - -# S1075: URIs should not be hardcoded -dotnet_diagnostic.S1075.severity = warning - -# S1118: Utility classes should not have public constructors -dotnet_diagnostic.S1118.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S1125: Boolean literals should not be redundant -dotnet_diagnostic.S1125.severity = warning - - -# ===== Inactive SonarLint rules (must be explicitly turned off) ===== - -# [Category: Bug] (All these are excluded because they're not applicable to our solution) -# S4428: "PartCreationPolicyAttribute" should be used with "ExportAttribute" -dotnet_diagnostic.S4428.severity = none - -# S4260: "ConstructorArgument" parameters should exist in constructors -dotnet_diagnostic.S4260.severity = none - -# S4277: "Shared" parts should not be created with "new" -dotnet_diagnostic.S4277.severity = none - -# S4159: Classes should implement their "ExportAttribute" interfaces -dotnet_diagnostic.S4159.severity = none - -# S4210: Windows Forms entry points should be marked with STAThread -dotnet_diagnostic.S4210.severity = none - - -# [Uncategorized] -# S6287: HTTP responses should not be vulnerable to session fixation -dotnet_diagnostic.S6287.severity = none - -# S6096: Extracting archives should not lead to zip slip vulnerabilities -dotnet_diagnostic.S6096.severity = none - -# S5334: Dynamic code execution should not be vulnerable to injection attacks -dotnet_diagnostic.S5334.severity = none - -# S5146: HTTP request redirections should not be open to forging attacks -dotnet_diagnostic.S5146.severity = none - -# S5135: Deserialization should not be vulnerable to injection attacks -dotnet_diagnostic.S5135.severity = none - -# S5131: Endpoints should not be vulnerable to reflected cross-site scripting (XSS) attacks -dotnet_diagnostic.S5131.severity = none - -# S3649: Database queries should not be vulnerable to injection attacks -dotnet_diagnostic.S3649.severity = none - -# S2091: XPath expressions should not be vulnerable to injection attacks -dotnet_diagnostic.S2091.severity = none - -# S2083: I/O function calls should not be vulnerable to path injection attacks -dotnet_diagnostic.S2083.severity = none - -# S2078: LDAP queries should not be vulnerable to injection attacks -dotnet_diagnostic.S2078.severity = none - -# S2076: OS commands should not be vulnerable to command injection attacks -dotnet_diagnostic.S2076.severity = none - -# S6424: Azure Functions: Restrictions on entity interfaces -dotnet_diagnostic.S6424.severity = none - -# S6422: Calls to "async" methods should not be blocking in Azure Functions -dotnet_diagnostic.S6422.severity = none - -# S2631: Regular expressions should not be vulnerable to Denial of Service attacks -dotnet_diagnostic.S2631.severity = none - -# S2222: Locks should be released -dotnet_diagnostic.S2222.severity = none - -# S5144: Server-side requests should not be vulnerable to forging attacks -dotnet_diagnostic.S5144.severity = none - -# S6350: Constructing arguments of system commands from user input is security-sensitive -dotnet_diagnostic.S6350.severity = none - -# S6420: Reuse client instances rather than creating new ones with each Azure Function invocation -dotnet_diagnostic.S6420.severity = none - -# S6419: Azure Functions should be stateless -dotnet_diagnostic.S6419.severity = none - -# S5883: OS commands should not be vulnerable to argument injection attacks -dotnet_diagnostic.S5883.severity = none - -# S5145: Logging should not be vulnerable to injection attacks -dotnet_diagnostic.S5145.severity = none - -# S2931: Classes with "IDisposable" members should implement "IDisposable" -dotnet_diagnostic.S2931.severity = none - -# S4462: Calls to "async" methods should not be blocking -dotnet_diagnostic.S4462.severity = none - -# S2387: Child class fields should not shadow parent class fields -dotnet_diagnostic.S2387.severity = none - -# S1451: Track lack of copyright and license headers -dotnet_diagnostic.S1451.severity = none - -# S1147: Exit methods should not be called -dotnet_diagnostic.S1147.severity = none - -# S2952: Classes should "Dispose" of members from the classes' own "Dispose" methods -dotnet_diagnostic.S2952.severity = none - -# S4829: Reading the Standard Input is security-sensitive -dotnet_diagnostic.S4829.severity = none - -# S4823: Using command line arguments is security-sensitive -dotnet_diagnostic.S4823.severity = none - -# S4818: Using Sockets is security-sensitive -dotnet_diagnostic.S4818.severity = none - -# S4787: Encrypting data is security-sensitive -dotnet_diagnostic.S4787.severity = none - -# S4784: Using regular expressions is security-sensitive -dotnet_diagnostic.S4784.severity = none - -# S4039: Interface methods should be callable by derived types -dotnet_diagnostic.S4039.severity = none - -# S4025: Child class fields should not differ from parent class fields only by capitalization -dotnet_diagnostic.S4025.severity = none - -# S4000: Pointers to unmanaged memory should not be visible -dotnet_diagnostic.S4000.severity = none - -# S3937: Number patterns should be regular -dotnet_diagnostic.S3937.severity = none - -# S3874: "out" and "ref" parameters should not be used -dotnet_diagnostic.S3874.severity = none - -# S3353: Unchanged local variables should be "const" -dotnet_diagnostic.S3353.severity = none - -# S3216: "ConfigureAwait(false)" should be used -dotnet_diagnostic.S3216.severity = none - -# S3215: "interface" instances should not be cast to concrete types -dotnet_diagnostic.S3215.severity = none - -# S2701: Literal boolean values should not be used in assertions -dotnet_diagnostic.S2701.severity = none - -# S2360: Optional parameters should not be used -dotnet_diagnostic.S2360.severity = none - -# S2339: Public constant members should not be used -dotnet_diagnostic.S2339.severity = none - -# S2330: Array covariance should not be used -dotnet_diagnostic.S2330.severity = none - -# S2302: "nameof" should be used -dotnet_diagnostic.S2302.severity = none - -# S2197: Modulus results should not be checked for direct equality -dotnet_diagnostic.S2197.severity = none - -# S1994: "for" loop increment clauses should modify the loops' counters -dotnet_diagnostic.S1994.severity = none - -# S1821: "switch" statements should not be nested -dotnet_diagnostic.S1821.severity = none - -# S1541: Methods and properties should not be too complex -dotnet_diagnostic.S1541.severity = none - -# S134: Control flow statements "if", "switch", "for", "foreach", "while", "do" and "try" should not be nested too deeply -dotnet_diagnostic.S134.severity = none - -# S131: "switch/Select" statements should contain a "default/Case Else" clauses -dotnet_diagnostic.S131.severity = none - -# S126: "if ... else if" constructs should end with "else" clauses -dotnet_diagnostic.S126.severity = none - -# S121: Control structures should use curly braces -dotnet_diagnostic.S121.severity = none - -# S1067: Expressions should not be too complex -dotnet_diagnostic.S1067.severity = none - -# S4564: ASP.NET HTTP request validation feature should not be disabled -dotnet_diagnostic.S4564.severity = none - -# S4212: Serialization constructors should be secured -dotnet_diagnostic.S4212.severity = none - -# S3949: Calculations should not overflow -dotnet_diagnostic.S3949.severity = none - -# S1244: Floating point numbers should not be tested for equality -dotnet_diagnostic.S1244.severity = none - -# S881: Increment (++) and decrement (--) operators should not be used in a method call or mixed with other operators in an expression -dotnet_diagnostic.S881.severity = none - -# S6423: Azure Functions should log all failures -dotnet_diagnostic.S6423.severity = none - -# S6421: Azure Functions should use Structured Error Handling -dotnet_diagnostic.S6421.severity = none - -# S6354: Use a testable date/time provider -dotnet_diagnostic.S6354.severity = none - -# S4059: Property names should not match get methods -dotnet_diagnostic.S4059.severity = none - -# S4057: Locales should be set for data types -dotnet_diagnostic.S4057.severity = none - -# S4055: Literals should not be passed as localized parameters -dotnet_diagnostic.S4055.severity = none - -# S4050: Operators should be overloaded consistently -dotnet_diagnostic.S4050.severity = none - -# S4017: Method signatures should not contain nested generic types -dotnet_diagnostic.S4017.severity = none - -# S4016: Enumeration members should not be named "Reserved" -dotnet_diagnostic.S4016.severity = none - -# S4005: "System.Uri" arguments should be used instead of strings -dotnet_diagnostic.S4005.severity = none - -# S4004: Collection properties should be readonly -dotnet_diagnostic.S4004.severity = none - -# S4002: Disposable types should declare finalizers -dotnet_diagnostic.S4002.severity = none - -# S3997: String URI overloads should call "System.Uri" overloads -dotnet_diagnostic.S3997.severity = none - -# S3996: URI properties should not be strings -dotnet_diagnostic.S3996.severity = none - -# S3995: URI return values should not be strings -dotnet_diagnostic.S3995.severity = none - -# S3994: URI Parameters should not be strings -dotnet_diagnostic.S3994.severity = none - -# S3993: Custom attributes should be marked with "System.AttributeUsageAttribute" -dotnet_diagnostic.S3993.severity = none - -# S3992: Assemblies should explicitly specify COM visibility -dotnet_diagnostic.S3992.severity = none - -# S3990: Assemblies should be marked as CLS compliant -dotnet_diagnostic.S3990.severity = none - -# S3956: "Generic.List" instances should not be part of public APIs -dotnet_diagnostic.S3956.severity = none - -# S3909: Collections should implement the generic interface -dotnet_diagnostic.S3909.severity = none - -# S3908: Generic event handlers should be used -dotnet_diagnostic.S3908.severity = none - -# S3906: Event Handlers should have the correct signature -dotnet_diagnostic.S3906.severity = none - -# S3902: "Assembly.GetExecutingAssembly" should not be called -dotnet_diagnostic.S3902.severity = none - -# S3900: Arguments of public methods should be validated against null -dotnet_diagnostic.S3900.severity = none - -# S3898: Value types should implement "IEquatable" -dotnet_diagnostic.S3898.severity = none - -# S3880: Finalizers should not be empty -dotnet_diagnostic.S3880.severity = none - -# S3431: "[ExpectedException]" should not be used -dotnet_diagnostic.S3431.severity = none - -# S3366: "this" should not be exposed from constructors -dotnet_diagnostic.S3366.severity = none - -# S3059: Types should not have members with visibility set higher than the type's visibility -dotnet_diagnostic.S3059.severity = none - -# S2357: Fields should be private -dotnet_diagnostic.S2357.severity = none - -# S2327: "try" statements with identical "catch" and/or "finally" blocks should be merged -dotnet_diagnostic.S2327.severity = none - -# S1696: NullReferenceException should not be caught -dotnet_diagnostic.S1696.severity = none - -# S138: Functions should not have too many lines of code -dotnet_diagnostic.S138.severity = none - -# S127: "for" loop stop conditions should be invariant -dotnet_diagnostic.S127.severity = none - -# S122: Statements should be on separate lines -dotnet_diagnostic.S122.severity = none - -# S1200: Classes should not be coupled to too many other classes (Single Responsibility Principle) -dotnet_diagnostic.S1200.severity = none - -# S1151: "switch case" clauses should not have too many lines of code -dotnet_diagnostic.S1151.severity = none - -# S109: Magic numbers should not be used -dotnet_diagnostic.S109.severity = none - -# S106: Standard outputs should not be used directly to log anything -dotnet_diagnostic.S106.severity = none - -# S104: Files should not have too many lines of code -dotnet_diagnostic.S104.severity = none - -# S103: Lines should not be too long -dotnet_diagnostic.S103.severity = none - -# S5167: HTTP response headers should not be vulnerable to injection attacks -dotnet_diagnostic.S5167.severity = none - -# S2228: Console logging should not be used -dotnet_diagnostic.S2228.severity = none - -# S2955: Generic parameters not constrained to reference types should not be compared to "null" -dotnet_diagnostic.S2955.severity = none - -# S2674: The length returned from a stream read should be checked -dotnet_diagnostic.S2674.severity = none - -# S1226: Method parameters, caught exceptions and foreach variables' initial values should not be ignored -dotnet_diagnostic.S1226.severity = none - -# S4834: Controlling permissions is security-sensitive -dotnet_diagnostic.S4834.severity = none - -# S2255: Writing cookies is security-sensitive -dotnet_diagnostic.S2255.severity = none - -# S4261: Methods should be named according to their synchronicities -dotnet_diagnostic.S4261.severity = none - -# S4226: Extensions should be in separate namespaces -dotnet_diagnostic.S4226.severity = none - -# S4225: Extension methods should not extend "object" -dotnet_diagnostic.S4225.severity = none - -# S4069: Operator overloads should have named alternatives -dotnet_diagnostic.S4069.severity = none - -# S4060: Non-abstract attributes should be sealed -dotnet_diagnostic.S4060.severity = none - -# S4058: Overloads with a "StringComparison" parameter should be used -dotnet_diagnostic.S4058.severity = none - -# S4056: Overloads with a "CultureInfo" or an "IFormatProvider" parameter should be used -dotnet_diagnostic.S4056.severity = none - -# S4052: Types should not extend outdated base types -dotnet_diagnostic.S4052.severity = none - -# S4049: Properties should be preferred -dotnet_diagnostic.S4049.severity = none - -# S4047: Generics should be used when appropriate -dotnet_diagnostic.S4047.severity = none - -# S4041: Type names should not match namespaces -dotnet_diagnostic.S4041.severity = none - -# S4040: Strings should be normalized to uppercase -dotnet_diagnostic.S4040.severity = none - -# S4027: Exceptions should provide standard constructors -dotnet_diagnostic.S4027.severity = none - -# S4026: Assemblies should be marked with "NeutralResourcesLanguageAttribute" -dotnet_diagnostic.S4026.severity = none - -# S4023: Interfaces should not be empty -dotnet_diagnostic.S4023.severity = none - -# S4022: Enumerations should have "Int32" storage -dotnet_diagnostic.S4022.severity = none - -# S4018: Generic methods should provide type parameters -dotnet_diagnostic.S4018.severity = none - -# S3967: Multidimensional arrays should not be used -dotnet_diagnostic.S3967.severity = none - -# S3962: "static readonly" constants should be "const" instead -dotnet_diagnostic.S3962.severity = none - -# S3876: Strings or integral types should be used for indexers -dotnet_diagnostic.S3876.severity = none - -# S3872: Parameter names should not duplicate the names of their methods -dotnet_diagnostic.S3872.severity = none - -# S3717: Track use of "NotImplementedException" -dotnet_diagnostic.S3717.severity = none - -# S3532: Empty "default" clauses should be removed -dotnet_diagnostic.S3532.severity = none - -# S3441: Redundant property names should be omitted in anonymous classes -dotnet_diagnostic.S3441.severity = none - -# S3257: Declarations and initializations should be as concise as possible -dotnet_diagnostic.S3257.severity = none - -# S3254: Default parameter values should not be passed as arguments -dotnet_diagnostic.S3254.severity = none - -# S3253: Constructor and destructor declarations should not be redundant -dotnet_diagnostic.S3253.severity = none - -# S3242: Method parameters should be declared with base types -dotnet_diagnostic.S3242.severity = none - -# S3240: The simplest possible condition syntax should be used -dotnet_diagnostic.S3240.severity = none - -# S3235: Redundant parentheses should not be used -dotnet_diagnostic.S3235.severity = none - -# S3234: "GC.SuppressFinalize" should not be invoked for types without destructors -dotnet_diagnostic.S3234.severity = none - -# S3052: Members should not be initialized to default values -dotnet_diagnostic.S3052.severity = none - -# S2760: Sequential tests should not check the same condition -dotnet_diagnostic.S2760.severity = none - -# S2333: Redundant modifiers should not be used -dotnet_diagnostic.S2333.severity = none - -# S2325: Methods and properties that don't access instance data should be static -dotnet_diagnostic.S2325.severity = none - -# S2221: "Exception" should not be caught when not required by called methods -dotnet_diagnostic.S2221.severity = none - -# S2156: "sealed" classes should not have "protected" members -dotnet_diagnostic.S2156.severity = none - -# S2148: Underscores should be used to make large numbers readable -dotnet_diagnostic.S2148.severity = none - -# S1858: "ToString()" calls should not be redundant -dotnet_diagnostic.S1858.severity = none - -# S1698: "=" should not be used when "Equals" is overridden -dotnet_diagnostic.S1698.severity = none - -# S1694: An abstract class should have both abstract and concrete methods -dotnet_diagnostic.S1694.severity = none - -# S1659: Multiple variables should not be declared on the same line -dotnet_diagnostic.S1659.severity = none - -# S1449: Culture should be specified for "string" operations -dotnet_diagnostic.S1449.severity = none - -# S1301: "switch" statements should have at least 3 "case" clauses -dotnet_diagnostic.S1301.severity = none - -# S1227: break statements should not be used except for switch cases -dotnet_diagnostic.S1227.severity = none - -# S1192: String literals should not be duplicated -dotnet_diagnostic.S1192.severity = none - -# S113: Files should contain an empty newline at the end -dotnet_diagnostic.S113.severity = none - -# S1128: Unused "using" should be removed -dotnet_diagnostic.S1128.severity = none - -# S1109: A close curly brace should be located at the beginning of a line -dotnet_diagnostic.S1109.severity = none - -# S105: Tabulation characters should not be used -dotnet_diagnostic.S105.severity = none - -# S100: Methods and properties should be named in PascalCase -dotnet_diagnostic.S100.severity = none - -# S1309: Track uses of in-source issue suppressions -dotnet_diagnostic.S1309.severity = none \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/.browserslistrc b/KenticoInspector.WebApplication/ClientApp/.browserslistrc deleted file mode 100644 index 8f960439..00000000 --- a/KenticoInspector.WebApplication/ClientApp/.browserslistrc +++ /dev/null @@ -1,3 +0,0 @@ -> 1% -last 2 versions -not ie <= 10 diff --git a/KenticoInspector.WebApplication/ClientApp/.eslintrc.js b/KenticoInspector.WebApplication/ClientApp/.eslintrc.js deleted file mode 100644 index 8c4a8727..00000000 --- a/KenticoInspector.WebApplication/ClientApp/.eslintrc.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - root: true, - env: { - node: true - }, - 'extends': [ - 'plugin:vue/essential', - 'eslint:recommended' - ], - rules: { - 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', - 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', - 'vue/multi-word-component-names': 'off' - }, - parserOptions: { - parser: 'babel-eslint' - } -} diff --git a/KenticoInspector.WebApplication/ClientApp/.gitignore b/KenticoInspector.WebApplication/ClientApp/.gitignore deleted file mode 100644 index 185e6631..00000000 --- a/KenticoInspector.WebApplication/ClientApp/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -.DS_Store -node_modules -/dist - -# local env files -.env.local -.env.*.local - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw* diff --git a/KenticoInspector.WebApplication/ClientApp/README.md b/KenticoInspector.WebApplication/ClientApp/README.md deleted file mode 100644 index f1a0b1c8..00000000 --- a/KenticoInspector.WebApplication/ClientApp/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# ClientApp - -## Project setup -``` -npm install -``` - -### Compiles and hot-reloads for development -``` -npm run serve -``` - -### Compiles and minifies for production -``` -npm run build -``` - -### Run your tests -``` -npm run test -``` - -### Lints and fixes files -``` -npm run lint -``` - -### Customize configuration -See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/KenticoInspector.WebApplication/ClientApp/babel.config.js b/KenticoInspector.WebApplication/ClientApp/babel.config.js deleted file mode 100644 index 932df281..00000000 --- a/KenticoInspector.WebApplication/ClientApp/babel.config.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - "presets": [ - [ - "@vue/app", - { - "useBuiltIns": "entry" - } - ] - ] -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/deploy.sh b/KenticoInspector.WebApplication/ClientApp/deploy.sh deleted file mode 100644 index 813fe43a..00000000 --- a/KenticoInspector.WebApplication/ClientApp/deploy.sh +++ /dev/null @@ -1,2 +0,0 @@ -cp ./dist ../../publish/ClientApp -r -cp ./dist ../../KenticoInspector.DesktopApplication/ClientApp -r \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/package-lock.json b/KenticoInspector.WebApplication/ClientApp/package-lock.json deleted file mode 100644 index 8a22cf0e..00000000 --- a/KenticoInspector.WebApplication/ClientApp/package-lock.json +++ /dev/null @@ -1,12514 +0,0 @@ -{ - "name": "ClientApp", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "ClientApp", - "version": "0.1.0", - "dependencies": { - "@babel/polyfill": "^7.12.1", - "axios": "^1.4.0", - "roboto-fontface": "*", - "vue": "^2.6.8", - "vue-router": "^3.0.1", - "vue-showdown": "^2.4.1", - "vuetify": "^1.5.5", - "vuex": "^3.0.1" - }, - "devDependencies": { - "@mdi/font": "^7.2.96", - "@vue/cli-plugin-babel": "^5.0.8", - "@vue/cli-plugin-eslint": "^5.0.8", - "@vue/cli-service": "^5.0.8", - "babel-eslint": "^10.0.1", - "eslint": "^8.46.0", - "eslint-plugin-vue": "^9.16.1", - "vue-cli-plugin-vuetify": "^2.5.8", - "vue-template-compiler": "^2.7.14" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@achrinza/node-ipc": { - "version": "9.2.7", - "resolved": "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.7.tgz", - "integrity": "sha512-/EvNkqB4HNxPWCZASmgrjqG8gIdPOolD67LGASvGMp/FY5ne0rbvpYg5o9x8RmgjAl8KdmNQ4YlV1et9DYiW8g==", - "dev": true, - "dependencies": { - "@node-ipc/js-queue": "2.0.3", - "event-pubsub": "4.3.0", - "js-message": "1.0.7" - }, - "engines": { - "node": "8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19 || 20" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", - "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", - "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", - "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", - "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz", - "integrity": "sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz", - "integrity": "sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/plugin-syntax-decorators": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz", - "integrity": "sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", - "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", - "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", - "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", - "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", - "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", - "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", - "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", - "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/polyfill": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.12.1.tgz", - "integrity": "sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==", - "deprecated": "🚨 This package has been deprecated in favor of separate inclusion of a polyfill and regenerator-runtime (when needed). See the @babel/polyfill docs (https://babeljs.io/docs/en/babel-polyfill) for more information.", - "dependencies": { - "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.4" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", - "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.7", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.5", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.6", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.6", - "@babel/plugin-transform-parameters": "^7.22.5", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.5", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6.tgz", - "integrity": "sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "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, - "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/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", - "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", - "dev": true, - "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/eslintrc/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, - "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/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/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, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/eslintrc/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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", - "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.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, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, - "node_modules/@mdi/font": { - "version": "7.2.96", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.2.96.tgz", - "integrity": "sha512-e//lmkmpFUMZKhmCY9zdjRe4zNXfbOIJnn6xveHbaV2kSw5aJ5dLXUxcRt1Gxfi7ZYpFLUWlkG2MGSFAiqAu7w==", - "dev": true - }, - "node_modules/@node-ipc/js-queue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@node-ipc/js-queue/-/js-queue-2.0.3.tgz", - "integrity": "sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==", - "dev": true, - "dependencies": { - "easy-stack": "1.0.1" - }, - "engines": { - "node": ">=1.0.0" - } - }, - "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, - "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, - "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, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "dev": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "node_modules/@soda/friendly-errors-webpack-plugin": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", - "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", - "dev": true, - "dependencies": { - "chalk": "^3.0.0", - "error-stack-parser": "^2.0.6", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@soda/friendly-errors-webpack-plugin/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/@soda/friendly-errors-webpack-plugin/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@soda/friendly-errors-webpack-plugin/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@soda/friendly-errors-webpack-plugin/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 - }, - "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/@soda/friendly-errors-webpack-plugin/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@soda/friendly-errors-webpack-plugin/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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@soda/friendly-errors-webpack-plugin/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@soda/get-current-script": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz", - "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", - "dev": true - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.1.tgz", - "integrity": "sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.4.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.6.tgz", - "integrity": "sha512-q0RkvNgMweWWIvSMDiXhflGUKMdIxBo2M2tYM/0kEGDueQByFzK4KZAgu5YHGFNxziTlppNpTIBcqHQAxlfHdA==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@vue/babel-helper-vue-jsx-merge-props": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", - "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==", - "dev": true - }, - "node_modules/@vue/babel-helper-vue-transform-on": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", - "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", - "dev": true - }, - "node_modules/@vue/babel-plugin-jsx": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", - "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "@vue/babel-helper-vue-transform-on": "^1.1.5", - "camelcase": "^6.3.0", - "html-tags": "^3.3.1", - "svg-tags": "^1.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-plugin-jsx/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vue/babel-plugin-transform-vue-jsx": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz", - "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", - "html-tags": "^2.0.0", - "lodash.kebabcase": "^4.1.1", - "svg-tags": "^1.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-plugin-transform-vue-jsx/node_modules/html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@vue/babel-preset-app": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-5.0.8.tgz", - "integrity": "sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.16", - "@babel/helper-compilation-targets": "^7.12.16", - "@babel/helper-module-imports": "^7.12.13", - "@babel/plugin-proposal-class-properties": "^7.12.13", - "@babel/plugin-proposal-decorators": "^7.12.13", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-jsx": "^7.12.13", - "@babel/plugin-transform-runtime": "^7.12.15", - "@babel/preset-env": "^7.12.16", - "@babel/runtime": "^7.12.13", - "@vue/babel-plugin-jsx": "^1.0.3", - "@vue/babel-preset-jsx": "^1.1.2", - "babel-plugin-dynamic-import-node": "^2.3.3", - "core-js": "^3.8.3", - "core-js-compat": "^3.8.3", - "semver": "^7.3.4" - }, - "peerDependencies": { - "@babel/core": "*", - "core-js": "^3", - "vue": "^2 || ^3.2.13" - }, - "peerDependenciesMeta": { - "core-js": { - "optional": true - }, - "vue": { - "optional": true - } - } - }, - "node_modules/@vue/babel-preset-app/node_modules/core-js": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", - "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/@vue/babel-preset-app/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vue/babel-preset-app/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vue/babel-preset-app/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@vue/babel-preset-jsx": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz", - "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==", - "dev": true, - "dependencies": { - "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", - "@vue/babel-sugar-composition-api-inject-h": "^1.4.0", - "@vue/babel-sugar-composition-api-render-instance": "^1.4.0", - "@vue/babel-sugar-functional-vue": "^1.4.0", - "@vue/babel-sugar-inject-h": "^1.4.0", - "@vue/babel-sugar-v-model": "^1.4.0", - "@vue/babel-sugar-v-on": "^1.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0", - "vue": "*" - }, - "peerDependenciesMeta": { - "vue": { - "optional": true - } - } - }, - "node_modules/@vue/babel-sugar-composition-api-inject-h": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz", - "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-sugar-composition-api-render-instance": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz", - "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-sugar-functional-vue": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz", - "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-sugar-inject-h": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz", - "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-sugar-v-model": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz", - "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", - "camelcase": "^5.0.0", - "html-tags": "^2.0.0", - "svg-tags": "^1.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/babel-sugar-v-model/node_modules/html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@vue/babel-sugar-v-on": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz", - "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-jsx": "^7.2.0", - "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", - "camelcase": "^5.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/cli-overlay": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-5.0.8.tgz", - "integrity": "sha512-KmtievE/B4kcXp6SuM2gzsnSd8WebkQpg3XaB6GmFh1BJGRqa1UiW9up7L/Q67uOdTigHxr5Ar2lZms4RcDjwQ==", - "dev": true - }, - "node_modules/@vue/cli-plugin-babel": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.8.tgz", - "integrity": "sha512-a4qqkml3FAJ3auqB2kN2EMPocb/iu0ykeELwed+9B1c1nQ1HKgslKMHMPavYx3Cd/QAx2mBD4hwKBqZXEI/CsQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.16", - "@vue/babel-preset-app": "^5.0.8", - "@vue/cli-shared-utils": "^5.0.8", - "babel-loader": "^8.2.2", - "thread-loader": "^3.0.0", - "webpack": "^5.54.0" - }, - "peerDependencies": { - "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" - } - }, - "node_modules/@vue/cli-plugin-eslint": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.8.tgz", - "integrity": "sha512-d11+I5ONYaAPW1KyZj9GlrV/E6HZePq5L5eAF5GgoVdu6sxr6bDgEoxzhcS1Pk2eh8rn1MxG/FyyR+eCBj/CNg==", - "dev": true, - "dependencies": { - "@vue/cli-shared-utils": "^5.0.8", - "eslint-webpack-plugin": "^3.1.0", - "globby": "^11.0.2", - "webpack": "^5.54.0", - "yorkie": "^2.0.0" - }, - "peerDependencies": { - "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0", - "eslint": ">=7.5.0" - } - }, - "node_modules/@vue/cli-plugin-eslint/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-plugin-eslint/node_modules/eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "dev": true, - "dependencies": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/@vue/cli-plugin-eslint/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-plugin-eslint/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, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/@vue/cli-plugin-eslint/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@vue/cli-plugin-eslint/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@vue/cli-plugin-eslint/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@vue/cli-plugin-eslint/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, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/@vue/cli-plugin-router": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-5.0.8.tgz", - "integrity": "sha512-Gmv4dsGdAsWPqVijz3Ux2OS2HkMrWi1ENj2cYL75nUeL+Xj5HEstSqdtfZ0b1q9NCce+BFB6QnHfTBXc/fCvMg==", - "dev": true, - "dependencies": { - "@vue/cli-shared-utils": "^5.0.8" - }, - "peerDependencies": { - "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" - } - }, - "node_modules/@vue/cli-plugin-vuex": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.8.tgz", - "integrity": "sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA==", - "dev": true, - "peerDependencies": { - "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" - } - }, - "node_modules/@vue/cli-service": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-5.0.8.tgz", - "integrity": "sha512-nV7tYQLe7YsTtzFrfOMIHc5N2hp5lHG2rpYr0aNja9rNljdgcPZLyQRb2YRivTHqTv7lI962UXFURcpStHgyFw==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.12.16", - "@soda/friendly-errors-webpack-plugin": "^1.8.0", - "@soda/get-current-script": "^1.0.2", - "@types/minimist": "^1.2.0", - "@vue/cli-overlay": "^5.0.8", - "@vue/cli-plugin-router": "^5.0.8", - "@vue/cli-plugin-vuex": "^5.0.8", - "@vue/cli-shared-utils": "^5.0.8", - "@vue/component-compiler-utils": "^3.3.0", - "@vue/vue-loader-v15": "npm:vue-loader@^15.9.7", - "@vue/web-component-wrapper": "^1.3.0", - "acorn": "^8.0.5", - "acorn-walk": "^8.0.2", - "address": "^1.1.2", - "autoprefixer": "^10.2.4", - "browserslist": "^4.16.3", - "case-sensitive-paths-webpack-plugin": "^2.3.0", - "cli-highlight": "^2.1.10", - "clipboardy": "^2.3.0", - "cliui": "^7.0.4", - "copy-webpack-plugin": "^9.0.1", - "css-loader": "^6.5.0", - "css-minimizer-webpack-plugin": "^3.0.2", - "cssnano": "^5.0.0", - "debug": "^4.1.1", - "default-gateway": "^6.0.3", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "fs-extra": "^9.1.0", - "globby": "^11.0.2", - "hash-sum": "^2.0.0", - "html-webpack-plugin": "^5.1.0", - "is-file-esm": "^1.0.0", - "launch-editor-middleware": "^2.2.1", - "lodash.defaultsdeep": "^4.6.1", - "lodash.mapvalues": "^4.6.0", - "mini-css-extract-plugin": "^2.5.3", - "minimist": "^1.2.5", - "module-alias": "^2.2.2", - "portfinder": "^1.0.26", - "postcss": "^8.2.6", - "postcss-loader": "^6.1.1", - "progress-webpack-plugin": "^1.0.12", - "ssri": "^8.0.1", - "terser-webpack-plugin": "^5.1.1", - "thread-loader": "^3.0.0", - "vue-loader": "^17.0.0", - "vue-style-loader": "^4.1.3", - "webpack": "^5.54.0", - "webpack-bundle-analyzer": "^4.4.0", - "webpack-chain": "^6.5.1", - "webpack-dev-server": "^4.7.3", - "webpack-merge": "^5.7.3", - "webpack-virtual-modules": "^0.4.2", - "whatwg-fetch": "^3.6.2" - }, - "bin": { - "vue-cli-service": "bin/vue-cli-service.js" - }, - "engines": { - "node": "^12.0.0 || >= 14.0.0" - }, - "peerDependencies": { - "vue-template-compiler": "^2.0.0", - "webpack-sources": "*" - }, - "peerDependenciesMeta": { - "cache-loader": { - "optional": true - }, - "less-loader": { - "optional": true - }, - "pug-plain-loader": { - "optional": true - }, - "raw-loader": { - "optional": true - }, - "sass-loader": { - "optional": true - }, - "stylus-loader": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - }, - "webpack-sources": { - "optional": true - } - } - }, - "node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15": { - "name": "vue-loader", - "version": "15.10.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.1.tgz", - "integrity": "sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==", - "dev": true, - "dependencies": { - "@vue/component-compiler-utils": "^3.1.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "vue-hot-reload-api": "^2.3.0", - "vue-style-loader": "^4.1.0" - }, - "peerDependencies": { - "css-loader": "*", - "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" - }, - "peerDependenciesMeta": { - "cache-loader": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/@vue/cli-service/node_modules/@vue/vue-loader-v15/node_modules/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true - }, - "node_modules/@vue/cli-service/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-service/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vue/cli-service/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, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@vue/cli-service/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-service/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-service/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "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" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@vue/cli-service/node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@vue/cli-service/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/@vue/cli-service/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@vue/cli-service/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 - }, - "node_modules/@vue/cli-service/node_modules/copy-webpack-plugin": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", - "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.7", - "glob-parent": "^6.0.1", - "globby": "^11.0.3", - "normalize-path": "^3.0.0", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/@vue/cli-service/node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/@vue/cli-service/node_modules/css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "dev": true, - "dependencies": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/@vue/cli-service/node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@vue/cli-service/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/@vue/cli-service/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-service/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-service/node_modules/html-webpack-plugin": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", - "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/@vue/cli-service/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, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-service/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-service/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, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/@vue/cli-service/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/@vue/cli-service/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vue/cli-service/node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", - "dev": true, - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/@vue/cli-service/node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@vue/cli-service/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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@vue/cli-service/node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/@vue/cli-service/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@vue/cli-service/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@vue/cli-service/node_modules/schema-utils/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, - "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/@vue/cli-service/node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/@vue/cli-service/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vue/cli-service/node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@vue/cli-service/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-service/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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-service/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@vue/cli-service/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, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/@vue/cli-service/node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/@vue/cli-service/node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@vue/cli-service/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@vue/cli-service/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@vue/cli-service/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@vue/cli-shared-utils": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz", - "integrity": "sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ==", - "dev": true, - "dependencies": { - "@achrinza/node-ipc": "^9.2.5", - "chalk": "^4.1.2", - "execa": "^1.0.0", - "joi": "^17.4.0", - "launch-editor": "^2.2.1", - "lru-cache": "^6.0.0", - "node-fetch": "^2.6.7", - "open": "^8.0.2", - "ora": "^5.3.0", - "read-pkg": "^5.1.1", - "semver": "^7.3.4", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/@vue/cli-shared-utils/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-shared-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vue/cli-shared-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@vue/cli-shared-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@vue/cli-shared-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@vue/cli-shared-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-shared-utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vue/cli-shared-utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vue/cli-shared-utils/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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-shared-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-shared-utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@vue/compiler-sfc": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", - "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", - "dependencies": { - "@babel/parser": "^7.18.4", - "postcss": "^8.4.14", - "source-map": "^0.6.1" - } - }, - "node_modules/@vue/component-compiler-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", - "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", - "dev": true, - "dependencies": { - "consolidate": "^0.15.1", - "hash-sum": "^1.0.2", - "lru-cache": "^4.1.2", - "merge-source-map": "^1.1.0", - "postcss": "^7.0.36", - "postcss-selector-parser": "^6.0.2", - "source-map": "~0.6.1", - "vue-template-es2015-compiler": "^1.9.0" - }, - "optionalDependencies": { - "prettier": "^1.18.2 || ^2.0.0" - } - }, - "node_modules/@vue/component-compiler-utils/node_modules/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true - }, - "node_modules/@vue/component-compiler-utils/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/@vue/component-compiler-utils/node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/@vue/web-component-wrapper": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", - "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", - "dev": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "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, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ajv/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/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 - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-eslint": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz", - "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==", - "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - }, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "eslint": ">= 4.12.1" - } - }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dev": true, - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "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==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/bl/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/bl/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==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dev": true, - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "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 - }, - "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, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camel-case/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "dev": true - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001518", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001518.tgz", - "integrity": "sha512-rup09/e3I0BKjncL+FesTayKtPrdwKhUufQFd3riFw1hHg8JmIFoInYfB102cFcY/pPgGmdyl/iy+jgiDi2vdA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", - "dev": true - }, - "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "bin": { - "highlight": "bin/highlight" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" - } - }, - "node_modules/cli-highlight/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cli-highlight/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, - "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/cli-highlight/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cli-highlight/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cli-highlight/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 - }, - "node_modules/cli-highlight/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/cli-highlight/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-highlight/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/cli-highlight/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-highlight/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-highlight/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", - "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", - "dev": true, - "dependencies": { - "arch": "^2.1.1", - "execa": "^1.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/consolidate": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", - "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", - "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", - "dev": true, - "dependencies": { - "bluebird": "^3.1.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/core-js-compat": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", - "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.9" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "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, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "dev": true, - "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dev": true, - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } - }, - "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 - }, - "node_modules/deepmerge": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", - "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/default-gateway/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, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/default-gateway/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/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, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-gateway/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, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "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, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, - "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-case/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "dev": true - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/easy-stack": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", - "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.482", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.482.tgz", - "integrity": "sha512-h+UqpfmEr1Qkk0zp7ej/jid7CXoq4m4QzW6wNTb0ELJ/BZCpA4wgUylBIMGCe621tnr4l5VmoHjdoSx2lbnNJA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dev": true, - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", - "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "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.2", - "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.16.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.16.1.tgz", - "integrity": "sha512-2FtnTqazA6aYONfDuOZTk0QzwhAwi7Z4+uJ7+GHeGxcKapjqWlDsRWDenvyG/utyOfAS5bVRmAG3cEWiYEz2bA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.13", - "semver": "^7.5.4", - "vue-eslint-parser": "^9.3.1", - "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" - } - }, - "node_modules/eslint-plugin-vue/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-vue/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-vue/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/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, - "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/eslint/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/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, - "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/eslint/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/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 - }, - "node_modules/eslint/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, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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, - "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/node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/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, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "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, - "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/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/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, - "engines": { - "node": ">=4.0" - } - }, - "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, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/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, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-pubsub": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", - "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/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 - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-glob/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, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/fast-glob/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/fast-glob/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, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "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 - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=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, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "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, - "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.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", - "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "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, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/globals": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", - "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "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/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-sum": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", - "dev": true - }, - "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, - "bin": { - "he": "bin/he" - } - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/http-proxy-middleware/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/http-proxy-middleware/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, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-proxy-middleware/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/http-proxy-middleware/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, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "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, - "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": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dev": true, - "dependencies": { - "ci-info": "^1.5.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-file-esm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-file-esm/-/is-file-esm-1.0.0.tgz", - "integrity": "sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA==", - "dev": true, - "dependencies": { - "read-pkg-up": "^7.0.1" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "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, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/javascript-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", - "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", - "dev": true - }, - "node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-message": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", - "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", - "dev": true, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "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, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "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 - }, - "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": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" - } - }, - "node_modules/launch-editor-middleware": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz", - "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==", - "dev": true, - "dependencies": { - "launch-editor": "^2.2.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, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/loader-utils/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "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, - "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 - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", - "dev": true - }, - "node_modules/lodash.kebabcase": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", - "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", - "dev": true - }, - "node_modules/lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "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 - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/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, - "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/log-symbols/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/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 - }, - "node_modules/log-symbols/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", - "dev": true, - "dependencies": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lower-case/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "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, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/module-alias": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz", - "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", - "dev": true - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/no-case/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/null-loader": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", - "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/null-loader/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, - "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/null-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/null-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/null-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ora/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, - "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/ora/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ora/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 - }, - "node_modules/ora/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ora/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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, - "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, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/param-case/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "dev": true - }, - "node_modules/parent-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz", - "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module/node_modules/callsites": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/pascal-case/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", - "dev": true - }, - "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, - "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "dev": true, - "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/postcss": { - "version": "8.4.27", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", - "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dev": true, - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dev": true, - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dev": true, - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "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, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "optional": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "node_modules/progress-webpack-plugin": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/progress-webpack-plugin/-/progress-webpack-plugin-1.0.16.tgz", - "integrity": "sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA==", - "dev": true, - "dependencies": { - "chalk": "^2.1.0", - "figures": "^2.0.0", - "log-update": "^2.3.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "peerDependencies": { - "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/renderkid/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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/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, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "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, - "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==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roboto-fontface": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/roboto-fontface/-/roboto-fontface-0.10.0.tgz", - "integrity": "sha512-OlwfYEgA2RdboZohpldlvJ1xngOins5d7ejqnIBWr9KaMxsnBqotpptRXTyfNRLnFpqzX6sTDt+X+a+6udnU8g==" - }, - "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" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "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==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/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, - "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/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dev": true, - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/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 - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/showdown": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", - "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", - "dependencies": { - "yargs": "^14.2" - }, - "bin": { - "showdown": "bin/showdown.js" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^1.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "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, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/spdy-transport/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==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true - }, - "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", - "dev": 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-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/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, - "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/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/terser-webpack-plugin/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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 - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/thread-loader": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-3.0.4.tgz", - "integrity": "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==", - "dev": true, - "dependencies": { - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^4.1.0", - "loader-utils": "^2.0.0", - "neo-async": "^2.6.2", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.27.0 || ^5.0.0" - } - }, - "node_modules/thread-loader/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, - "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/thread-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/thread-loader/node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/thread-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "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": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "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, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, - "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": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vue": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", - "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", - "dependencies": { - "@vue/compiler-sfc": "2.7.14", - "csstype": "^3.1.0" - } - }, - "node_modules/vue-cli-plugin-vuetify": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/vue-cli-plugin-vuetify/-/vue-cli-plugin-vuetify-2.5.8.tgz", - "integrity": "sha512-uqi0/URJETJBbWlQHD1l0pnY7JN8Ytu+AL1fw50HFlGByPa8/xx+mq19GkFXA9FcwFT01IqEc/TkxMPugchomg==", - "dev": true, - "dependencies": { - "null-loader": "^4.0.1", - "semver": "^7.1.2", - "shelljs": "^0.8.3" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "sass-loader": { - "optional": true - }, - "vuetify-loader": { - "optional": true - } - } - }, - "node_modules/vue-cli-plugin-vuetify/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vue-cli-plugin-vuetify/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vue-cli-plugin-vuetify/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/vue-eslint-parser": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", - "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", - "dev": true, - "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-eslint-parser/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, - "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/vue-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/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, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vue-eslint-parser/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vue-eslint-parser/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", - "dev": true - }, - "node_modules/vue-loader": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.2.2.tgz", - "integrity": "sha512-aqNvKJvnz2A/6VWeJZodAo8XLoAlVwBv+2Z6dama+LHsAF+P/xijQ+OfWrxIs0wcGSJduvdzvTuATzXbNKkpiw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "watchpack": "^2.4.0" - }, - "peerDependencies": { - "webpack": "^4.1.0 || ^5.0.0-0" - }, - "peerDependenciesMeta": { - "@vue/compiler-sfc": { - "optional": true - }, - "vue": { - "optional": true - } - } - }, - "node_modules/vue-loader/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/vue-loader/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, - "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/vue-loader/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/vue-loader/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 - }, - "node_modules/vue-loader/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/vue-loader/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/vue-router": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", - "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==" - }, - "node_modules/vue-showdown": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/vue-showdown/-/vue-showdown-2.4.1.tgz", - "integrity": "sha512-bjIadKGnP6XrX41gWL/lKl+7D3t22XXAIPZji/wt0sK32hEK/ejALfN1BSRWcs7oEe+EFOsJG9KRoC+B5HDmnQ==", - "dependencies": { - "showdown": "^1.9.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "vue": "2.x" - } - }, - "node_modules/vue-style-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", - "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", - "dev": true, - "dependencies": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - } - }, - "node_modules/vue-style-loader/node_modules/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true - }, - "node_modules/vue-template-compiler": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", - "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", - "dev": true, - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true - }, - "node_modules/vuetify": { - "version": "1.5.24", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-1.5.24.tgz", - "integrity": "sha512-guFOgEgZ8VpSgNXOv1QL2fOliaJBoiyNnf+bBqcXsnIppJGRlW1wyT6Ux7ZlQyphSHs+UK1aJNUjcyAtoOiHWg==", - "peerDependencies": { - "vue": "^2.5.18" - } - }, - "node_modules/vuex": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", - "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", - "peerDependencies": { - "vue": "^2.0.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz", - "integrity": "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", - "commander": "^7.2.0", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "opener": "^1.5.2", - "sirv": "^1.0.7", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/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, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/webpack-bundle-analyzer/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, - "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/webpack-bundle-analyzer/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, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/webpack-bundle-analyzer/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 - }, - "node_modules/webpack-bundle-analyzer/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-bundle-analyzer/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-chain": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", - "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", - "dev": true, - "dependencies": { - "deepmerge": "^1.5.2", - "javascript-stringify": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-merge": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", - "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-merge/node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-merge/node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", - "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==", - "dev": true - }, - "node_modules/webpack/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, - "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/webpack/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.17", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", - "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "14.2.3", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", - "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", - "dependencies": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.1" - } - }, - "node_modules/yargs-parser": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz", - "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "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, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yorkie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", - "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "execa": "^0.8.0", - "is-ci": "^1.0.10", - "normalize-path": "^1.0.0", - "strip-indent": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yorkie/node_modules/execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yorkie/node_modules/normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - } - } -} diff --git a/KenticoInspector.WebApplication/ClientApp/package.json b/KenticoInspector.WebApplication/ClientApp/package.json deleted file mode 100644 index 12694ab5..00000000 --- a/KenticoInspector.WebApplication/ClientApp/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "ClientApp", - "version": "0.1.0", - "private": true, - "scripts": { - "serve": "vue-cli-service serve", - "build": "vue-cli-service build", - "lint": "vue-cli-service lint", - "deploy": "npm run build && deploy.sh" - }, - "dependencies": { - "@babel/polyfill": "^7.12.1", - "axios": "^1.4.0", - "roboto-fontface": "*", - "vue": "^2.6.8", - "vue-router": "^3.0.1", - "vue-showdown": "^2.4.1", - "vuetify": "^1.5.5", - "vuex": "^3.0.1" - }, - "devDependencies": { - "@mdi/font": "^7.2.96", - "@vue/cli-plugin-babel": "^5.0.8", - "@vue/cli-plugin-eslint": "^5.0.8", - "@vue/cli-service": "^5.0.8", - "babel-eslint": "^10.0.1", - "eslint": "^8.46.0", - "eslint-plugin-vue": "^9.16.1", - "vue-cli-plugin-vuetify": "^2.5.8", - "vue-template-compiler": "^2.7.14" - } -} diff --git a/KenticoInspector.WebApplication/ClientApp/postcss.config.js b/KenticoInspector.WebApplication/ClientApp/postcss.config.js deleted file mode 100644 index 961986e2..00000000 --- a/KenticoInspector.WebApplication/ClientApp/postcss.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - plugins: { - autoprefixer: {} - } -} diff --git a/KenticoInspector.WebApplication/ClientApp/public/index.html b/KenticoInspector.WebApplication/ClientApp/public/index.html deleted file mode 100644 index bb97908d..00000000 --- a/KenticoInspector.WebApplication/ClientApp/public/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - Kentico Inspector - - - -
- - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/api/action-service.js b/KenticoInspector.WebApplication/ClientApp/src/api/action-service.js deleted file mode 100644 index 1dbe56b4..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/api/action-service.js +++ /dev/null @@ -1,25 +0,0 @@ -import axios from "axios"; - -class ActionService { - getAll(instanceGuid) { - return new Promise((resolve)=>{ - axios.get(`/api/actions/${instanceGuid}`) - .then(r => r.data) - .then(reports => { - resolve(reports) - }) - }) - } - - execute ({codename, instanceGuid, options}) { - return new Promise((resolve)=>{ - axios.post(`/api/actions/${codename}/execute/${instanceGuid}`, options) - .then(r => r.data) - .then(results => { - resolve(results) - }) - }) - } -} - -export const actionService = new ActionService() \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/api/index.js b/KenticoInspector.WebApplication/ClientApp/src/api/index.js deleted file mode 100644 index dd6340ad..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/api/index.js +++ /dev/null @@ -1,53 +0,0 @@ -import axios from "axios"; -import { arrayToObject } from '../helpers' -import { actionService } from './action-service' -import { reportService } from './report-service' - -export default { - actionService, - reportService, - getInstances () { - return new Promise((resolve)=>{ - axios.get("/api/instances") - .then(r => r.data) - .then(instances => { - const instancesObject = arrayToObject(instances, "guid") - resolve(instancesObject) - }) - }) - }, - - upsertInstance (instance) { - return new Promise((resolve,reject)=>{ - axios.post("/api/instances", instance) - .then(r => r.data) - .catch(reject) - .then(instance => { - resolve(instance) - }) - }) - }, - - deleteInstance (guid) { - return new Promise((resolve)=>{ - axios.delete(`/api/instances/${guid}`) - .then(r => r.data) - .then(result => { - resolve(result) - }) - }) - }, - - getInstanceDetails (guid) { - return new Promise((resolve,reject)=>{ - axios.get(`/api/instances/details/${guid}`) - .then(r => r.data) - .catch(reason => { - reject({ message: 'Error Connecting', response: reason.response }) - }) - .then(result => { - resolve(result) - }) - }) - } -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/api/report-service.js b/KenticoInspector.WebApplication/ClientApp/src/api/report-service.js deleted file mode 100644 index 0ce90ddf..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/api/report-service.js +++ /dev/null @@ -1,25 +0,0 @@ -import axios from "axios"; - -class ReportService { - getReports(instanceGuid) { - return new Promise((resolve)=>{ - axios.get(`/api/reports/${instanceGuid}`) - .then(r => r.data) - .then(reports => { - resolve(reports) - }) - }) - } - - getReportResults ({codename, instanceGuid}) { - return new Promise((resolve)=>{ - axios.get(`/api/reports/${codename}/results/${instanceGuid}`) - .then(r => r.data) - .then(results => { - resolve(results) - }) - }) - } -} - -export const reportService = new ReportService() \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/app.vue b/KenticoInspector.WebApplication/ClientApp/src/app.vue deleted file mode 100644 index 7b78d905..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/app.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/assets/background.png b/KenticoInspector.WebApplication/ClientApp/src/assets/background.png deleted file mode 100644 index 169cb1cc..00000000 Binary files a/KenticoInspector.WebApplication/ClientApp/src/assets/background.png and /dev/null differ diff --git a/KenticoInspector.WebApplication/ClientApp/src/assets/kentico.svg b/KenticoInspector.WebApplication/ClientApp/src/assets/kentico.svg deleted file mode 100644 index b8b5a613..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/assets/kentico.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/action-filters.vue b/KenticoInspector.WebApplication/ClientApp/src/components/action-filters.vue deleted file mode 100644 index c2439489..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/action-filters.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/action-list-item.vue b/KenticoInspector.WebApplication/ClientApp/src/components/action-list-item.vue deleted file mode 100644 index 955bca61..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/action-list-item.vue +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/action-list.vue b/KenticoInspector.WebApplication/ClientApp/src/components/action-list.vue deleted file mode 100644 index f33bef92..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/action-list.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/connection-status-indicator.vue b/KenticoInspector.WebApplication/ClientApp/src/components/connection-status-indicator.vue deleted file mode 100644 index 69a3f955..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/connection-status-indicator.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/instance-connect-form-manual.vue b/KenticoInspector.WebApplication/ClientApp/src/components/instance-connect-form-manual.vue deleted file mode 100644 index a35c2045..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/instance-connect-form-manual.vue +++ /dev/null @@ -1,141 +0,0 @@ - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/instance-connection-list-item.vue b/KenticoInspector.WebApplication/ClientApp/src/components/instance-connection-list-item.vue deleted file mode 100644 index f811dac7..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/instance-connection-list-item.vue +++ /dev/null @@ -1,50 +0,0 @@ - - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/instance-connection-list.vue b/KenticoInspector.WebApplication/ClientApp/src/components/instance-connection-list.vue deleted file mode 100644 index ed125324..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/instance-connection-list.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/instance-details.vue b/KenticoInspector.WebApplication/ClientApp/src/components/instance-details.vue deleted file mode 100644 index 28508a02..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/instance-details.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/modal-instance-connecting.vue b/KenticoInspector.WebApplication/ClientApp/src/components/modal-instance-connecting.vue deleted file mode 100644 index 5662264d..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/modal-instance-connecting.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/report-filters.vue b/KenticoInspector.WebApplication/ClientApp/src/components/report-filters.vue deleted file mode 100644 index db691d8d..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/report-filters.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/report-list-item.vue b/KenticoInspector.WebApplication/ClientApp/src/components/report-list-item.vue deleted file mode 100644 index aadc869f..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/report-list-item.vue +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/report-list.vue b/KenticoInspector.WebApplication/ClientApp/src/components/report-list.vue deleted file mode 100644 index 66824b52..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/report-list.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/report-result-details-table.vue b/KenticoInspector.WebApplication/ClientApp/src/components/report-result-details-table.vue deleted file mode 100644 index 4c879e73..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/report-result-details-table.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/report-result-details.vue b/KenticoInspector.WebApplication/ClientApp/src/components/report-result-details.vue deleted file mode 100644 index 7a4aad9a..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/report-result-details.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/components/the-main-toolbar.vue b/KenticoInspector.WebApplication/ClientApp/src/components/the-main-toolbar.vue deleted file mode 100644 index 16254c25..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/components/the-main-toolbar.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/helpers/index.js b/KenticoInspector.WebApplication/ClientApp/src/helpers/index.js deleted file mode 100644 index ea0124ed..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/helpers/index.js +++ /dev/null @@ -1,6 +0,0 @@ -export function arrayToObject(array, keyField) { - return array.reduce((obj, item) =>{ - obj[item[keyField]] = item - return obj - }, {}) -} diff --git a/KenticoInspector.WebApplication/ClientApp/src/main.js b/KenticoInspector.WebApplication/ClientApp/src/main.js deleted file mode 100644 index 00139f8e..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/main.js +++ /dev/null @@ -1,23 +0,0 @@ -import '@babel/polyfill' -import Vue from 'vue' -import VueShowdown from 'vue-showdown' -import './plugins/vuetify' -import App from './app.vue' -import router from './router' -import store from './store' -import 'roboto-fontface/css/roboto/roboto-fontface.css' -import '@mdi/font/css/materialdesignicons.css' - -Vue.config.productionTip = false - -Vue.use(VueShowdown, { - options: { - openLinksInNewWindow: true - } -}) - -new Vue({ - router, - store, - render: h => h(App) -}).$mount('#app') diff --git a/KenticoInspector.WebApplication/ClientApp/src/plugins/vuetify.js b/KenticoInspector.WebApplication/ClientApp/src/plugins/vuetify.js deleted file mode 100644 index 3676d59d..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/plugins/vuetify.js +++ /dev/null @@ -1,17 +0,0 @@ -import Vue from 'vue' -import Vuetify from 'vuetify' -import colors from 'vuetify/lib/util/colors' -import 'vuetify/dist/vuetify.min.css' - -Vue.use(Vuetify, { - iconfont: 'mdi', - theme: { - primary: "#f05a22", - secondary: colors.grey.darken3, - accent: colors.deepOrange.lighten4, - error: colors.red.lighten2, - info: colors.blue.lighten3, - success: colors.green.lighten1, - warning: colors.amber.lighten1 - }, -}) diff --git a/KenticoInspector.WebApplication/ClientApp/src/router.js b/KenticoInspector.WebApplication/ClientApp/src/router.js deleted file mode 100644 index babcccdb..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/router.js +++ /dev/null @@ -1,41 +0,0 @@ -import Vue from 'vue' -import Router from 'vue-router' -import Home from './views/home.vue' - -Vue.use(Router) - -export default new Router({ - mode: 'history', - base: process.env.BASE_URL, - routes: [ - { - path: '/', - name: 'home', - component: Home - }, - { - path: '/connect', - name: 'connect', - // route level code-splitting - // this generates a separate chunk (instance-connect.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => import(/* webpackChunkName: "instance-connect" */ './views/instance-connections.vue') - }, - { - path: '/reports', - name: 'reports', - // route level code-splitting - // this generates a separate chunk (instance-connect.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => import(/* webpackChunkName: "reports" */ './views/reports.vue') - }, - { - path: '/actions', - name: 'actions', - // route level code-splitting - // this generates a separate chunk (instance-connect.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => import(/* webpackChunkName: "reports" */ './views/actions.vue') - } - ] -}) diff --git a/KenticoInspector.WebApplication/ClientApp/src/store/index.js b/KenticoInspector.WebApplication/ClientApp/src/store/index.js deleted file mode 100644 index 3fc9c63a..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/store/index.js +++ /dev/null @@ -1,18 +0,0 @@ -import Vue from 'vue' -import Vuex from 'vuex' -import actions from './modules/actions' -import instances from './modules/instances' -import reports from './modules/reports' - -Vue.use(Vuex) - -const debug = process.env.NODE_ENV !== 'production' - -export default new Vuex.Store({ - modules: { - actions, - instances, - reports - }, - strict: debug -}) \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/store/modules/actions.js b/KenticoInspector.WebApplication/ClientApp/src/store/modules/actions.js deleted file mode 100644 index cb25eb53..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/store/modules/actions.js +++ /dev/null @@ -1,106 +0,0 @@ -import Vue from 'vue' -import api from '../../api' - -const state = { - items: [], - filterSettings: { - majorVersion: -1, - showIncompatible: false, - showUntested: false, - taggedWith: [] - }, - reportResults: {}, - loadingItems: false -} - -const getters = { - filtered: (state) => { - const items = state.items.filter(item => { - const version = state.filterSettings.majorVersion - const showIncompatible = state.filterSettings.showIncompatible - const showUntested = state.filterSettings.showUntested - const taggedWith = state.filterSettings.taggedWith - const isCompatible = version > 0 && item.compatibleVersions.filter(x => x.major === version).length > 0 - const isIncompatible = item.incompatibleVersions.filter(x => x.major === version).length > 0 - const isUntested = !isCompatible && !isIncompatible - - const meetsCompatibilityFilters = isCompatible || (showIncompatible && isIncompatible) || (showUntested && isUntested) - const meetsTagFilter = taggedWith.length == 0 || item.tags.some(t=>taggedWith.includes(t)) - - return meetsCompatibilityFilters && meetsTagFilter - }) - - return items - }, - - getTags: (state) => { - const allTags = state.items.reduce(getTags, []) - return getUniqueTags(allTags) - }, - - getActionResult: (state) => (codename, instanceGuid) => { - const resultId = `${codename}-${instanceGuid}` - const currentResult = state.reportResults[resultId] - return currentResult ? currentResult : { - loading: false, - results: null - } - } -} - -const actions = { - getAll: ({ commit }, instanceGuid) => { - api.actionService.getAll(instanceGuid) - .then(items => { - commit('setItems', items) - }) - }, - execute: ({ commit }, { codename, instanceGuid, options }) => { - commit('setItemResults', { codename, loading: true }) - api.actionService.execute({ codename, instanceGuid, options }) - .then(results => { - const resultId = `${codename}-${instanceGuid}` - commit('setItemResults', { resultId, loading: false, results }) - }) - }, - resetFilterSettings: ({ commit }, { majorVersion = -1, showIncompatible = false, showUntested = false, taggedWith = [] }) => { - commit('setFilterSettings', { - majorVersion, - showIncompatible, - showUntested, - taggedWith - }) - } -} - -const mutations = { - setItems (state, items) { - state.items = items - }, - setItemResults (state, { resultId, loading, results }) { - Vue.set(state.reportResults, resultId, { loading, results }) - }, - setFilterSetting(state, { name, value }) { - Vue.set(state.filterSettings, name, value) - }, - setFilterSettings(state, filterSettings) { - state.filterSettings = filterSettings - }, -} - -export default { - namespaced: true, - state, - getters, - actions, - mutations -} - -function getTags (allTags, action) { - allTags.push(...action.tags) - return allTags -} - -function getUniqueTags (allTags) { - return [...new Set(allTags)] -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/store/modules/instances.js b/KenticoInspector.WebApplication/ClientApp/src/store/modules/instances.js deleted file mode 100644 index d56cd25f..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/store/modules/instances.js +++ /dev/null @@ -1,109 +0,0 @@ -import api from '../../api' - -const state = { - items: {}, - currentInstanceDetails: null, - upserting: false, - upsertingError: null, - connecting: false, - connectionError: null -} - -const getters = { - isConnected: state => { - return !!state.currentInstanceDetails - }, - - connectedInstance: (state, getters) => { - return getters.isConnected ? state.items[state.currentInstanceDetails.guid] : null - }, - - connectedInstanceDetails: (state, getters) => { - return getters.isConnected ? state.currentInstanceDetails : null - }, - - getInstanceDisplayName: (state) => (guid) => { - const name = state.items[guid].name - return name ? name : "(UNNAMED)" - } -} - -const actions = { - async getAll ({ commit }) { - commit('setItems', await api.getInstances()) - }, - - async upsertItem ({ commit, dispatch }, instance) { - commit('setUpserting',true) - try { - const newInstance = await api.upsertInstance(instance) - dispatch('getAll') - return newInstance - } catch (error) { - commit('setUpsertingError', error) - } - - commit('setUpserting',false) - }, - - async deleteItem ({ dispatch }, guid) { - await api.deleteInstance(guid) - await dispatch('getAll') - }, - - async connect ({ commit }, guid) { - commit('setConnecting',true) - - try { - const instanceDetails = await api.getInstanceDetails(guid) - commit('setCurrentInstanceDetails', instanceDetails) - } catch (error) { - commit('setConnectionError', error) - } - - commit('setConnecting',false) - }, - - cancelConnecting: ({ commit }) => { - commit('setConnecting', false) - commit('setConnectionError', null) - }, - - disconnect: ({ commit }) => { - commit('setCurrentInstanceDetails', null) - }, -} - -const mutations = { - setConnecting (state, status) { - state.connecting = status - }, - - setConnectionError (state, reason) { - state.connectionError = reason - }, - - setUpserting (state, status) { - state.upserting = status - }, - - setUpsertingError (state, reason) { - state.upsertingError = reason - }, - - setCurrentInstanceDetails (state, instanceDetails) { - state.currentInstanceDetails = instanceDetails - }, - - setItems (state, items) { - state.items = items - }, -} - -export default { - namespaced: true, - state, - getters, - actions, - mutations -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/store/modules/reports.js b/KenticoInspector.WebApplication/ClientApp/src/store/modules/reports.js deleted file mode 100644 index e46ec5bf..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/store/modules/reports.js +++ /dev/null @@ -1,107 +0,0 @@ -import Vue from 'vue' -import api from '../../api' - -const state = { - items: [], - filterSettings: { - majorVersion: -1, - showIncompatible: false, - showUntested: false, - taggedWith: [] - }, - reportResults: {}, - loadingItems: false -} - -const getters = { - filtered: (state) => { - const items = state.items.filter(item => { - const version = state.filterSettings.majorVersion - const showIncompatible = state.filterSettings.showIncompatible - const showUntested = state.filterSettings.showUntested - const taggedWith = state.filterSettings.taggedWith - const isCompatible = version > 0 && item.compatibleVersions.filter(x => x.major === version).length > 0 - const isIncompatible = item.incompatibleVersions.filter(x => x.major === version).length > 0 - const isUntested = !isCompatible && !isIncompatible - - const meetsCompatibilityFilters = isCompatible || (showIncompatible && isIncompatible) || (showUntested && isUntested) - const meetsTagFilter = taggedWith.length == 0 || item.tags.some(t=>taggedWith.includes(t)) - const meetsToolFilter = item.modifiesData === state.filterSettings.showTools - - return meetsCompatibilityFilters && meetsTagFilter && meetsToolFilter - }) - - return items - }, - - getTags: (state) => { - const allTags = state.items.reduce(getTagsFromReports, []) - return getUniqueTags(allTags) - }, - - getReportResult: (state) => (codename, instanceGuid) => { - const resultId = `${codename}-${instanceGuid}` - const currentResult = state.reportResults[resultId] - return currentResult ? currentResult : { - loading: false, - results: null - } - } -} - -const actions = { - getAll: ({ commit }, instanceGuid) => { - api.reportService.getReports(instanceGuid) - .then(items => { - commit('setItems', items) - }) - }, - runReport: ({ commit }, { codename, instanceGuid }) => { - commit('setItemResults', { codename, loading: true }) - api.reportService.getReportResults({ codename, instanceGuid }) - .then(results => { - const resultId = `${codename}-${instanceGuid}` - commit('setItemResults', { resultId, loading: false, results }) - }) - }, - resetFilterSettings: ({ commit }, { majorVersion = -1, showIncompatible = false, showUntested = false, taggedWith = [] }) => { - commit('setFilterSettings', { - majorVersion, - showIncompatible, - showUntested, - taggedWith - }) - } -} - -const mutations = { - setItems (state, items) { - state.items = items - }, - setItemResults (state, { resultId, loading, results }) { - Vue.set(state.reportResults, resultId, { loading, results }) - }, - setFilterSetting(state, { name, value }) { - Vue.set(state.filterSettings, name, value) - }, - setFilterSettings(state, filterSettings) { - state.filterSettings = filterSettings - }, -} - -export default { - namespaced: true, - state, - getters, - actions, - mutations -} - -function getTagsFromReports (allTags, report) { - allTags.push(...report.tags) - return allTags -} - -function getUniqueTags (allTags) { - return [...new Set(allTags)] -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/ClientApp/src/views/actions.vue b/KenticoInspector.WebApplication/ClientApp/src/views/actions.vue deleted file mode 100644 index 82224ffe..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/views/actions.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/views/home.vue b/KenticoInspector.WebApplication/ClientApp/src/views/home.vue deleted file mode 100644 index d3d3cb19..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/views/home.vue +++ /dev/null @@ -1,31 +0,0 @@ - diff --git a/KenticoInspector.WebApplication/ClientApp/src/views/instance-connections.vue b/KenticoInspector.WebApplication/ClientApp/src/views/instance-connections.vue deleted file mode 100644 index f517f29d..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/views/instance-connections.vue +++ /dev/null @@ -1,73 +0,0 @@ - - - - diff --git a/KenticoInspector.WebApplication/ClientApp/src/views/reports.vue b/KenticoInspector.WebApplication/ClientApp/src/views/reports.vue deleted file mode 100644 index 88b7c2f2..00000000 --- a/KenticoInspector.WebApplication/ClientApp/src/views/reports.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - diff --git a/KenticoInspector.WebApplication/ClientApp/vue.config.js b/KenticoInspector.WebApplication/ClientApp/vue.config.js deleted file mode 100644 index e58944c5..00000000 --- a/KenticoInspector.WebApplication/ClientApp/vue.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - lintOnSave: undefined -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/Controllers/ActionsController.cs b/KenticoInspector.WebApplication/Controllers/ActionsController.cs deleted file mode 100644 index 21137dc4..00000000 --- a/KenticoInspector.WebApplication/Controllers/ActionsController.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Threading.Tasks; - -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Modules; -using KenticoInspector.Core.Services.Interfaces; - -using Microsoft.AspNetCore.Mvc; - -namespace KenticoInspector.WebApplication.Controllers -{ - [Route("api/[controller]")] - [ApiController] - public class ActionsController : ControllerBase - { - private readonly IModuleService moduleService; - - public ActionsController(IModuleService moduleService) - { - this.moduleService = moduleService; - } - - [HttpGet("{instanceGuid}")] - public Task> Get(Guid instanceGuid) - { - return Task.FromResult(moduleService.GetActions(instanceGuid)); - } - - [HttpPost("{codename}/execute/{instanceGuid}")] - public async Task Excecute(string codename, Guid instanceGuid) - { - using StreamReader reader = new(Request.Body, Encoding.UTF8); - var optionsJson = await reader.ReadToEndAsync(); - return moduleService.ExecuteAction(codename, instanceGuid, optionsJson); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/Controllers/InstancesController.cs b/KenticoInspector.WebApplication/Controllers/InstancesController.cs deleted file mode 100644 index 98bc21d1..00000000 --- a/KenticoInspector.WebApplication/Controllers/InstancesController.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; - -using Microsoft.AspNetCore.Mvc; - -namespace KenticoInspector.WebApplication.Controllers -{ - [Route("api/[controller]")] - [ApiController] - public class InstancesController : ControllerBase - { - private readonly IInstanceService _instanceService; - - public InstancesController(IInstanceService instanceService) - { - _instanceService = instanceService; - } - - [HttpGet("details/{instanceGuid}")] - public Task Details(Guid instanceGuid) - { - return Task.FromResult(_instanceService.GetInstanceDetails(instanceGuid)); - } - - [HttpDelete("{instanceGuid}")] - public void Delete(Guid instanceGuid) - { - _instanceService.DeleteInstance(instanceGuid); - } - - [HttpGet] - public Task> Get() - { - var instances = _instanceService.GetInstances(); - return Task.FromResult(instances.ToList()); - } - - [HttpGet("{instanceGuid}")] - public Task Get(Guid instanceGuid) - { - return Task.FromResult(_instanceService.GetInstance(instanceGuid)); - } - - [HttpPost] - public Task Post([FromBody] Instance instance) - { - return Task.FromResult(_instanceService.UpsertInstance(instance)); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/Controllers/ReportsController.cs b/KenticoInspector.WebApplication/Controllers/ReportsController.cs deleted file mode 100644 index df585185..00000000 --- a/KenticoInspector.WebApplication/Controllers/ReportsController.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Modules; -using KenticoInspector.Core.Services.Interfaces; - -using Microsoft.AspNetCore.Mvc; - -namespace KenticoInspector.WebApplication.Controllers -{ - [Route("api/[controller]")] - [ApiController] - public class ReportsController : ControllerBase - { - private readonly IModuleService moduleService; - - public ReportsController(IModuleService moduleService) - { - this.moduleService = moduleService; - } - - [HttpGet("{instanceGuid}")] - public Task> Get(Guid instanceGuid) - { - return Task.FromResult(moduleService.GetReports(instanceGuid)); - } - - [HttpGet("{codename}/results/{instanceGuid}")] - public Task Get(string codename, Guid instanceGuid) - { - return Task.FromResult(moduleService.GetReportResults(codename, instanceGuid)); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/Directory.Build.props b/KenticoInspector.WebApplication/Directory.Build.props deleted file mode 100644 index c4e59780..00000000 --- a/KenticoInspector.WebApplication/Directory.Build.props +++ /dev/null @@ -1,8 +0,0 @@ - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - \ No newline at end of file diff --git a/KenticoInspector.WebApplication/KenticoInspector.WebApplication.csproj b/KenticoInspector.WebApplication/KenticoInspector.WebApplication.csproj deleted file mode 100644 index 88acef50..00000000 --- a/KenticoInspector.WebApplication/KenticoInspector.WebApplication.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - net8.0 - InProcess - - 9.0 - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/KenticoInspector.WebApplication/Program.cs b/KenticoInspector.WebApplication/Program.cs deleted file mode 100644 index ea49933b..00000000 --- a/KenticoInspector.WebApplication/Program.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Hosting; - -namespace KenticoInspector.WebApplication -{ - public static class Program - { - public static void Main(string[] args) - { - CreateWebHostBuilder(args).Build().Run(); - } - - public static IWebHostBuilder CreateWebHostBuilder(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup(); - } -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/Properties/PublishProfiles/Default.pubxml b/KenticoInspector.WebApplication/Properties/PublishProfiles/Default.pubxml deleted file mode 100644 index 8378e348..00000000 --- a/KenticoInspector.WebApplication/Properties/PublishProfiles/Default.pubxml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - FileSystem - FileSystem - Release - Any CPU - - True - False - netcoreapp2.2 - win-x64 - 0c9fb1d4-87f2-48a0-81cd-45d5d2ef6c05 - true - <_IsPortable>false - ..\publish - True - - \ No newline at end of file diff --git a/KenticoInspector.WebApplication/Startup.cs b/KenticoInspector.WebApplication/Startup.cs deleted file mode 100644 index d1c121a3..00000000 --- a/KenticoInspector.WebApplication/Startup.cs +++ /dev/null @@ -1,80 +0,0 @@ -using Autofac; -using Autofac.Extensions.DependencyInjection; - -using KenticoInspector.Core; -using KenticoInspector.Infrastructure; -using KenticoInspector.Reports; - -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -using System; - -namespace KenticoInspector.WebApplication -{ - public class Startup - { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - public IServiceProvider ConfigureServices(IServiceCollection services) - { - services.AddMvc(options => options.EnableEndpointRouting = false) - .AddNewtonsoftJson(options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore); - - services.AddSpaStaticFiles(configuration => - { - configuration.RootPath = "ClientApp/dist"; - }); - - return ConfigureAutofac(services); - } - - private AutofacServiceProvider ConfigureAutofac(IServiceCollection services) - { - var containerBuilder = new ContainerBuilder(); - - containerBuilder.Populate(services); - - containerBuilder.RegisterModule(new CoreModule()); - containerBuilder.RegisterModule(new InfrastructureModule()); - containerBuilder.RegisterModule(new ReportsModule()); - containerBuilder.RegisterModule(new ActionsModule()); - - var container = containerBuilder.Build(); - return new AutofacServiceProvider(container); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseHsts(); - } - - app.UseStaticFiles(); - app.UseSpaStaticFiles(); - app.UseMvc(); - app.UseSpa(spa => - { - spa.Options.SourcePath = "ClientApp/dist"; - - if (env.IsDevelopment() && !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ASPNETCORE_USE_EXTERNAL_CLIENT"))) - { - spa.UseProxyToSpaDevelopmentServer("http://localhost:8080"); - } - }); - } - } -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/appsettings.Development.json b/KenticoInspector.WebApplication/appsettings.Development.json deleted file mode 100644 index f999bc20..00000000 --- a/KenticoInspector.WebApplication/appsettings.Development.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" - } - } -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/appsettings.json b/KenticoInspector.WebApplication/appsettings.json deleted file mode 100644 index ba5b9074..00000000 --- a/KenticoInspector.WebApplication/appsettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Warning" - } - }, - "AllowedHosts": "*" -} \ No newline at end of file diff --git a/KenticoInspector.WebApplication/editorconfig.txt b/KenticoInspector.WebApplication/editorconfig.txt deleted file mode 100644 index 09c62a85..00000000 --- a/KenticoInspector.WebApplication/editorconfig.txt +++ /dev/null @@ -1,1245 +0,0 @@ -root = true - -[*.cs] - -# ===== Active SonarLint rules ===== - -# [Category: Bug] -# S2757: "=+" should not be used instead of "+=" -dotnet_diagnostic.S2757.severity = warning - -# S3168: "async" methods should not return "void" -dotnet_diagnostic.S3168.severity = warning - -# S3397: "base.Equals" should not be used to check for reference equality in "Equals" if "base" is not "object" -dotnet_diagnostic.S3397.severity = warning - -# S1206: "Equals(Object)" and "GetHashCode()" should be overridden in pairs -dotnet_diagnostic.S1206.severity = warning - -# S2328: "GetHashCode" should not reference mutable fields -dotnet_diagnostic.S2328.severity = warning - -# S2997: "IDisposables" created in a "using" statement should not be returned -dotnet_diagnostic.S2997.severity = warning - -# S2930: "IDisposables" should be disposed -dotnet_diagnostic.S2930.severity = warning - -# S2688: "NaN" should not be used in comparisons -dotnet_diagnostic.S2688.severity = warning - -# S2995: "Object.ReferenceEquals" should not be used for value types -dotnet_diagnostic.S2995.severity = warning - -# S3869: "SafeHandle.DangerousGetHandle" should not be called -dotnet_diagnostic.S3869.severity = warning - -# S3456: "string.ToCharArray()" should not be called redundantly -dotnet_diagnostic.S3456.severity = warning - -# S2996: "ThreadStatic" fields should not be initialized -dotnet_diagnostic.S2996.severity = warning - -# S3005: "ThreadStatic" should not be used on non-static fields -dotnet_diagnostic.S3005.severity = warning - -# S2225: "ToString()" method should not return null -dotnet_diagnostic.S2225.severity = warning - -# S2251: A "for" loop update clause should move the counter in the right direction -dotnet_diagnostic.S2251.severity = warning - -# S3923: All branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S3923.severity = warning - -# S3244: Anonymous delegates should not be used to unsubscribe from Events -dotnet_diagnostic.S3244.severity = warning - -# S3343: Caller information parameters should come at the end of the parameter list -dotnet_diagnostic.S3343.severity = warning - -# S4583: Calls to delegate's method "BeginInvoke" should be paired with calls to "EndInvoke" -dotnet_diagnostic.S4583.severity = warning - -# S3249: Classes directly extending "object" should not call "base" in "GetHashCode" or "Equals" -dotnet_diagnostic.S3249.severity = warning - -# S3453: Classes should not have only "private" constructors -dotnet_diagnostic.S3453.severity = warning - -# S4143: Collection elements should not be replaced unconditionally -dotnet_diagnostic.S4143.severity = warning - -# S3981: Collection sizes and array length comparisons should make sense -dotnet_diagnostic.S3981.severity = warning - -# S2114: Collections should not be passed as arguments to their own methods -dotnet_diagnostic.S2114.severity = warning - -# S2275: Composite format strings should not lead to unexpected behavior at runtime -dotnet_diagnostic.S2275.severity = warning - -# S2583: Conditionally executed code should be reachable -dotnet_diagnostic.S2583.severity = warning - -# S3172: Delegates should not be subtracted -dotnet_diagnostic.S3172.severity = warning - -# S3926: Deserialization methods should be provided for "OptionalField" members -dotnet_diagnostic.S3926.severity = warning - -# S1048: Destructors should not throw exceptions -dotnet_diagnostic.S1048.severity = warning - -# S2761: Doubled prefix operators "!!" and "~~" should not be used -dotnet_diagnostic.S2761.severity = warning - -# S4158: Empty collections should not be accessed or iterated -dotnet_diagnostic.S4158.severity = warning - -# S3655: Empty nullable value should not be accessed -dotnet_diagnostic.S3655.severity = warning - -# S3984: Exceptions should not be created without being thrown -dotnet_diagnostic.S3984.severity = warning - -# S3346: Expressions used in "Debug.Assert" should not produce side effects -dotnet_diagnostic.S3346.severity = warning - -# S2345: Flags enumerations should explicitly initialize all their members -dotnet_diagnostic.S2345.severity = warning - -# S2252: For-loop conditions should be true at least once -dotnet_diagnostic.S2252.severity = warning - -# S4275: Getters and setters should access the expected fields -dotnet_diagnostic.S4275.severity = warning - -# S1764: Identical expressions should not be used on both sides of a binary operator -dotnet_diagnostic.S1764.severity = warning - -# S2183: Integral numbers should not be shifted by zero or more than their number of bits-1 -dotnet_diagnostic.S2183.severity = warning - -# S1751: Loops with at most one iteration should be refactored -dotnet_diagnostic.S1751.severity = warning - -# S3603: Methods with "Pure" attribute should return a value -dotnet_diagnostic.S3603.severity = warning - -# S3887: Mutable, non-private fields should not be "readonly" -dotnet_diagnostic.S3887.severity = warning - -# S3889: Neither "Thread.Resume" nor "Thread.Suspend" should be used -dotnet_diagnostic.S3889.severity = warning - -# S4586: Non-async "Task/Task" methods should not return null -dotnet_diagnostic.S4586.severity = warning - -# S2259: Null pointers should not be dereferenced -dotnet_diagnostic.S2259.severity = warning - -# S3610: Nullable type comparison should not be redundant -dotnet_diagnostic.S3610.severity = warning - -# S1848: Objects should not be created to be dropped immediately without being used -dotnet_diagnostic.S1848.severity = warning - -# S3598: One-way "OperationContract" methods should have "void" return type -dotnet_diagnostic.S3598.severity = warning - -# S3466: Optional parameters should be passed to "base" calls -dotnet_diagnostic.S3466.severity = warning - -# S2934: Property assignments should not be made for "readonly" fields not constrained to reference types -dotnet_diagnostic.S2934.severity = warning - -# S2190: Recursion should not be infinite -dotnet_diagnostic.S2190.severity = warning - -# S1862: Related "if/else if" statements should not have the same condition -dotnet_diagnostic.S1862.severity = warning - -# S2184: Results of integer division should not be assigned to floating point variables -dotnet_diagnostic.S2184.severity = warning - -# S2201: Return values from functions without side effects should not be ignored -dotnet_diagnostic.S2201.severity = warning - -# S3449: Right operands of shift operators should be integers -dotnet_diagnostic.S3449.severity = warning - -# S3927: Serialization event handlers should be implemented correctly -dotnet_diagnostic.S3927.severity = warning - -# S2551: Shared resources should not be used for locking -dotnet_diagnostic.S2551.severity = warning - -# S2857: SQL keywords should be delimited by whitespace -dotnet_diagnostic.S2857.severity = warning - -# S3263: Static fields should appear in the order they must be initialized -dotnet_diagnostic.S3263.severity = warning - -# S3464: Type inheritance should not be recursive -dotnet_diagnostic.S3464.severity = warning - -# S3903: Types should be defined in named namespaces -dotnet_diagnostic.S3903.severity = warning - -# S2123: Values should not be uselessly incremented -dotnet_diagnostic.S2123.severity = warning - -# S1656: Variables should not be self-assigned -dotnet_diagnostic.S1656.severity = warning - -# S2306: "async" and "await" should not be used as identifiers -dotnet_diagnostic.S2306.severity = warning - - -# [Category: Security] -# S3884: "CoSetProxyBlanket" and "CoInitializeSecurity" should not be used -dotnet_diagnostic.S3884.severity = warning - -# S2115: A secure password should be used when connecting to a database -dotnet_diagnostic.S2115.severity = warning - -# S5547: Cipher algorithms should be robust -dotnet_diagnostic.S5547.severity = warning - -# S3329: Cipher Block Chaining IVs should be unpredictable -dotnet_diagnostic.S3329.severity = warning - -# S5542: Encryption algorithms should be used with secure mode and padding scheme -dotnet_diagnostic.S5542.severity = warning - -# S5445: Insecure temporary file creation methods should not be used -dotnet_diagnostic.S5445.severity = warning - -# S5659: JWT should be signed and verified with strong cipher algorithms -dotnet_diagnostic.S5659.severity = warning - -# S4433: LDAP connections should be authenticated -dotnet_diagnostic.S4433.severity = warning - -# S4211: Members should not have conflicting transparency annotations -dotnet_diagnostic.S4211.severity = warning - -# S4423: Weak SSL/TLS protocols should not be used -dotnet_diagnostic.S4423.severity = warning - -# S2755: XML parsers should not be vulnerable to XXE attacks -dotnet_diagnostic.S2755.severity = warning - -# S2053: Hashes should include an unpredictable salt -dotnet_diagnostic.S2053.severity = warning - -# S4830: Server certificates should be verified during SSL/TLS connections -dotnet_diagnostic.S4830.severity = warning - -# S4426: Cryptographic keys should be robust -dotnet_diagnostic.S4426.severity = warning - -# S5773: Types allowed to be deserialized should be restricted -dotnet_diagnostic.S5773.severity = warning - - -# [Category: Security Hotspot] -# S5693: Allowing requests with excessive content length is security-sensitive -dotnet_diagnostic.S5693.severity = warning - -# S4792: Configuring loggers is security-sensitive -dotnet_diagnostic.S4792.severity = warning - -# S3330: Creating cookies without the "HttpOnly" flag is security-sensitive -dotnet_diagnostic.S3330.severity = warning - -# S2092: Creating cookies without the "secure" flag is security-sensitive -dotnet_diagnostic.S2092.severity = warning - -# S4507: Delivering code in production with debug features activated is security-sensitive -dotnet_diagnostic.S4507.severity = warning - -# S5766: Deserializing objects without performing data validation is security-sensitive -dotnet_diagnostic.S5766.severity = warning - -# S5753: Disabling ASP.NET "Request Validation" feature is security-sensitive -dotnet_diagnostic.S5753.severity = warning - -# S4502: Disabling CSRF protections is security-sensitive -dotnet_diagnostic.S4502.severity = warning - -# S5042: Expanding archive files without controlling resource consumption is security-sensitive -dotnet_diagnostic.S5042.severity = warning - -# S2077: Formatting SQL queries is security-sensitive -dotnet_diagnostic.S2077.severity = warning - -# S2068: Hard-coded credentials are security-sensitive -dotnet_diagnostic.S2068.severity = warning - -# S5122: Having a permissive Cross-Origin Resource Sharing policy is security-sensitive -dotnet_diagnostic.S5122.severity = warning - -# S4036: Searching OS commands in PATH is security-sensitive -dotnet_diagnostic.S4036.severity = warning - -# S2612: Setting loose file permissions is security-sensitive -dotnet_diagnostic.S2612.severity = warning - -# S5332: Using clear-text protocols is security-sensitive -dotnet_diagnostic.S5332.severity = warning - -# S1313: Using hardcoded IP addresses is security-sensitive -dotnet_diagnostic.S1313.severity = warning - -# S2257: Using non-standard cryptographic algorithms is security-sensitive -dotnet_diagnostic.S2257.severity = warning - -# S2245: Using pseudorandom number generators (PRNGs) is security-sensitive -dotnet_diagnostic.S2245.severity = warning - -# S5443: Using publicly writable directories is security-sensitive -dotnet_diagnostic.S5443.severity = warning - -# S4790: Using weak hashing algorithms is security-sensitive -dotnet_diagnostic.S4790.severity = warning - - -# [Category: Code Smell] -# S3451: "[DefaultValue]" should not be used when "[DefaultParameterValue]" is meant -dotnet_diagnostic.S3451.severity = warning - -# S3447: "[Optional]" should not be used on "ref" or "out" parameters -dotnet_diagnostic.S3447.severity = warning - -# S1155: "Any()" should be used to test for emptiness -dotnet_diagnostic.S1155.severity = warning - -# S2737: "catch" clauses should do more than rethrow -dotnet_diagnostic.S2737.severity = warning - -# S4524: "default" clauses should be first or last -dotnet_diagnostic.S4524.severity = warning - -# S3217: "Explicit" conversions of "foreach" loops should not be used -dotnet_diagnostic.S3217.severity = warning - -# S3971: "GC.SuppressFinalize" should not be called -dotnet_diagnostic.S3971.severity = warning - -# S907: "goto" statement should not be used -dotnet_diagnostic.S907.severity = warning - -# S2692: "IndexOf" checks should not be for positive numbers -dotnet_diagnostic.S2692.severity = warning - -# S3060: "is" should not be used with "this" -dotnet_diagnostic.S3060.severity = warning - -# S1123: "Obsolete" attributes should include explanations -dotnet_diagnostic.S1123.severity = warning - -# S4214: "P/Invoke" methods should not be visible -dotnet_diagnostic.S4214.severity = warning - -# S4061: "params" should be used instead of "varargs" -dotnet_diagnostic.S4061.severity = warning - -# S3262: "params" should be used on overrides -dotnet_diagnostic.S3262.severity = warning - -# S3600: "params" should not be introduced on overrides -dotnet_diagnostic.S3600.severity = warning - -# S3597: "ServiceContract" and "OperationContract" attributes should be used together -dotnet_diagnostic.S3597.severity = warning - -# S3963: "static" fields should be initialized inline -dotnet_diagnostic.S3963.severity = warning - -# S3256: "string.IsNullOrEmpty" should be used -dotnet_diagnostic.S3256.severity = warning - -# S1479: "switch" statements should not have too many "case" clauses -dotnet_diagnostic.S1479.severity = warning - -# S5034: "ValueTask" should be consumed correctly -dotnet_diagnostic.S5034.severity = warning - -# S1264: A "while" loop should be used instead of a "for" loop -dotnet_diagnostic.S1264.severity = warning - -# S3973: A conditionally executed single line should be denoted by indentation -dotnet_diagnostic.S3973.severity = warning - -# S3904: Assemblies should have version information -dotnet_diagnostic.S3904.severity = warning - -# S3415: Assertion arguments should be passed in the correct order -dotnet_diagnostic.S3415.severity = warning - -# S4019: Base class methods should not be hidden -dotnet_diagnostic.S4019.severity = warning - -# S1940: Boolean checks should not be inverted -dotnet_diagnostic.S1940.severity = warning - -# S3236: Caller information arguments should not be provided explicitly -dotnet_diagnostic.S3236.severity = warning - -# S3897: Classes that provide "Equals()" should implement "IEquatable" -dotnet_diagnostic.S3897.severity = warning - -# S3457: Composite format strings should be used correctly -dotnet_diagnostic.S3457.severity = warning - -# S3972: Conditionals should start on new lines -dotnet_diagnostic.S3972.severity = warning - -# S1116: Empty statements should be removed -dotnet_diagnostic.S1116.severity = warning - -# S3264: Events should be invoked -dotnet_diagnostic.S3264.severity = warning - -# S3445: Exceptions should not be explicitly rethrown -dotnet_diagnostic.S3445.severity = warning - -# S1163: Exceptions should not be thrown in finally blocks -dotnet_diagnostic.S1163.severity = warning - -# S2290: Field-like events should not be virtual -dotnet_diagnostic.S2290.severity = warning - -# S2346: Flags enumerations zero-value members should be named "warning" -dotnet_diagnostic.S2346.severity = warning - -# S3251: Implementations should be provided for "partial" methods -dotnet_diagnostic.S3251.severity = warning - -# S1944: Inappropriate casts should not be made -dotnet_diagnostic.S1944.severity = warning - -# S4015: Inherited member visibility should not be decreased -dotnet_diagnostic.S4015.severity = warning - -# S3444: Interfaces should not simply inherit from base interfaces with colliding members -dotnet_diagnostic.S3444.severity = warning - -# S818: Literal suffixes should be upper case -dotnet_diagnostic.S818.severity = warning - -# S3400: Methods should not return constants -dotnet_diagnostic.S3400.severity = warning - -# S2681: Multiline blocks should be enclosed in curly braces -dotnet_diagnostic.S2681.severity = warning - -# S3169: Multiple "OrderBy" calls should not be used -dotnet_diagnostic.S3169.severity = warning - -# S3261: Namespaces should not be empty -dotnet_diagnostic.S3261.severity = warning - -# S4200: Native methods should be wrapped -dotnet_diagnostic.S4200.severity = warning - -# S1199: Nested code blocks should not be used -dotnet_diagnostic.S1199.severity = warning - -# S4070: Non-flags enums should not be marked with "FlagsAttribute" -dotnet_diagnostic.S4070.severity = warning - -# S3265: Non-flags enums should not be used in bitwise operations -dotnet_diagnostic.S3265.severity = warning - -# S4201: Null checks should not be used with "is" -dotnet_diagnostic.S4201.severity = warning - -# S3966: Objects should not be disposed more than once -dotnet_diagnostic.S3966.severity = warning - -# S2291: Overflow checking should not be disabled for "Enumerable.Sum" -dotnet_diagnostic.S2291.severity = warning - -# S1185: Overriding members should do more than simply call the same member in the base class -dotnet_diagnostic.S1185.severity = warning - -# S2234: Parameters should be passed in the correct order -dotnet_diagnostic.S2234.severity = warning - -# S3450: Parameters with "[DefaultParameterValue]" attributes should also be marked "[Optional]" -dotnet_diagnostic.S3450.severity = warning - -# S1905: Redundant casts should not be used -dotnet_diagnostic.S1905.severity = warning - -# S1110: Redundant pairs of parentheses should be removed -dotnet_diagnostic.S1110.severity = warning - -# S2437: Silly bit operations should not be performed -dotnet_diagnostic.S2437.severity = warning - -# S3010: Static fields should not be updated in constructors -dotnet_diagnostic.S3010.severity = warning - -# S4635: String offset-based methods should be preferred for finding substrings from offsets -dotnet_diagnostic.S4635.severity = warning - -# S3998: Threads should not lock on objects with weak identity -dotnet_diagnostic.S3998.severity = warning - -# S1134: Track uses of "FIXME" tags -dotnet_diagnostic.S1134.severity = warning - -# S1135: Track uses of "TODO" tags -dotnet_diagnostic.S1135.severity = warning - -# S1871: Two branches in a conditional structure should not have exactly the same implementation -dotnet_diagnostic.S1871.severity = warning - -# S3443: Type should not be examined on "System.Type" instances -dotnet_diagnostic.S3443.severity = warning - -# S3459: Unassigned members should be removed -dotnet_diagnostic.S3459.severity = warning - -# S3440: Variables should not be checked against the values they're about to be assigned -dotnet_diagnostic.S3440.severity = warning - -# S2479: Whitespace and control characters in string literals should be explicit -dotnet_diagnostic.S2479.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S3442: "abstract" classes should not have "public" constructors -dotnet_diagnostic.S3442.severity = warning - -# S3885: "Assembly.Load" should be used -dotnet_diagnostic.S3885.severity = warning - -# S1210: "Equals" and the comparison operators should be overridden when implementing "IComparable" -dotnet_diagnostic.S1210.severity = warning - -# S1215: "GC.Collect" should not be called -dotnet_diagnostic.S1215.severity = warning - -# S3881: "IDisposable" should be implemented correctly -dotnet_diagnostic.S3881.severity = warning - -# S2971: "IEnumerable" LINQs should be simplified -dotnet_diagnostic.S2971.severity = warning - -# S3925: "ISerializable" should be implemented correctly -dotnet_diagnostic.S3925.severity = warning - -# S4581: "new Guid()" should not be used -dotnet_diagnostic.S4581.severity = warning - -# S3875: "operator==" should not be overloaded on reference types -dotnet_diagnostic.S3875.severity = warning - -# S3237: "value" parameters should be used -dotnet_diagnostic.S3237.severity = warning - -# S1121: Assignments should not be made from within sub-expressions -dotnet_diagnostic.S1121.severity = warning - -# S3376: Attribute, EventArgs, and Exception type names should end with the type being extended -dotnet_diagnostic.S3376.severity = warning - -# S2589: Boolean expressions should not be gratuitous -dotnet_diagnostic.S2589.severity = warning - -# S4035: Classes implementing "IEquatable" should be sealed -dotnet_diagnostic.S4035.severity = warning - -# S3776: Cognitive Complexity of methods should not be too high -dotnet_diagnostic.S3776.severity = warning - -# S1066: Collapsible "if" statements should be merged -dotnet_diagnostic.S1066.severity = warning - -# S1699: Constructors should only call non-overridable methods -dotnet_diagnostic.S1699.severity = warning - -# S2372: Exceptions should not be thrown from property getters -dotnet_diagnostic.S2372.severity = warning - -# S3877: Exceptions should not be thrown from unexpected methods -dotnet_diagnostic.S3877.severity = warning - -# S1104: Fields should not have public accessibility -dotnet_diagnostic.S1104.severity = warning - -# S2933: Fields that are only assigned in the constructor should be "readonly" -dotnet_diagnostic.S2933.severity = warning - -# S112: General exceptions should never be thrown -dotnet_diagnostic.S112.severity = warning - -# S2486: Generic exceptions should not be ignored -dotnet_diagnostic.S2486.severity = warning - -# S3246: Generic type parameters should be co/contravariant when possible -dotnet_diagnostic.S3246.severity = warning - -# S1939: Inheritance list should not be redundant -dotnet_diagnostic.S1939.severity = warning - -# S110: Inheritance tree of classes should not be too deep -dotnet_diagnostic.S110.severity = warning - -# S3218: Inner class members should not shadow outer class "static" or type members -dotnet_diagnostic.S3218.severity = warning - -# S2696: Instance members should not write to "static" fields -dotnet_diagnostic.S2696.severity = warning - -# S3626: Jump statements should not be redundant -dotnet_diagnostic.S3626.severity = warning - -# S1117: Local variables should not shadow class fields -dotnet_diagnostic.S1117.severity = warning - -# S3267: Loops should be simplified with "LINQ" expressions -dotnet_diagnostic.S3267.severity = warning - -# S3604: Member initializer values should not be redundant -dotnet_diagnostic.S3604.severity = warning - -# S3220: Method calls should not resolve ambiguously to overloads with "params" -dotnet_diagnostic.S3220.severity = warning - -# S4136: Method overloads should be grouped together -dotnet_diagnostic.S4136.severity = warning - -# S3427: Method overloads with default parameter values should not overlap -dotnet_diagnostic.S3427.severity = warning - -# S1006: Method overrides should not change parameter defaults -dotnet_diagnostic.S1006.severity = warning - -# S2953: Methods named "Dispose" should implement "IDisposable.Dispose" -dotnet_diagnostic.S2953.severity = warning - -# S1186: Methods should not be empty -dotnet_diagnostic.S1186.severity = warning - -# S4144: Methods should not have identical implementations -dotnet_diagnostic.S4144.severity = warning - -# S107: Methods should not have too many parameters -dotnet_diagnostic.S107.severity = warning - -# S3241: Methods should not return values that are never used -dotnet_diagnostic.S3241.severity = warning - -# S2386: Mutable fields should not be "public static" -dotnet_diagnostic.S2386.severity = warning - -# S108: Nested blocks of code should not be left empty -dotnet_diagnostic.S108.severity = warning - -# S2223: Non-constant static fields should not be visible -dotnet_diagnostic.S2223.severity = warning - -# S3260: Non-derived "private" classes and records should be "sealed" -dotnet_diagnostic.S3260.severity = warning - -# S927: Parameter names should match base declaration and other partial definitions -dotnet_diagnostic.S927.severity = warning - -# S3928: Parameter names used into ArgumentException constructors should match an existing one -dotnet_diagnostic.S3928.severity = warning - -# S4457: Parameter validation in "async"/"await" methods should be wrapped -dotnet_diagnostic.S4457.severity = warning - -# S4456: Parameter validation in yielding methods should be wrapped -dotnet_diagnostic.S4456.severity = warning - -# S1450: Private fields only used as local variables in methods should become local variables -dotnet_diagnostic.S1450.severity = warning - -# S2365: Properties should not make collection or array copies -dotnet_diagnostic.S2365.severity = warning - -# S2368: Public methods should not have multidimensional array parameters -dotnet_diagnostic.S2368.severity = warning - -# S3011: Reflection should not be used to increase accessibility of classes, methods, or fields -dotnet_diagnostic.S3011.severity = warning - -# S2219: Runtime type checking should be simplified -dotnet_diagnostic.S2219.severity = warning - -# S125: Sections of code should not be commented out -dotnet_diagnostic.S125.severity = warning - -# S2178: Short-circuit logic should be used in boolean contexts -dotnet_diagnostic.S2178.severity = warning - -# S2743: Static fields should not be used in generic types -dotnet_diagnostic.S2743.severity = warning - -# S1643: Strings should not be concatenated using '+' in a loop -dotnet_diagnostic.S1643.severity = warning - -# S3358: Ternary operators should not be nested -dotnet_diagnostic.S3358.severity = warning - -# S3433: Test method signatures should be correct -dotnet_diagnostic.S3433.severity = warning - -# S2187: TestCases should contain tests -dotnet_diagnostic.S2187.severity = warning - -# S2699: Tests should include assertions -dotnet_diagnostic.S2699.severity = warning - -# S1607: Tests should not be ignored -dotnet_diagnostic.S1607.severity = warning - -# S2292: Trivial properties should be auto-implemented -dotnet_diagnostic.S2292.severity = warning - -# S2436: Types and methods should not have too many generic parameters -dotnet_diagnostic.S2436.severity = warning - -# S101: Types should be named in PascalCase -dotnet_diagnostic.S101.severity = warning - -# S4487: Unread "private" fields should be removed -dotnet_diagnostic.S4487.severity = warning - -# S1854: Unused assignments should be removed -dotnet_diagnostic.S1854.severity = warning - -# S1481: Unused local variables should be removed -dotnet_diagnostic.S1481.severity = warning - -# S1172: Unused method parameters should be removed -dotnet_diagnostic.S1172.severity = warning - -# S1144: Unused private types or members should be removed -dotnet_diagnostic.S1144.severity = warning - -# S2326: Unused type parameters should be removed -dotnet_diagnostic.S2326.severity = warning - -# S1075: URIs should not be hardcoded -dotnet_diagnostic.S1075.severity = warning - -# S1118: Utility classes should not have public constructors -dotnet_diagnostic.S1118.severity = warning - -# S2376: Write-only properties should not be used -dotnet_diagnostic.S2376.severity = warning - -# S1125: Boolean literals should not be redundant -dotnet_diagnostic.S1125.severity = warning - - -# ===== Inactive SonarLint rules (must be explicitly turned off) ===== - -# [Category: Bug] (All these are excluded because they're not applicable to our solution) -# S4428: "PartCreationPolicyAttribute" should be used with "ExportAttribute" -dotnet_diagnostic.S4428.severity = none - -# S4260: "ConstructorArgument" parameters should exist in constructors -dotnet_diagnostic.S4260.severity = none - -# S4277: "Shared" parts should not be created with "new" -dotnet_diagnostic.S4277.severity = none - -# S4159: Classes should implement their "ExportAttribute" interfaces -dotnet_diagnostic.S4159.severity = none - -# S4210: Windows Forms entry points should be marked with STAThread -dotnet_diagnostic.S4210.severity = none - - -# [Uncategorized] -# S6287: HTTP responses should not be vulnerable to session fixation -dotnet_diagnostic.S6287.severity = none - -# S6096: Extracting archives should not lead to zip slip vulnerabilities -dotnet_diagnostic.S6096.severity = none - -# S5334: Dynamic code execution should not be vulnerable to injection attacks -dotnet_diagnostic.S5334.severity = none - -# S5146: HTTP request redirections should not be open to forging attacks -dotnet_diagnostic.S5146.severity = none - -# S5135: Deserialization should not be vulnerable to injection attacks -dotnet_diagnostic.S5135.severity = none - -# S5131: Endpoints should not be vulnerable to reflected cross-site scripting (XSS) attacks -dotnet_diagnostic.S5131.severity = none - -# S3649: Database queries should not be vulnerable to injection attacks -dotnet_diagnostic.S3649.severity = none - -# S2091: XPath expressions should not be vulnerable to injection attacks -dotnet_diagnostic.S2091.severity = none - -# S2083: I/O function calls should not be vulnerable to path injection attacks -dotnet_diagnostic.S2083.severity = none - -# S2078: LDAP queries should not be vulnerable to injection attacks -dotnet_diagnostic.S2078.severity = none - -# S2076: OS commands should not be vulnerable to command injection attacks -dotnet_diagnostic.S2076.severity = none - -# S6424: Azure Functions: Restrictions on entity interfaces -dotnet_diagnostic.S6424.severity = none - -# S6422: Calls to "async" methods should not be blocking in Azure Functions -dotnet_diagnostic.S6422.severity = none - -# S2631: Regular expressions should not be vulnerable to Denial of Service attacks -dotnet_diagnostic.S2631.severity = none - -# S2222: Locks should be released -dotnet_diagnostic.S2222.severity = none - -# S5144: Server-side requests should not be vulnerable to forging attacks -dotnet_diagnostic.S5144.severity = none - -# S6350: Constructing arguments of system commands from user input is security-sensitive -dotnet_diagnostic.S6350.severity = none - -# S6420: Reuse client instances rather than creating new ones with each Azure Function invocation -dotnet_diagnostic.S6420.severity = none - -# S6419: Azure Functions should be stateless -dotnet_diagnostic.S6419.severity = none - -# S5883: OS commands should not be vulnerable to argument injection attacks -dotnet_diagnostic.S5883.severity = none - -# S5145: Logging should not be vulnerable to injection attacks -dotnet_diagnostic.S5145.severity = none - -# S2931: Classes with "IDisposable" members should implement "IDisposable" -dotnet_diagnostic.S2931.severity = none - -# S4462: Calls to "async" methods should not be blocking -dotnet_diagnostic.S4462.severity = none - -# S2387: Child class fields should not shadow parent class fields -dotnet_diagnostic.S2387.severity = none - -# S1451: Track lack of copyright and license headers -dotnet_diagnostic.S1451.severity = none - -# S1147: Exit methods should not be called -dotnet_diagnostic.S1147.severity = none - -# S2952: Classes should "Dispose" of members from the classes' own "Dispose" methods -dotnet_diagnostic.S2952.severity = none - -# S4829: Reading the Standard Input is security-sensitive -dotnet_diagnostic.S4829.severity = none - -# S4823: Using command line arguments is security-sensitive -dotnet_diagnostic.S4823.severity = none - -# S4818: Using Sockets is security-sensitive -dotnet_diagnostic.S4818.severity = none - -# S4787: Encrypting data is security-sensitive -dotnet_diagnostic.S4787.severity = none - -# S4784: Using regular expressions is security-sensitive -dotnet_diagnostic.S4784.severity = none - -# S4039: Interface methods should be callable by derived types -dotnet_diagnostic.S4039.severity = none - -# S4025: Child class fields should not differ from parent class fields only by capitalization -dotnet_diagnostic.S4025.severity = none - -# S4000: Pointers to unmanaged memory should not be visible -dotnet_diagnostic.S4000.severity = none - -# S3937: Number patterns should be regular -dotnet_diagnostic.S3937.severity = none - -# S3874: "out" and "ref" parameters should not be used -dotnet_diagnostic.S3874.severity = none - -# S3353: Unchanged local variables should be "const" -dotnet_diagnostic.S3353.severity = none - -# S3216: "ConfigureAwait(false)" should be used -dotnet_diagnostic.S3216.severity = none - -# S3215: "interface" instances should not be cast to concrete types -dotnet_diagnostic.S3215.severity = none - -# S2701: Literal boolean values should not be used in assertions -dotnet_diagnostic.S2701.severity = none - -# S2360: Optional parameters should not be used -dotnet_diagnostic.S2360.severity = none - -# S2339: Public constant members should not be used -dotnet_diagnostic.S2339.severity = none - -# S2330: Array covariance should not be used -dotnet_diagnostic.S2330.severity = none - -# S2302: "nameof" should be used -dotnet_diagnostic.S2302.severity = none - -# S2197: Modulus results should not be checked for direct equality -dotnet_diagnostic.S2197.severity = none - -# S1994: "for" loop increment clauses should modify the loops' counters -dotnet_diagnostic.S1994.severity = none - -# S1821: "switch" statements should not be nested -dotnet_diagnostic.S1821.severity = none - -# S1541: Methods and properties should not be too complex -dotnet_diagnostic.S1541.severity = none - -# S134: Control flow statements "if", "switch", "for", "foreach", "while", "do" and "try" should not be nested too deeply -dotnet_diagnostic.S134.severity = none - -# S131: "switch/Select" statements should contain a "default/Case Else" clauses -dotnet_diagnostic.S131.severity = none - -# S126: "if ... else if" constructs should end with "else" clauses -dotnet_diagnostic.S126.severity = none - -# S121: Control structures should use curly braces -dotnet_diagnostic.S121.severity = none - -# S1067: Expressions should not be too complex -dotnet_diagnostic.S1067.severity = none - -# S4564: ASP.NET HTTP request validation feature should not be disabled -dotnet_diagnostic.S4564.severity = none - -# S4212: Serialization constructors should be secured -dotnet_diagnostic.S4212.severity = none - -# S3949: Calculations should not overflow -dotnet_diagnostic.S3949.severity = none - -# S1244: Floating point numbers should not be tested for equality -dotnet_diagnostic.S1244.severity = none - -# S881: Increment (++) and decrement (--) operators should not be used in a method call or mixed with other operators in an expression -dotnet_diagnostic.S881.severity = none - -# S6423: Azure Functions should log all failures -dotnet_diagnostic.S6423.severity = none - -# S6421: Azure Functions should use Structured Error Handling -dotnet_diagnostic.S6421.severity = none - -# S6354: Use a testable date/time provider -dotnet_diagnostic.S6354.severity = none - -# S4059: Property names should not match get methods -dotnet_diagnostic.S4059.severity = none - -# S4057: Locales should be set for data types -dotnet_diagnostic.S4057.severity = none - -# S4055: Literals should not be passed as localized parameters -dotnet_diagnostic.S4055.severity = none - -# S4050: Operators should be overloaded consistently -dotnet_diagnostic.S4050.severity = none - -# S4017: Method signatures should not contain nested generic types -dotnet_diagnostic.S4017.severity = none - -# S4016: Enumeration members should not be named "Reserved" -dotnet_diagnostic.S4016.severity = none - -# S4005: "System.Uri" arguments should be used instead of strings -dotnet_diagnostic.S4005.severity = none - -# S4004: Collection properties should be readonly -dotnet_diagnostic.S4004.severity = none - -# S4002: Disposable types should declare finalizers -dotnet_diagnostic.S4002.severity = none - -# S3997: String URI overloads should call "System.Uri" overloads -dotnet_diagnostic.S3997.severity = none - -# S3996: URI properties should not be strings -dotnet_diagnostic.S3996.severity = none - -# S3995: URI return values should not be strings -dotnet_diagnostic.S3995.severity = none - -# S3994: URI Parameters should not be strings -dotnet_diagnostic.S3994.severity = none - -# S3993: Custom attributes should be marked with "System.AttributeUsageAttribute" -dotnet_diagnostic.S3993.severity = none - -# S3992: Assemblies should explicitly specify COM visibility -dotnet_diagnostic.S3992.severity = none - -# S3990: Assemblies should be marked as CLS compliant -dotnet_diagnostic.S3990.severity = none - -# S3956: "Generic.List" instances should not be part of public APIs -dotnet_diagnostic.S3956.severity = none - -# S3909: Collections should implement the generic interface -dotnet_diagnostic.S3909.severity = none - -# S3908: Generic event handlers should be used -dotnet_diagnostic.S3908.severity = none - -# S3906: Event Handlers should have the correct signature -dotnet_diagnostic.S3906.severity = none - -# S3902: "Assembly.GetExecutingAssembly" should not be called -dotnet_diagnostic.S3902.severity = none - -# S3900: Arguments of public methods should be validated against null -dotnet_diagnostic.S3900.severity = none - -# S3898: Value types should implement "IEquatable" -dotnet_diagnostic.S3898.severity = none - -# S3880: Finalizers should not be empty -dotnet_diagnostic.S3880.severity = none - -# S3431: "[ExpectedException]" should not be used -dotnet_diagnostic.S3431.severity = none - -# S3366: "this" should not be exposed from constructors -dotnet_diagnostic.S3366.severity = none - -# S3059: Types should not have members with visibility set higher than the type's visibility -dotnet_diagnostic.S3059.severity = none - -# S2357: Fields should be private -dotnet_diagnostic.S2357.severity = none - -# S2327: "try" statements with identical "catch" and/or "finally" blocks should be merged -dotnet_diagnostic.S2327.severity = none - -# S1696: NullReferenceException should not be caught -dotnet_diagnostic.S1696.severity = none - -# S138: Functions should not have too many lines of code -dotnet_diagnostic.S138.severity = none - -# S127: "for" loop stop conditions should be invariant -dotnet_diagnostic.S127.severity = none - -# S122: Statements should be on separate lines -dotnet_diagnostic.S122.severity = none - -# S1200: Classes should not be coupled to too many other classes (Single Responsibility Principle) -dotnet_diagnostic.S1200.severity = none - -# S1151: "switch case" clauses should not have too many lines of code -dotnet_diagnostic.S1151.severity = none - -# S109: Magic numbers should not be used -dotnet_diagnostic.S109.severity = none - -# S106: Standard outputs should not be used directly to log anything -dotnet_diagnostic.S106.severity = none - -# S104: Files should not have too many lines of code -dotnet_diagnostic.S104.severity = none - -# S103: Lines should not be too long -dotnet_diagnostic.S103.severity = none - -# S5167: HTTP response headers should not be vulnerable to injection attacks -dotnet_diagnostic.S5167.severity = none - -# S2228: Console logging should not be used -dotnet_diagnostic.S2228.severity = none - -# S2955: Generic parameters not constrained to reference types should not be compared to "null" -dotnet_diagnostic.S2955.severity = none - -# S2674: The length returned from a stream read should be checked -dotnet_diagnostic.S2674.severity = none - -# S1226: Method parameters, caught exceptions and foreach variables' initial values should not be ignored -dotnet_diagnostic.S1226.severity = none - -# S4834: Controlling permissions is security-sensitive -dotnet_diagnostic.S4834.severity = none - -# S2255: Writing cookies is security-sensitive -dotnet_diagnostic.S2255.severity = none - -# S4261: Methods should be named according to their synchronicities -dotnet_diagnostic.S4261.severity = none - -# S4226: Extensions should be in separate namespaces -dotnet_diagnostic.S4226.severity = none - -# S4225: Extension methods should not extend "object" -dotnet_diagnostic.S4225.severity = none - -# S4069: Operator overloads should have named alternatives -dotnet_diagnostic.S4069.severity = none - -# S4060: Non-abstract attributes should be sealed -dotnet_diagnostic.S4060.severity = none - -# S4058: Overloads with a "StringComparison" parameter should be used -dotnet_diagnostic.S4058.severity = none - -# S4056: Overloads with a "CultureInfo" or an "IFormatProvider" parameter should be used -dotnet_diagnostic.S4056.severity = none - -# S4052: Types should not extend outdated base types -dotnet_diagnostic.S4052.severity = none - -# S4049: Properties should be preferred -dotnet_diagnostic.S4049.severity = none - -# S4047: Generics should be used when appropriate -dotnet_diagnostic.S4047.severity = none - -# S4041: Type names should not match namespaces -dotnet_diagnostic.S4041.severity = none - -# S4040: Strings should be normalized to uppercase -dotnet_diagnostic.S4040.severity = none - -# S4027: Exceptions should provide standard constructors -dotnet_diagnostic.S4027.severity = none - -# S4026: Assemblies should be marked with "NeutralResourcesLanguageAttribute" -dotnet_diagnostic.S4026.severity = none - -# S4023: Interfaces should not be empty -dotnet_diagnostic.S4023.severity = none - -# S4022: Enumerations should have "Int32" storage -dotnet_diagnostic.S4022.severity = none - -# S4018: Generic methods should provide type parameters -dotnet_diagnostic.S4018.severity = none - -# S3967: Multidimensional arrays should not be used -dotnet_diagnostic.S3967.severity = none - -# S3962: "static readonly" constants should be "const" instead -dotnet_diagnostic.S3962.severity = none - -# S3876: Strings or integral types should be used for indexers -dotnet_diagnostic.S3876.severity = none - -# S3872: Parameter names should not duplicate the names of their methods -dotnet_diagnostic.S3872.severity = none - -# S3717: Track use of "NotImplementedException" -dotnet_diagnostic.S3717.severity = none - -# S3532: Empty "default" clauses should be removed -dotnet_diagnostic.S3532.severity = none - -# S3441: Redundant property names should be omitted in anonymous classes -dotnet_diagnostic.S3441.severity = none - -# S3257: Declarations and initializations should be as concise as possible -dotnet_diagnostic.S3257.severity = none - -# S3254: Default parameter values should not be passed as arguments -dotnet_diagnostic.S3254.severity = none - -# S3253: Constructor and destructor declarations should not be redundant -dotnet_diagnostic.S3253.severity = none - -# S3242: Method parameters should be declared with base types -dotnet_diagnostic.S3242.severity = none - -# S3240: The simplest possible condition syntax should be used -dotnet_diagnostic.S3240.severity = none - -# S3235: Redundant parentheses should not be used -dotnet_diagnostic.S3235.severity = none - -# S3234: "GC.SuppressFinalize" should not be invoked for types without destructors -dotnet_diagnostic.S3234.severity = none - -# S3052: Members should not be initialized to default values -dotnet_diagnostic.S3052.severity = none - -# S2760: Sequential tests should not check the same condition -dotnet_diagnostic.S2760.severity = none - -# S2333: Redundant modifiers should not be used -dotnet_diagnostic.S2333.severity = none - -# S2325: Methods and properties that don't access instance data should be static -dotnet_diagnostic.S2325.severity = none - -# S2221: "Exception" should not be caught when not required by called methods -dotnet_diagnostic.S2221.severity = none - -# S2156: "sealed" classes should not have "protected" members -dotnet_diagnostic.S2156.severity = none - -# S2148: Underscores should be used to make large numbers readable -dotnet_diagnostic.S2148.severity = none - -# S1858: "ToString()" calls should not be redundant -dotnet_diagnostic.S1858.severity = none - -# S1698: "=" should not be used when "Equals" is overridden -dotnet_diagnostic.S1698.severity = none - -# S1694: An abstract class should have both abstract and concrete methods -dotnet_diagnostic.S1694.severity = none - -# S1659: Multiple variables should not be declared on the same line -dotnet_diagnostic.S1659.severity = none - -# S1449: Culture should be specified for "string" operations -dotnet_diagnostic.S1449.severity = none - -# S1301: "switch" statements should have at least 3 "case" clauses -dotnet_diagnostic.S1301.severity = none - -# S1227: break statements should not be used except for switch cases -dotnet_diagnostic.S1227.severity = none - -# S1192: String literals should not be duplicated -dotnet_diagnostic.S1192.severity = none - -# S113: Files should contain an empty newline at the end -dotnet_diagnostic.S113.severity = none - -# S1128: Unused "using" should be removed -dotnet_diagnostic.S1128.severity = none - -# S1109: A close curly brace should be located at the beginning of a line -dotnet_diagnostic.S1109.severity = none - -# S105: Tabulation characters should not be used -dotnet_diagnostic.S105.severity = none - -# S100: Methods and properties should be named in PascalCase -dotnet_diagnostic.S100.severity = none - -# S1309: Track uses of in-source issue suppressions -dotnet_diagnostic.S1309.severity = none \ No newline at end of file diff --git a/README.md b/README.md index c7180d1b..17666f31 100644 --- a/README.md +++ b/README.md @@ -1,76 +1,37 @@ -# Kentico Inspector +# KInspector -[![Join the chat at https://kentico-community.slack.com](https://img.shields.io/badge/join-slack-E6186D.svg)](https://kentico-community.slack.com) -[![Build](https://github.com/kentico/kinspector/actions/workflows/dotnet.yml/badge.svg)](https://github.com/kentico/kinspector/actions/workflows/dotnet.yml) -[![first-timers-only](https://img.shields.io/badge/first--timers--only-friendly-blue.svg)](http://www.firsttimersonly.com/) -[![Github All Releases](https://img.shields.io/github/downloads/kentico/kinspector/total.svg)](https://github.com/Kentico/KInspector/releases) +![Kentico Labs](https://img.shields.io/badge/Kentico_Labs-grey?labelColor=orange&logo=data:image/svg+xml;base64,PHN2ZyBjbGFzcz0ic3ZnLWljb24iIHN0eWxlPSJ3aWR0aDogMWVtOyBoZWlnaHQ6IDFlbTt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2ZpbGw6IGN1cnJlbnRDb2xvcjtvdmVyZmxvdzogaGlkZGVuOyIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik05NTYuMjg4IDgwNC40OEw2NDAgMjc3LjQ0VjY0aDMyYzE3LjYgMCAzMi0xNC40IDMyLTMycy0xNC40LTMyLTMyLTMyaC0zMjBjLTE3LjYgMC0zMiAxNC40LTMyIDMyczE0LjQgMzIgMzIgMzJIMzg0djIxMy40NEw2Ny43MTIgODA0LjQ4Qy00LjczNiA5MjUuMTg0IDUxLjIgMTAyNCAxOTIgMTAyNGg2NDBjMTQwLjggMCAxOTYuNzM2LTk4Ljc1MiAxMjQuMjg4LTIxOS41MnpNMjQxLjAyNCA2NDBMNDQ4IDI5NS4wNFY2NGgxMjh2MjMxLjA0TDc4Mi45NzYgNjQwSDI0MS4wMjR6IiAgLz48L3N2Zz4=) +[![Build](https://github.com/kentico/kinspector/actions/workflows/dotnet.yaml/badge.svg)](https://github.com/kentico/kinspector/actions/workflows/dotnet.yaml) -Kentico Inspector (formerly KInspector) is an application for analyzing the health, performance and security of **[Kentico EMS](https://www.kentico.com/)** solutions. +![Reports](img/reports.png) -Kentico Inspector was initially developed as an internal application by the Kentico consulting team to help evaluation customer's web sites. We quickly realized that the broader community would benefit from this as well, so we made it open source. +## Description -The application is Kentico version agnostic and has no dependencies on version-specific DLLs. Most modules are designed to support version 10 and later, but some will work on older versions as well. +KInspector is an application for analyzing the health, performance and security of **[Kentico EMS](https://www.kentico.com/)** solutions. -## Running Kentico Inspector +The application is Kentico version agnostic and has no dependencies on version-specific DLLs. Most modules are designed to support Kentico 12 and 13, but some will work on older versions as well. -You can download the [latest release](https://github.com/Kentico/KInspector/releases/latest) and extract the contents to a local directory to use [console](#console-mode) or [IIS](#iis-mode) mode. +## Quick Start -> :round_pushpin: **Note:** -> -> The application needs permission to create/modify files in the directory it is run from to save instances to a file. +Download the [latest release](https://github.com/kentico/kinspector/releases/latest) and extract the contents to a local directory. Run `KenticoInspector.WebApplication.exe` and open your browser to either https://localhost:5001 or http://localhost:5000. -Or, you can clone this repository and follow [these instructions](#local-development) to run the application locally. +You can optionally register the application in IIS. This allows you to have the tool always available, for example, on a development server. Point your IIS directory to the folder where you extracted everything to and make sure the application pool's .NET CLR version is set to `No managed code`. Open the site in your browser. -### Console mode +## Full Instructions -Console mode is useful if you just want to quickly run the tool occasionally. To use console mode, run `KenticoInspector.WebApplication.exe` and open your browser to either https://localhost:5001 or http://localhost:5000. - -### IIS mode - -IIS mode allows you to have the tool always available, for example, on a development server. To use IIS mode, point your IIS directory to the folder you extracted everything to and make sure the application pool's .NET CLR version is set to `No managed code`. Open the site in your browser. +View the [Usage Guide](./docs/Usage-Guide.md) for more detailed instructions. ## Contributing -Want to improve the Kentico Inspector? Great! Read the [contributing guidelines](https://github.com/Kentico/KInspector/blob/master/CONTRIBUTING.md) and then [check out the open issues](https://github.com/Kentico/KInspector/issues) (especially issues marked as "[good first issue](https://github.com/Kentico/KInspector/labels/good%20first%20issue)") to get started. - -If anything feels wrong or incomplete, please let us know. Create a new [issue](https://github.com/Kentico/KInspector/issues/new) or submit a [pull request](https://help.github.com/articles/using-pull-requests/). - -## Local development - -### Requirements - -All versions below are from a known working environment. Lower versions may work but are not tested. - -- [Visual Studio 2017 updated to 15.9.11 or later](https://visualstudio.microsoft.com/vs/) -- [.NET Core 8.0 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) -- [Node for Windows (10.15.X - 20.7.0)](https://nodejs.org/en/) -- [NPM (6.4.X - 10.1.0) (included with Node)](https://www.npmjs.com/) -- [Vue CLI (3.x)](https://cli.vuejs.org/) - -### First run - -Even if you don't plan to make any changes in the Client UI application, you'll need to build it before your first run and any time the client code is updated. To build the Client UI application: +To see the guidelines for Contributing to Kentico open source software, please see [Kentico's `CONTRIBUTING.md`](https://github.com/Kentico/.github/blob/main/CONTRIBUTING.md) for more information and follow the [Kentico's `CODE_OF_CONDUCT`](https://github.com/Kentico/.github/blob/main/CODE_OF_CONDUCT.md). -#### Frontend build instructions -1. Open Powershell/Command Prompt -1. Change the directory to `./KenticoInspector.WebApplication/ClientApp` -1. Run `npm i` -1. Run `npm run build` +Instructions and technical details for contributing to **this** project can be found in [Contributing Setup](./docs/Contributing-Setup.md). -#### Backend build instructions +## Support -1. Open `KInspector.sln` in Visual Studio -1. Do a build -1. Make sure the `KenticoInspector.WebApplication` project is the start up project -1. You can run it with either the `IIS Express` or `Console` debug launch settings +[![Kentico Labs](https://img.shields.io/badge/Kentico_Labs-grey?labelColor=orange&logo=data:image/svg+xml;base64,PHN2ZyBjbGFzcz0ic3ZnLWljb24iIHN0eWxlPSJ3aWR0aDogMWVtOyBoZWlnaHQ6IDFlbTt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2ZpbGw6IGN1cnJlbnRDb2xvcjtvdmVyZmxvdzogaGlkZGVuOyIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik05NTYuMjg4IDgwNC40OEw2NDAgMjc3LjQ0VjY0aDMyYzE3LjYgMCAzMi0xNC40IDMyLTMycy0xNC40LTMyLTMyLTMyaC0zMjBjLTE3LjYgMC0zMiAxNC40LTMyIDMyczE0LjQgMzIgMzIgMzJIMzg0djIxMy40NEw2Ny43MTIgODA0LjQ4Qy00LjczNiA5MjUuMTg0IDUxLjIgMTAyNCAxOTIgMTAyNGg2NDBjMTQwLjggMCAxOTYuNzM2LTk4Ljc1MiAxMjQuMjg4LTIxOS41MnpNMjQxLjAyNCA2NDBMNDQ4IDI5NS4wNFY2NGgxMjh2MjMxLjA0TDc4Mi45NzYgNjQwSDI0MS4wMjR6IiAgLz48L3N2Zz4=)](https://github.com/Kentico/.github/blob/main/SUPPORT.md#labs-limited-support) -If you want to work on the Client UI applicaiton without running `npm run build` any time the code changes, you can set up an automatic build process: -1. Open Powershell/Command Prompt -1. Change the directory to `./KenticoInspector.WebApplication/ClientApp` -1. Run `npm i` (if you haven't already) -1. Run `npm run serve` -1. Leave the terminal open -1. Follow the steps to build the backend, but run it using the `UI Development` debug launch settings. - - This runs the backend with a proxy to the running instance you started in Powershell and allows you to take advantage of the hot-reloading of the client application +This project has **Kentico Labs limited support**. See [`SUPPORT.md`](https://github.com/Kentico/.github/blob/main/SUPPORT.md#full-support) for more information. +For any security issues see [`SECURITY.md`](https://github.com/Kentico/.github/blob/main/SECURITY.md). diff --git a/BestPractices.md b/docs/BestPractices.md similarity index 100% rename from BestPractices.md rename to docs/BestPractices.md diff --git a/CODE_OF_CONDUCT.md b/docs/CODE_OF_CONDUCT.md similarity index 100% rename from CODE_OF_CONDUCT.md rename to docs/CODE_OF_CONDUCT.md diff --git a/CONTRIBUTING.md b/docs/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to docs/CONTRIBUTING.md diff --git a/docs/Contributing-Setup.md b/docs/Contributing-Setup.md new file mode 100644 index 00000000..8b5cef58 --- /dev/null +++ b/docs/Contributing-Setup.md @@ -0,0 +1,25 @@ +# Contributing Setup + +## Requirements + +All versions below are from a known working environment. Lower versions may work but are not tested. + +- [Visual Studio 2017 updated to 15.9.11 or later](https://visualstudio.microsoft.com/vs/) +- [.NET Core 8.0 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) +- [Node for Windows (10.15.X - 20.7.0)](https://nodejs.org/en/) +- [NPM (6.4.X - 10.1.0) (included with Node)](https://www.npmjs.com/) + +## Running the application + +1. Open Powershell/Command Prompt +1. Change the directory to `src/KInspector.Blazor` +1. Run `npm i` +1. Open `src/KInspector.sln` in Visual Studio +1. Make sure the `KenticoInspector.Blazor` project is the start up project +1. You can run it with either the `IIS Express` or `Console` debug launch settings + +Whenever changes are made to `wwwroot/css/app.css`, or new classes are added to the Razor files, you must regenerate the minified CSS file: + +```bash +npm run css +``` \ No newline at end of file diff --git a/docs/Usage-Guide.md b/docs/Usage-Guide.md new file mode 100644 index 00000000..a0bbeebd --- /dev/null +++ b/docs/Usage-Guide.md @@ -0,0 +1,42 @@ +# Usage Guide + +When you run the application, you will see 3 available tabs: + +- [Instances](#managing-instances) +- [Reports](#reports) +- [Actions](#actions) + +To begin, you must first register 1 or more instances which are stored in a local JSON file. + +## Managing instances + +The __Instances__ tab allows you to create and delete instances, and choose which instance is currently connected. An instance _must_ be connected in order to run reports and actions. + +Click the __New instance__ button to add a new Kentico instance. You must supply the following parameters: + +- __Name__: An arbitrary name for the instance +- __Administration path__: The full path to the __CMS__ folder of the Kentico administration, e.g. "C:\inetpub\wwwroot\MySite\CMS" +- __Administration URL__: The URL of the Kentico administration website + +The application should automatically detect the connection string from the `web.config` at the root of the administration path. If not, you will need to provide details to connect to the Kentico database. + +## Reports + +Reports provide detailed information about the Kentico instance and potential issues, _without_ modifying any data. After you click the "Run" button to run the report, the status bar will change to a color indicating the status: + +- :green_book: Success: There are no issues in the results +- :blue_book: Information: The results contain information for your review +- :orange_book: Warning: The results contain issues that can be reviewed, but don't necessarily need resolving +- :closed_book: Error: The results contain issues that should be resolved, either manually or by running an [action](#actions) + +You can click the __Results__ tab to view the detailed information provided by the report. + +## Actions + +> :warning: Actions __modify the database__ and should be used with caution! Always make a backup of your database before running an action. + +Clicking the "Run" button without providing options will display a list of the data that can be modified by the action. After reviewing the data on the __Results__ tab, switch to the __Options__ tab and add the action parameters. When you click "Run" again, the data will be modified and the status bar will change to a color indicating the status: + +- :green_book: Success: There data was modified successfully +- :blue_book: Information: Options were not set and data can be reviewed on the Results tab +- :closed_book: Error: One or more of the options are invalid, or an exception occurred diff --git a/img/reports.png b/img/reports.png new file mode 100644 index 00000000..6c6adc7f Binary files /dev/null and b/img/reports.png differ diff --git a/nuget.config b/nuget.config new file mode 100644 index 00000000..7f3a7c0e --- /dev/null +++ b/nuget.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/KenticoInspector.Actions/ActionsModule.cs b/src/KInspector.Actions/ActionsModule.cs similarity index 88% rename from KenticoInspector.Actions/ActionsModule.cs rename to src/KInspector.Actions/ActionsModule.cs index b0a7c587..4d153753 100644 --- a/KenticoInspector.Actions/ActionsModule.cs +++ b/src/KInspector.Actions/ActionsModule.cs @@ -1,10 +1,10 @@ using Autofac; -using KenticoInspector.Core.Modules; +using KInspector.Core.Modules; using System.Reflection; -namespace KenticoInspector.Reports +namespace KInspector.Reports { public class ActionsModule : Autofac.Module { diff --git a/src/KInspector.Actions/DisableSmtpServers/Action.cs b/src/KInspector.Actions/DisableSmtpServers/Action.cs new file mode 100644 index 00000000..9808dd95 --- /dev/null +++ b/src/KInspector.Actions/DisableSmtpServers/Action.cs @@ -0,0 +1,125 @@ +using KInspector.Actions.DisableSmtpServers.Models; +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; + +namespace KInspector.Actions.DisableSmtpServers +{ + public class Action : AbstractAction + { + private readonly IDatabaseService databaseService; + + public override IList CompatibleVersions => VersionHelper.GetVersionList("12", "13"); + + public override IList Tags => new List { + ModuleTags.Configuration, + ModuleTags.Emails + }; + + public Action(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public override Task Execute(Options? options) + { + // Only partial options are allowed for this action + throw new NotImplementedException(); + } + + public async override Task ExecutePartial(Options? options) + { + if (options?.ServerId is not null && + options?.ServerId > 0 && + options?.SiteId is null) + { + var serversFromSmtp = await databaseService.ExecuteSqlFromFile(Scripts.GetSmtpFromSmtpServers); + if (!serversFromSmtp.Any(s => s.ID == options?.ServerId) || + (!serversFromSmtp.FirstOrDefault(s => s.ID == options?.ServerId)?.Enabled ?? false)) + { + return await GetInvalidOptionsResult(); + } + + return await DisableServer(options?.ServerId); + } + + if (options?.SiteId is not null && + options?.SiteId >= 0 && + options?.ServerId is null) + { + var serversFromSettings = await databaseService.ExecuteSqlFromFile(Scripts.GetSmtpFromSettingsKeys); + if (!serversFromSettings.Any(s => s.SiteID == options?.SiteId) || + serversFromSettings.FirstOrDefault(s => s.SiteID == options?.SiteId)?.Server is null || + (serversFromSettings.FirstOrDefault(s => s.SiteID == options?.SiteId)?.Server?.EndsWith(".disabled") ?? false)) + { + return await GetInvalidOptionsResult(); + } + + return await DisableSiteSetting(options?.SiteId); + } + + return await GetInvalidOptionsResult(); + } + + public async override Task ExecuteListing() + { + var serversFromSettings = await databaseService.ExecuteSqlFromFile(Scripts.GetSmtpFromSettingsKeys); + var serversFromSmtp = await databaseService.ExecuteSqlFromFile(Scripts.GetSmtpFromSmtpServers); + var results = new ModuleResults + { + Type = ResultsType.TableList, + Status = ResultsStatus.Information, + Summary = Metadata.Terms.ListSummary + }; + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.ServersFromSmtpTable, + Rows = serversFromSmtp + }); + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.ServersFromSettingsTable, + Rows = serversFromSettings + }); + + return results; + } + + public async override Task GetInvalidOptionsResult() + { + var result = await ExecuteListing(); + result.Status = ResultsStatus.Error; + result.Summary = Metadata.Terms.InvalidOptions; + + return result; + } + + private async Task DisableServer(int? serverId) + { + await databaseService.ExecuteNonQuery(Scripts.DisableSmtpServer, new { ServerID = serverId }); + var result = await ExecuteListing(); + result.Status = ResultsStatus.Good; + result.Summary = Metadata.Terms.ServerDisabled?.With(new + { + serverId + }); + + return result; + } + + private async Task DisableSiteSetting(int? siteId) + { + await databaseService.ExecuteNonQuery(Scripts.DisableSiteSmtpServer, new { SiteID = siteId }); + var result = await ExecuteListing(); + result.Status = ResultsStatus.Good; + result.Summary = Metadata.Terms.SiteSettingDisabled?.With(new + { + siteId + }); + + return result; + } + } +} \ No newline at end of file diff --git a/src/KInspector.Actions/DisableSmtpServers/Metadata/en-US.yaml b/src/KInspector.Actions/DisableSmtpServers/Metadata/en-US.yaml new file mode 100644 index 00000000..28240b3c --- /dev/null +++ b/src/KInspector.Actions/DisableSmtpServers/Metadata/en-US.yaml @@ -0,0 +1,15 @@ +details: + name: Disable SMTP servers + shortDescription: Review and disable SMTP servers. + longDescription: | + Displays all SMTP servers, and allows you to disable them. + + Run the action without options to view the SMTP servers. To disable a server, re-run the action with the server ID, or a site ID to disable the SMTP server registered in the **Settings** application for that site. + Servers disabled by this action have the **.disabled** prefix applied to their name, so you can identify which servers were disabled by this action and which were disabled manually. +terms: + serversFromSettingsTable: SMTP servers from settings keys + serversFromSmtpTable: SMTP servers from SMTP servers application + invalidOptions: Invalid options. Only provide one option, and ensure the ID is listed in the results and enabled. + listSummary: Set the SMTP server ID or site ID you wish to disable and re-run + serverDisabled: SMTP server ID was disabled + siteSettingDisabled: SMTP server in site settings was disabled \ No newline at end of file diff --git a/src/KInspector.Actions/DisableSmtpServers/Models/Options.cs b/src/KInspector.Actions/DisableSmtpServers/Models/Options.cs new file mode 100644 index 00000000..57ee8f00 --- /dev/null +++ b/src/KInspector.Actions/DisableSmtpServers/Models/Options.cs @@ -0,0 +1,15 @@ +using System.ComponentModel; + +namespace KInspector.Actions.DisableSmtpServers.Models +{ + public class Options + { + [DisplayName("Site ID")] + [Description("The site ID used to disable SMTP servers in the Settings application.")] + public int? SiteId { get; set; } + + [DisplayName("Server ID")] + [Description("The server ID to disable from the SMTP Servers application.")] + public int? ServerId { get; set; } + } +} diff --git a/src/KInspector.Actions/DisableSmtpServers/Models/Results/SmtpFromSettings.cs b/src/KInspector.Actions/DisableSmtpServers/Models/Results/SmtpFromSettings.cs new file mode 100644 index 00000000..38947227 --- /dev/null +++ b/src/KInspector.Actions/DisableSmtpServers/Models/Results/SmtpFromSettings.cs @@ -0,0 +1,15 @@ +namespace KInspector.Actions.DisableSmtpServers.Models +{ + public class SmtpFromSettings + { + public int SiteID { get; set; } + + public string? SiteName { get; set; } + + public string? Server { get; set; } + + public string? User { get; set; } + + public string? Authentication { get; set; } + } +} diff --git a/src/KInspector.Actions/DisableSmtpServers/Models/Results/SmtpFromSmtpServers.cs b/src/KInspector.Actions/DisableSmtpServers/Models/Results/SmtpFromSmtpServers.cs new file mode 100644 index 00000000..ffb87369 --- /dev/null +++ b/src/KInspector.Actions/DisableSmtpServers/Models/Results/SmtpFromSmtpServers.cs @@ -0,0 +1,21 @@ +namespace KInspector.Actions.DisableSmtpServers.Models +{ + public class SmtpFromSmtpServers + { + public int ID { get; set; } + + public string? Name { get; set; } + + public string? User { get; set; } + + public string? Authentication { get; set; } + + public string? DeliveryMethod { get; set; } + + public bool SSL { get; set; } + + public bool Global { get; set; } + + public bool Enabled { get; set; } + } +} diff --git a/src/KInspector.Actions/DisableSmtpServers/Models/Terms.cs b/src/KInspector.Actions/DisableSmtpServers/Models/Terms.cs new file mode 100644 index 00000000..b8782cf8 --- /dev/null +++ b/src/KInspector.Actions/DisableSmtpServers/Models/Terms.cs @@ -0,0 +1,19 @@ +using KInspector.Core.Models; + +namespace KInspector.Actions.DisableSmtpServers.Models +{ + public class Terms + { + public Term? InvalidOptions { get; internal set; } + + public Term? ServersFromSettingsTable { get; internal set; } + + public Term? ServersFromSmtpTable { get; internal set; } + + public Term? ListSummary { get; internal set; } + + public Term? ServerDisabled { get; internal set; } + + public Term? SiteSettingDisabled { get; internal set; } + } +} diff --git a/src/KInspector.Actions/DisableSmtpServers/Scripts.cs b/src/KInspector.Actions/DisableSmtpServers/Scripts.cs new file mode 100644 index 00000000..6072b877 --- /dev/null +++ b/src/KInspector.Actions/DisableSmtpServers/Scripts.cs @@ -0,0 +1,15 @@ +namespace KInspector.Actions.DisableSmtpServers +{ + public static class Scripts + { + public static string BaseDirectory => $"{nameof(DisableSmtpServers)}/Scripts"; + + public static string GetSmtpFromSettingsKeys => $"{BaseDirectory}/{nameof(GetSmtpFromSettingsKeys)}.sql"; + + public static string GetSmtpFromSmtpServers => $"{BaseDirectory}/{nameof(GetSmtpFromSmtpServers)}.sql"; + + public static string DisableSiteSmtpServer => $"{BaseDirectory}/{nameof(DisableSiteSmtpServer)}.sql"; + + public static string DisableSmtpServer => $"{BaseDirectory}/{nameof(DisableSmtpServer)}.sql"; + } +} diff --git a/src/KInspector.Actions/DisableSmtpServers/Scripts/DisableSiteSmtpServer.sql b/src/KInspector.Actions/DisableSmtpServers/Scripts/DisableSiteSmtpServer.sql new file mode 100644 index 00000000..227cdac6 --- /dev/null +++ b/src/KInspector.Actions/DisableSmtpServers/Scripts/DisableSiteSmtpServer.sql @@ -0,0 +1,6 @@ +IF @SiteID = 0 BEGIN + UPDATE CMS_SettingsKey SET KeyValue = KeyValue + '.disabled' WHERE KeyName = N'CMSSMTPServer' AND SiteID IS NULL +END +ELSE BEGIN + UPDATE CMS_SettingsKey SET KeyValue = KeyValue + '.disabled' WHERE KeyName = N'CMSSMTPServer' AND SiteID = @SiteID +END \ No newline at end of file diff --git a/src/KInspector.Actions/DisableSmtpServers/Scripts/DisableSmtpServer.sql b/src/KInspector.Actions/DisableSmtpServers/Scripts/DisableSmtpServer.sql new file mode 100644 index 00000000..97878a84 --- /dev/null +++ b/src/KInspector.Actions/DisableSmtpServers/Scripts/DisableSmtpServer.sql @@ -0,0 +1 @@ +UPDATE CMS_SMTPServer SET ServerName = ServerName + '.disabled', ServerEnabled = 0 WHERE ServerID = @ServerID \ No newline at end of file diff --git a/src/KInspector.Actions/DisableSmtpServers/Scripts/GetSmtpFromSettingsKeys.sql b/src/KInspector.Actions/DisableSmtpServers/Scripts/GetSmtpFromSettingsKeys.sql new file mode 100644 index 00000000..9ce27dec --- /dev/null +++ b/src/KInspector.Actions/DisableSmtpServers/Scripts/GetSmtpFromSettingsKeys.sql @@ -0,0 +1,18 @@ +DECLARE @SettingsTable TABLE ( + KeyName nvarchar(max), + KeyValue nvarchar(max), + SiteID int +) + +INSERT INTO @SettingsTable SELECT KeyName, KeyValue, SiteID FROM CMS_SettingsKey WHERE KeyName IN (N'CMSSMTPServer', N'CMSSMTPServerUser', N'CMSSMTPServerAuthenticationType') + +SELECT S.SiteID AS 'SiteID', S.SiteDisplayName AS 'SiteName', + (SELECT KeyValue FROM @SettingsTable WHERE KeyName = N'CMSSMTPServer' AND SiteID = S.SiteID) AS 'Server', + (SELECT KeyValue FROM @SettingsTable WHERE KeyName = N'CMSSMTPServerUser' AND SiteID = S.SiteID) AS 'User', + (SELECT KeyValue FROM @SettingsTable WHERE KeyName = N'CMSSMTPServerAuthenticationType' AND SiteID = S.SiteID) AS 'Authentication' +FROM CMS_Site S +UNION +SELECT 0 AS 'SiteID', '(global)' AS 'SiteName', + (SELECT KeyValue FROM @SettingsTable WHERE KeyName = N'CMSSMTPServer' AND SiteID IS NULL) AS 'Server', + (SELECT KeyValue FROM @SettingsTable WHERE KeyName = N'CMSSMTPServerUser' AND SiteID IS NULL) AS 'User', + (SELECT KeyValue FROM @SettingsTable WHERE KeyName = N'CMSSMTPServerAuthenticationType' AND SiteID IS NULL) AS 'Authentication' \ No newline at end of file diff --git a/src/KInspector.Actions/DisableSmtpServers/Scripts/GetSmtpFromSmtpServers.sql b/src/KInspector.Actions/DisableSmtpServers/Scripts/GetSmtpFromSmtpServers.sql new file mode 100644 index 00000000..2913a201 --- /dev/null +++ b/src/KInspector.Actions/DisableSmtpServers/Scripts/GetSmtpFromSmtpServers.sql @@ -0,0 +1,4 @@ +SELECT ServerID AS 'ID', ServerName AS 'Name', ServerAuthenticationType AS 'Authentication', ServerUserName AS 'User', + CASE WHEN ServerDeliveryMethod = 0 THEN 'Network' WHEN ServerDeliveryMethod = 1 THEN 'Pickup (directory)' WHEN ServerDeliveryMethod = 2 THEN 'Pickup (IIS)' END AS 'DeliveryMethod', + ServerUseSSL AS 'SSL', ServerIsGlobal AS 'Global', ServerEnabled AS 'Enabled' +FROM CMS_SMTPServer \ No newline at end of file diff --git a/src/KInspector.Actions/DisableStagingServers/Action.cs b/src/KInspector.Actions/DisableStagingServers/Action.cs new file mode 100644 index 00000000..7e1701b6 --- /dev/null +++ b/src/KInspector.Actions/DisableStagingServers/Action.cs @@ -0,0 +1,85 @@ +using KInspector.Actions.DisableStagingServers.Models; +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; + +namespace KInspector.Actions.DisableStagingServers +{ + public class Action : AbstractAction + { + private readonly IDatabaseService databaseService; + + public override IList CompatibleVersions => VersionHelper.GetVersionList("12", "13"); + + public override IList Tags => new List { + ModuleTags.Configuration, + ModuleTags.Staging + }; + + public Action(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public async override Task Execute(Options? options) + { + var isValid = await ServerIsValid(options?.ServerId); + if (!isValid) + { + return await GetInvalidOptionsResult(); + } + + await databaseService.ExecuteNonQuery(Scripts.DisableServer, new { ServerID = options?.ServerId }); + var result = await ExecuteListing(); + result.Status = ResultsStatus.Good; + result.Summary = Metadata.Terms.ServerDisabled?.With(new + { + serverId = options?.ServerId + }); + + return result; + } + + public override Task ExecutePartial(Options? options) + { + // All options are required for this action + throw new NotImplementedException(); + } + + public async override Task ExecuteListing() + { + var servers = await databaseService.ExecuteSqlFromFile(Scripts.GetStagingServerSummary); + var result = new ModuleResults + { + Type = ResultsType.TableList, + Status = ResultsStatus.Information, + Summary = Metadata.Terms.ListSummary + }; + result.TableResults.Add(new TableResult + { + Name = Metadata.Terms.TableTitle, + Rows = servers + }); + + return result; + } + + public async override Task GetInvalidOptionsResult() + { + var result = await ExecuteListing(); + result.Status = ResultsStatus.Error; + result.Summary = Metadata.Terms.InvalidOptions; + + return result; + } + + private async Task ServerIsValid(int? serverId) + { + var servers = await databaseService.ExecuteSqlFromFile(Scripts.GetStagingServerSummary); + + return serverId > 0 && servers.Any(s => s.ID == serverId); + } + } +} \ No newline at end of file diff --git a/src/KInspector.Actions/DisableStagingServers/Metadata/en-US.yaml b/src/KInspector.Actions/DisableStagingServers/Metadata/en-US.yaml new file mode 100644 index 00000000..ed987ae8 --- /dev/null +++ b/src/KInspector.Actions/DisableStagingServers/Metadata/en-US.yaml @@ -0,0 +1,12 @@ +details: + name: Disable content staging servers + shortDescription: Review and disable staging servers. + longDescription: | + Displays all staging servers, and allows you to disable them. + + Run the action without options to view the staging servers. To disable a server, re-run the action with the server ID. Servers disabled by this action have the **.disabled** prefix applied to their name, so you can identify which servers were disabled by this action and which were disabled manually. +terms: + tableTitle: Content staging servers + invalidOptions: The server ID must be an integer greater than zero and present in the database. + listSummary: Set the server ID you wish to disable and re-run + serverDisabled: Server ID was disabled \ No newline at end of file diff --git a/src/KInspector.Actions/DisableStagingServers/Models/Options.cs b/src/KInspector.Actions/DisableStagingServers/Models/Options.cs new file mode 100644 index 00000000..9dfa6ec9 --- /dev/null +++ b/src/KInspector.Actions/DisableStagingServers/Models/Options.cs @@ -0,0 +1,11 @@ +using System.ComponentModel; + +namespace KInspector.Actions.DisableStagingServers.Models +{ + public class Options + { + [DisplayName("Server ID")] + [Description("The content staging server ID to disable.")] + public int? ServerId { get; set; } + } +} diff --git a/src/KInspector.Actions/DisableStagingServers/Models/Results/StagingServer.cs b/src/KInspector.Actions/DisableStagingServers/Models/Results/StagingServer.cs new file mode 100644 index 00000000..f27ffc76 --- /dev/null +++ b/src/KInspector.Actions/DisableStagingServers/Models/Results/StagingServer.cs @@ -0,0 +1,15 @@ +namespace KInspector.Actions.DisableStagingServers.Models +{ + public class StagingServer + { + public int ID { get; set; } + + public string? Name { get; set; } + + public string? Site { get; set; } + + public string? Url { get; set; } + + public bool Enabled { get; set; } + } +} diff --git a/src/KInspector.Actions/DisableStagingServers/Models/Terms.cs b/src/KInspector.Actions/DisableStagingServers/Models/Terms.cs new file mode 100644 index 00000000..601f9d40 --- /dev/null +++ b/src/KInspector.Actions/DisableStagingServers/Models/Terms.cs @@ -0,0 +1,15 @@ +using KInspector.Core.Models; + +namespace KInspector.Actions.DisableStagingServers.Models +{ + public class Terms + { + public Term? InvalidOptions { get; internal set; } + + public Term? TableTitle { get; internal set; } + + public Term? ListSummary { get; internal set; } + + public Term? ServerDisabled { get; internal set; } + } +} diff --git a/src/KInspector.Actions/DisableStagingServers/Scripts.cs b/src/KInspector.Actions/DisableStagingServers/Scripts.cs new file mode 100644 index 00000000..d2fedad8 --- /dev/null +++ b/src/KInspector.Actions/DisableStagingServers/Scripts.cs @@ -0,0 +1,11 @@ +namespace KInspector.Actions.DisableStagingServers +{ + public static class Scripts + { + public static string BaseDirectory => $"{nameof(DisableStagingServers)}/Scripts"; + + public static string GetStagingServerSummary => $"{BaseDirectory}/{nameof(GetStagingServerSummary)}.sql"; + + public static string DisableServer => $"{BaseDirectory}/{nameof(DisableServer)}.sql"; + } +} diff --git a/src/KInspector.Actions/DisableStagingServers/Scripts/DisableServer.sql b/src/KInspector.Actions/DisableStagingServers/Scripts/DisableServer.sql new file mode 100644 index 00000000..8280ec83 --- /dev/null +++ b/src/KInspector.Actions/DisableStagingServers/Scripts/DisableServer.sql @@ -0,0 +1,2 @@ +UPDATE Staging_Server SET ServerDisplayName = ServerDisplayName + N'.disabled', ServerEnabled = 0 +WHERE ServerID = @ServerID \ No newline at end of file diff --git a/src/KInspector.Actions/DisableStagingServers/Scripts/GetStagingServerSummary.sql b/src/KInspector.Actions/DisableStagingServers/Scripts/GetStagingServerSummary.sql new file mode 100644 index 00000000..9af12221 --- /dev/null +++ b/src/KInspector.Actions/DisableStagingServers/Scripts/GetStagingServerSummary.sql @@ -0,0 +1,3 @@ +SELECT C.ServerID AS 'ID', C.ServerDisplayName AS 'Name', C.ServerEnabled AS 'Enabled', C.ServerURL AS 'Url', S.SiteDisplayName AS 'Site' +FROM Staging_Server AS C +JOIN CMS_Site AS S ON S.SiteID = C.ServerSiteID \ No newline at end of file diff --git a/src/KInspector.Actions/DisableWebFarmServers/Action.cs b/src/KInspector.Actions/DisableWebFarmServers/Action.cs new file mode 100644 index 00000000..0649adae --- /dev/null +++ b/src/KInspector.Actions/DisableWebFarmServers/Action.cs @@ -0,0 +1,85 @@ +using KInspector.Actions.DisableWebFarmServers.Models; +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; + +namespace KInspector.Actions.DisableWebFarmServers +{ + public class Action : AbstractAction + { + private readonly IDatabaseService databaseService; + + public override IList CompatibleVersions => VersionHelper.GetVersionList("12", "13"); + + public override IList Tags => new List { + ModuleTags.Configuration, + ModuleTags.WebFarms + }; + + public Action(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public async override Task Execute(Options? options) + { + var isValid = await ServerIsValid(options?.ServerId); + if (!isValid) + { + return await GetInvalidOptionsResult(); + } + + await databaseService.ExecuteNonQuery(Scripts.DisableServer, new { ServerID = options?.ServerId }); + var result = await ExecuteListing(); + result.Status = ResultsStatus.Good; + result.Summary = Metadata.Terms.ServerDisabled.With(new + { + serverId = options?.ServerId + }); + + return result; + } + + public override Task ExecutePartial(Options? options) + { + // All options are required for this action + throw new NotImplementedException(); + } + + public async override Task ExecuteListing() + { + var servers = await databaseService.ExecuteSqlFromFile(Scripts.GetWebFarmServerSummary); + var result = new ModuleResults + { + Type = ResultsType.TableList, + Status = ResultsStatus.Information, + Summary = Metadata.Terms.ListSummary + }; + result.TableResults.Add(new TableResult + { + Name = Metadata.Terms.TableTitle, + Rows = servers + }); + + return result; + } + + public async override Task GetInvalidOptionsResult() + { + var result = await ExecuteListing(); + result.Status = ResultsStatus.Error; + result.Summary = Metadata.Terms.InvalidOptions; + + return result; + } + + private async Task ServerIsValid(int? serverId) + { + var servers = await databaseService.ExecuteSqlFromFile(Scripts.GetWebFarmServerSummary); + + return serverId > 0 && servers.Any(s => s.ID == serverId); + } + } +} diff --git a/src/KInspector.Actions/DisableWebFarmServers/Metadata/en-US.yaml b/src/KInspector.Actions/DisableWebFarmServers/Metadata/en-US.yaml new file mode 100644 index 00000000..b95acecd --- /dev/null +++ b/src/KInspector.Actions/DisableWebFarmServers/Metadata/en-US.yaml @@ -0,0 +1,12 @@ +details: + name: Disable web farm servers + shortDescription: Review and disable web farm servers. + longDescription: | + Displays all web farm servers, and allows you to disable them. + + Run the action without options to view the web farm servers. To disable a server, re-run the action with the server ID. Servers disabled by this action have the **.disabled** prefix applied to their name, so you can identify which servers were disabled by this action and which were disabled manually. +terms: + tableTitle: Web farm servers + invalidOptions: The server ID must be an integer greater than zero and present in the database. + listSummary: Set the server ID you wish to disable and re-run + serverDisabled: Server ID was disabled \ No newline at end of file diff --git a/src/KInspector.Actions/DisableWebFarmServers/Models/Options.cs b/src/KInspector.Actions/DisableWebFarmServers/Models/Options.cs new file mode 100644 index 00000000..f3620d09 --- /dev/null +++ b/src/KInspector.Actions/DisableWebFarmServers/Models/Options.cs @@ -0,0 +1,11 @@ +using System.ComponentModel; + +namespace KInspector.Actions.DisableWebFarmServers.Models +{ + public class Options + { + [DisplayName("Server ID")] + [Description("The web farm server ID to disable.")] + public int? ServerId { get; set; } + } +} diff --git a/src/KInspector.Actions/DisableWebFarmServers/Models/Results/WebFarmServer.cs b/src/KInspector.Actions/DisableWebFarmServers/Models/Results/WebFarmServer.cs new file mode 100644 index 00000000..a7a9485d --- /dev/null +++ b/src/KInspector.Actions/DisableWebFarmServers/Models/Results/WebFarmServer.cs @@ -0,0 +1,11 @@ +namespace KInspector.Actions.DisableWebFarmServers.Models +{ + public class WebFarmServer + { + public int ID { get; set; } + + public string? Name { get; set; } + + public bool Enabled { get; set; } + } +} diff --git a/KenticoInspector.Actions/ResetCmsUserLogin/Models/Terms.cs b/src/KInspector.Actions/DisableWebFarmServers/Models/Terms.cs similarity index 58% rename from KenticoInspector.Actions/ResetCmsUserLogin/Models/Terms.cs rename to src/KInspector.Actions/DisableWebFarmServers/Models/Terms.cs index 97c9a3d1..5e4694d1 100644 --- a/KenticoInspector.Actions/ResetCmsUserLogin/Models/Terms.cs +++ b/src/KInspector.Actions/DisableWebFarmServers/Models/Terms.cs @@ -1,6 +1,6 @@ -using KenticoInspector.Core.Models; +using KInspector.Core.Models; -namespace KenticoInspector.Actions.ResetCmsUserLogin.Models +namespace KInspector.Actions.DisableWebFarmServers.Models { public class Terms { @@ -10,6 +10,6 @@ public class Terms public Term ListSummary { get; internal set; } - public Term UserReset { get; internal set; } + public Term ServerDisabled { get; internal set; } } } diff --git a/src/KInspector.Actions/DisableWebFarmServers/Scripts.cs b/src/KInspector.Actions/DisableWebFarmServers/Scripts.cs new file mode 100644 index 00000000..b51f77ae --- /dev/null +++ b/src/KInspector.Actions/DisableWebFarmServers/Scripts.cs @@ -0,0 +1,11 @@ +namespace KInspector.Actions.DisableWebFarmServers +{ + public static class Scripts + { + public static string BaseDirectory => $"{nameof(DisableWebFarmServers)}/Scripts"; + + public static string GetWebFarmServerSummary => $"{BaseDirectory}/{nameof(GetWebFarmServerSummary)}.sql"; + + public static string DisableServer => $"{BaseDirectory}/{nameof(DisableServer)}.sql"; + } +} diff --git a/src/KInspector.Actions/DisableWebFarmServers/Scripts/DisableServer.sql b/src/KInspector.Actions/DisableWebFarmServers/Scripts/DisableServer.sql new file mode 100644 index 00000000..e44ac945 --- /dev/null +++ b/src/KInspector.Actions/DisableWebFarmServers/Scripts/DisableServer.sql @@ -0,0 +1,2 @@ +UPDATE CMS_WebFarmServer SET ServerDisplayName = ServerDisplayName + N'.disabled', ServerEnabled = 0 +WHERE ServerID = @ServerID \ No newline at end of file diff --git a/src/KInspector.Actions/DisableWebFarmServers/Scripts/GetWebFarmServerSummary.sql b/src/KInspector.Actions/DisableWebFarmServers/Scripts/GetWebFarmServerSummary.sql new file mode 100644 index 00000000..11f1a87f --- /dev/null +++ b/src/KInspector.Actions/DisableWebFarmServers/Scripts/GetWebFarmServerSummary.sql @@ -0,0 +1,2 @@ +SELECT ServerID AS 'ID', ServerDisplayName AS 'Name', ServerEnabled AS 'Enabled' +FROM CMS_WebFarmServer \ No newline at end of file diff --git a/src/KInspector.Actions/KInspector.Actions.csproj b/src/KInspector.Actions/KInspector.Actions.csproj new file mode 100644 index 00000000..abc4112f --- /dev/null +++ b/src/KInspector.Actions/KInspector.Actions.csproj @@ -0,0 +1,70 @@ + + + + KInspector.Actions + net8.0 + + + + + + + + + + + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + + diff --git a/src/KInspector.Actions/ResetCmsUserLogin/Action.cs b/src/KInspector.Actions/ResetCmsUserLogin/Action.cs new file mode 100644 index 00000000..7b0dbdde --- /dev/null +++ b/src/KInspector.Actions/ResetCmsUserLogin/Action.cs @@ -0,0 +1,85 @@ +using KInspector.Actions.ResetCmsUserLogin.Models; +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; + +namespace KInspector.Actions.ResetCmsUserLogin +{ + public class Action : AbstractAction + { + private readonly IDatabaseService databaseService; + + public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); + + public override IList Tags => new List { + ModuleTags.Reset, + ModuleTags.User + }; + + public Action(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public async override Task Execute(Options? options) + { + var isValid = await UserIsValid(options?.UserId); + if (!isValid) + { + return await GetInvalidOptionsResult(); + } + + // Reset provided user + await databaseService.ExecuteNonQuery(Scripts.ResetAndEnableUser, new { UserID = options?.UserId }); + var result = await ExecuteListing(); + result.Status = ResultsStatus.Good; + result.Summary = Metadata.Terms.UserReset?.With(new { + userId = options?.UserId + }); + + return result; + } + + public override Task ExecutePartial(Options? options) + { + // All options are required for this action + throw new NotImplementedException(); + } + + public async override Task ExecuteListing() + { + var administratorUsers = await databaseService.ExecuteSqlFromFile(Scripts.GetAdministrators); + var results = new ModuleResults + { + Type = ResultsType.TableList, + Status = ResultsStatus.Information, + Summary = Metadata.Terms.ListSummary + }; + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.TableTitle, + Rows = administratorUsers + }); + + return results; + } + + public async override Task GetInvalidOptionsResult() + { + var result = await ExecuteListing(); + result.Status = ResultsStatus.Error; + result.Summary = Metadata.Terms.InvalidOptions; + + return result; + } + + private async Task UserIsValid(int? userId) + { + var users = await databaseService.ExecuteSqlFromFile(Scripts.GetAdministrators); + + return userId > 0 && users.Any(u => u.UserID == userId); + } + } +} diff --git a/KenticoInspector.Actions/ResetCmsUserLogin/Metadata/en-US.yaml b/src/KInspector.Actions/ResetCmsUserLogin/Metadata/en-US.yaml similarity index 88% rename from KenticoInspector.Actions/ResetCmsUserLogin/Metadata/en-US.yaml rename to src/KInspector.Actions/ResetCmsUserLogin/Metadata/en-US.yaml index 074f63c8..3ffe9d23 100644 --- a/KenticoInspector.Actions/ResetCmsUserLogin/Metadata/en-US.yaml +++ b/src/KInspector.Actions/ResetCmsUserLogin/Metadata/en-US.yaml @@ -1,12 +1,12 @@ details: - name: Global Administrator Summary + name: Reset global administrator shortDescription: Reset a global administrator so that you can login with an empty password. longDescription: | This action ensures that the global administrator user is enabled, their password is blank, and their last changed date is reset to today. - Run the action without options to view the global administrator accounts. To reset a user account, re-run the action with their user ID below. + Run the action without options to view the global administrator accounts. To reset a user account, re-run the action with their user ID. terms: tableTitle: Global administrators - invalidOptions: The user ID must be an integer greater than zero. + invalidOptions: The user ID must be an integer greater than zero and present in the database. listSummary: Set the user ID you wish to reset and re-run userReset: User ID was reset \ No newline at end of file diff --git a/src/KInspector.Actions/ResetCmsUserLogin/Models/Options.cs b/src/KInspector.Actions/ResetCmsUserLogin/Models/Options.cs new file mode 100644 index 00000000..a021c223 --- /dev/null +++ b/src/KInspector.Actions/ResetCmsUserLogin/Models/Options.cs @@ -0,0 +1,11 @@ +using System.ComponentModel; + +namespace KInspector.Actions.ResetCmsUserLogin.Models +{ + public class Options + { + [DisplayName("User ID")] + [Description("The user ID to reset and enable.")] + public int? UserId { get; set; } + } +} diff --git a/src/KInspector.Actions/ResetCmsUserLogin/Models/Results/CmsUser.cs b/src/KInspector.Actions/ResetCmsUserLogin/Models/Results/CmsUser.cs new file mode 100644 index 00000000..b1631ec9 --- /dev/null +++ b/src/KInspector.Actions/ResetCmsUserLogin/Models/Results/CmsUser.cs @@ -0,0 +1,13 @@ +namespace KInspector.Actions.ResetCmsUserLogin.Models +{ + public class CmsUser + { + public int UserID { get; set; } + + public string? UserName { get; set; } + + public string? Password { get; set; } + + public bool Enabled { get; set; } + } +} diff --git a/src/KInspector.Actions/ResetCmsUserLogin/Models/Terms.cs b/src/KInspector.Actions/ResetCmsUserLogin/Models/Terms.cs new file mode 100644 index 00000000..5fed95c5 --- /dev/null +++ b/src/KInspector.Actions/ResetCmsUserLogin/Models/Terms.cs @@ -0,0 +1,15 @@ +using KInspector.Core.Models; + +namespace KInspector.Actions.ResetCmsUserLogin.Models +{ + public class Terms + { + public Term? InvalidOptions { get; internal set; } + + public Term? TableTitle { get; internal set; } + + public Term? ListSummary { get; internal set; } + + public Term? UserReset { get; internal set; } + } +} diff --git a/KenticoInspector.Actions/ResetCmsUserLogin/Scripts.cs b/src/KInspector.Actions/ResetCmsUserLogin/Scripts.cs similarity index 85% rename from KenticoInspector.Actions/ResetCmsUserLogin/Scripts.cs rename to src/KInspector.Actions/ResetCmsUserLogin/Scripts.cs index 87066be8..149fba89 100644 --- a/KenticoInspector.Actions/ResetCmsUserLogin/Scripts.cs +++ b/src/KInspector.Actions/ResetCmsUserLogin/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Actions.ResetCmsUserLogin +namespace KInspector.Actions.ResetCmsUserLogin { public static class Scripts { diff --git a/KenticoInspector.Actions/ResetCmsUserLogin/Scripts/GetAdministrators.sql b/src/KInspector.Actions/ResetCmsUserLogin/Scripts/GetAdministrators.sql similarity index 100% rename from KenticoInspector.Actions/ResetCmsUserLogin/Scripts/GetAdministrators.sql rename to src/KInspector.Actions/ResetCmsUserLogin/Scripts/GetAdministrators.sql diff --git a/KenticoInspector.Actions/ResetCmsUserLogin/Scripts/ResetAndEnableUser.sql b/src/KInspector.Actions/ResetCmsUserLogin/Scripts/ResetAndEnableUser.sql similarity index 100% rename from KenticoInspector.Actions/ResetCmsUserLogin/Scripts/ResetAndEnableUser.sql rename to src/KInspector.Actions/ResetCmsUserLogin/Scripts/ResetAndEnableUser.sql diff --git a/src/KInspector.Actions/StopRunningSites/Action.cs b/src/KInspector.Actions/StopRunningSites/Action.cs new file mode 100644 index 00000000..ee84f45f --- /dev/null +++ b/src/KInspector.Actions/StopRunningSites/Action.cs @@ -0,0 +1,85 @@ +using KInspector.Actions.StopRunningSites.Models; +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; + +namespace KInspector.Actions.StopRunningSites +{ + public class Action : AbstractAction + { + private readonly IDatabaseService databaseService; + + public override IList CompatibleVersions => VersionHelper.GetVersionList("12", "13"); + + public override IList Tags => new List { + ModuleTags.Site, + ModuleTags.Configuration + }; + + public Action(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public async override Task Execute(Options? options) + { + var isValid = await SiteIsValid(options?.SiteId); + if (!isValid) + { + return await GetInvalidOptionsResult(); + } + + await databaseService.ExecuteNonQuery(Scripts.StopSite, new { SiteID = options?.SiteId }); + var result = await ExecuteListing(); + result.Status = ResultsStatus.Good; + result.Summary = Metadata.Terms.SiteStopped?.With(new + { + siteId = options?.SiteId + }); + + return result; + } + + public override Task ExecutePartial(Options? options) + { + // All options are required for this action + throw new NotImplementedException(); + } + + public async override Task ExecuteListing() + { + var sites = await databaseService.ExecuteSqlFromFile(Scripts.GetSiteSummary); + var results = new ModuleResults + { + Type = ResultsType.TableList, + Status = ResultsStatus.Information, + Summary = Metadata.Terms.ListSummary + }; + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.TableTitle, + Rows = sites + }); + + return results; + } + + public async override Task GetInvalidOptionsResult() + { + var result = await ExecuteListing(); + result.Status = ResultsStatus.Error; + result.Summary = Metadata.Terms.InvalidOptions; + + return result; + } + + private async Task SiteIsValid(int? siteId) + { + var sites = await databaseService.ExecuteSqlFromFile(Scripts.GetSiteSummary); + + return siteId > 0 && sites.Any(s => s.ID == siteId); + } + } +} \ No newline at end of file diff --git a/src/KInspector.Actions/StopRunningSites/Metadata/en-US.yaml b/src/KInspector.Actions/StopRunningSites/Metadata/en-US.yaml new file mode 100644 index 00000000..8847864c --- /dev/null +++ b/src/KInspector.Actions/StopRunningSites/Metadata/en-US.yaml @@ -0,0 +1,12 @@ +details: + name: Stop running sites + shortDescription: Review and stop running sites. + longDescription: | + Displays all sites registered in the instance and their configuration, and allows you to stop running sites. + + Run the action without options to view the site summary. To stop a site, re-run the action with the site ID. +terms: + tableTitle: Sites + invalidOptions: The site ID must be an integer greater than zero and present in the database. + listSummary: Set the site ID you wish to stop and re-run + siteStopped: Site ID was stopped \ No newline at end of file diff --git a/src/KInspector.Actions/StopRunningSites/Models/Options.cs b/src/KInspector.Actions/StopRunningSites/Models/Options.cs new file mode 100644 index 00000000..d3dbe31d --- /dev/null +++ b/src/KInspector.Actions/StopRunningSites/Models/Options.cs @@ -0,0 +1,11 @@ +using System.ComponentModel; + +namespace KInspector.Actions.StopRunningSites.Models +{ + public class Options + { + [DisplayName("Site ID")] + [Description("The site ID to stop.")] + public int? SiteId { get; set; } + } +} diff --git a/src/KInspector.Actions/StopRunningSites/Models/Results/CmsSite.cs b/src/KInspector.Actions/StopRunningSites/Models/Results/CmsSite.cs new file mode 100644 index 00000000..3bf5fc12 --- /dev/null +++ b/src/KInspector.Actions/StopRunningSites/Models/Results/CmsSite.cs @@ -0,0 +1,17 @@ +namespace KInspector.Actions.StopRunningSites.Models +{ + public class CmsSite + { + public int ID { get; set; } + + public string? DisplayName { get; set; } + + public string? Description { get; set; } + + public string? AdministrationDomain { get; set; } + + public string? PresentationUrl { get; set; } + + public bool Running { get; set; } + } +} diff --git a/src/KInspector.Actions/StopRunningSites/Models/Terms.cs b/src/KInspector.Actions/StopRunningSites/Models/Terms.cs new file mode 100644 index 00000000..18fded1e --- /dev/null +++ b/src/KInspector.Actions/StopRunningSites/Models/Terms.cs @@ -0,0 +1,15 @@ +using KInspector.Core.Models; + +namespace KInspector.Actions.StopRunningSites.Models +{ + public class Terms + { + public Term? InvalidOptions { get; internal set; } + + public Term? TableTitle { get; internal set; } + + public Term? ListSummary { get; internal set; } + + public Term? SiteStopped { get; internal set; } + } +} diff --git a/src/KInspector.Actions/StopRunningSites/Scripts.cs b/src/KInspector.Actions/StopRunningSites/Scripts.cs new file mode 100644 index 00000000..b8710d20 --- /dev/null +++ b/src/KInspector.Actions/StopRunningSites/Scripts.cs @@ -0,0 +1,11 @@ +namespace KInspector.Actions.StopRunningSites +{ + public static class Scripts + { + public static string BaseDirectory => $"{nameof(StopRunningSites)}/Scripts"; + + public static string GetSiteSummary => $"{BaseDirectory}/{nameof(GetSiteSummary)}.sql"; + + public static string StopSite => $"{BaseDirectory}/{nameof(StopSite)}.sql"; + } +} diff --git a/src/KInspector.Actions/StopRunningSites/Scripts/GetSiteSummary.sql b/src/KInspector.Actions/StopRunningSites/Scripts/GetSiteSummary.sql new file mode 100644 index 00000000..fcb0a014 --- /dev/null +++ b/src/KInspector.Actions/StopRunningSites/Scripts/GetSiteSummary.sql @@ -0,0 +1,3 @@ +SELECT SiteID AS 'ID', SiteDisplayName AS 'DisplayName', SiteDescription AS 'Description', SiteDomainName AS 'AdministrationDomain', SitePresentationUrl AS 'PresentationUrl', + CASE WHEN SiteStatus = 'RUNNING' THEN 1 ELSE 0 END AS 'Running' +FROM CMS_Site \ No newline at end of file diff --git a/src/KInspector.Actions/StopRunningSites/Scripts/StopSite.sql b/src/KInspector.Actions/StopRunningSites/Scripts/StopSite.sql new file mode 100644 index 00000000..d669e776 --- /dev/null +++ b/src/KInspector.Actions/StopRunningSites/Scripts/StopSite.sql @@ -0,0 +1 @@ +UPDATE CMS_Site SET SiteStatus = 'STOPPED' WHERE SiteID = @SiteID \ No newline at end of file diff --git a/src/KInspector.Blazor/App.razor b/src/KInspector.Blazor/App.razor new file mode 100644 index 00000000..d414dad2 --- /dev/null +++ b/src/KInspector.Blazor/App.razor @@ -0,0 +1,11 @@ + + + + + + Not found + +

Sorry, there's nothing at this address.

+
+
+
diff --git a/src/KInspector.Blazor/Components/Actions/ActionCard.razor b/src/KInspector.Blazor/Components/Actions/ActionCard.razor new file mode 100644 index 00000000..15f6d0d6 --- /dev/null +++ b/src/KInspector.Blazor/Components/Actions/ActionCard.razor @@ -0,0 +1,84 @@ +@using KInspector.Blazor.Services +@using KInspector.Core.Constants +@using KInspector.Core.Models +@using KInspector.Core.Modules +@using KInspector.Core.Services.Interfaces +@using Markdig +@using Newtonsoft.Json +@implements IDisposable +@inject IModuleService moduleService +@inject StateContainer stateContainer +@inject IModuleMetadataService moduleMetadataService + +
+ + +
+
    + + + +
+
+
+ + + +
+
+ + +@code { + [Parameter, EditorRequired] + public IAction? Action { get; set; } + + public ModuleResults Results { get; set; } = new(); + + private ActionOptionForm? Form { get; set; } + + private ModuleDetails ModuleDetails => moduleMetadataService.GetModuleDetails(Action!.Codename); + + private MarkupString LongDescription => new MarkupString(Markdown.ToHtml(ModuleDetails.LongDescription ?? string.Empty)); + + protected override void OnInitialized() => stateContainer.OnChange += StateHasChanged; + + public void Dispose() => stateContainer.OnChange -= StateHasChanged; + + private Task RunAction() + { + stateContainer.AddModule(Action!.Codename); + var options = Form!.Options; + return moduleService.ExecuteAction(Action!, JsonConvert.SerializeObject(options), results => + { + Results = results; + stateContainer.RemoveModule(Action!.Codename); + }); + } +} diff --git a/src/KInspector.Blazor/Components/Actions/ActionList.razor b/src/KInspector.Blazor/Components/Actions/ActionList.razor new file mode 100644 index 00000000..25d6dddf --- /dev/null +++ b/src/KInspector.Blazor/Components/Actions/ActionList.razor @@ -0,0 +1,53 @@ +@using KInspector.Core.Modules +@using KInspector.Core.Repositories.Interfaces +@using KInspector.Core.Services.Interfaces +@inject IJSRuntime js +@inject IModuleService moduleService +@inject IActionRepository actionRepository + + + +
+ @foreach (var action in Actions) + { + + } +
+ +@code { + ModuleFilters? Filters; + + private IEnumerable UsedTags + { + get + { + var actions = actionRepository.GetActions(); + var tags = Enumerable.Empty(); + foreach (var a in actions) + { + tags = tags.Union(a.Tags); + } + + return tags; + } + } + + private IEnumerable Actions + { + get + { + var tag = Filters?.SelectedTag; + var showUntested = Filters?.ShowUntested ?? false; + var showIncompatible = Filters?.ShowIncompatible ?? false; + var nameFilter = Filters?.NameFilter; + + return moduleService.GetActions(showUntested, showIncompatible, tag, nameFilter); + } + } + + protected override async Task OnAfterRenderAsync(bool isFirstRender) + { + // Init Flowbite every time, not just first load as elements added to the layout dynamically don't function without Flowbite + await js.InvokeVoidAsync("window.initializeFlowbite"); + } +} diff --git a/src/KInspector.Blazor/Components/Actions/ActionOptionForm.razor b/src/KInspector.Blazor/Components/Actions/ActionOptionForm.razor new file mode 100644 index 00000000..53129788 --- /dev/null +++ b/src/KInspector.Blazor/Components/Actions/ActionOptionForm.razor @@ -0,0 +1,45 @@ +@using System.Reflection +@using Newtonsoft.Json.Linq +@using System.ComponentModel + +
+ @foreach (var prop in OptionsType!.GetProperties()) + { + var displayName = GetDisplayName(prop) ?? prop.Name; + var description = GetDescription(prop); + +
+ + @if (!string.IsNullOrEmpty(description)) + { + @description + } + +
+ } +
+ +@code { + private JObject? options; + + [Parameter, EditorRequired] + public Type? OptionsType { get; set; } + + public JObject Options => options ??= new(); + + private void SetValue(string propName, object? value) + { + if (value is null) + { + return; + } + + Options[propName] = JToken.FromObject(value); + } + + private string? GetDisplayName(PropertyInfo property) => property.GetCustomAttribute()?.DisplayName; + + private string? GetDescription(PropertyInfo property) => property.GetCustomAttribute()?.Description; +} \ No newline at end of file diff --git a/src/KInspector.Blazor/Components/Instances/CurrentInstanceDropdown.razor b/src/KInspector.Blazor/Components/Instances/CurrentInstanceDropdown.razor new file mode 100644 index 00000000..525cbbbf --- /dev/null +++ b/src/KInspector.Blazor/Components/Instances/CurrentInstanceDropdown.razor @@ -0,0 +1,94 @@ +@using KInspector.Core.Helpers +@using KInspector.Core.Models +@using KInspector.Core.Services.Interfaces +@inject IInstanceService instanceService +@inject IConfigService configService +@inject NavigationManager navigationManager + +@if (Instance is null) +{ + +} +else +{ + + +} + +@code { + private InstanceDetails? instanceDetails; + private string serverVersion = "Loading..."; + private string sqlWorkstation = "Loading..."; + + [Parameter, EditorRequired] + public Instance? Instance { get; set; } + + private InstanceDetails InstanceDetails => instanceDetails ??= instanceService.GetInstanceDetails(Instance); + + private string DatabaseName => DatabaseHelper.GetSqlConnection(Instance!.DatabaseSettings).Database; + + private string ServerName => DatabaseHelper.GetSqlConnection(Instance!.DatabaseSettings).DataSource; + + protected async override Task OnInitializedAsync() + { + if (Instance is not null) + { + var conn = DatabaseHelper.GetSqlConnection(Instance!.DatabaseSettings); + await conn.OpenAsync(); + serverVersion = conn.ServerVersion; + sqlWorkstation = conn.WorkstationId; + await conn.DisposeAsync(); + } + } + + private void DisconnectInstance() + { + configService.SetCurrentInstance(null); + navigationManager.NavigateTo("/instances", true); + } +} \ No newline at end of file diff --git a/src/KInspector.Blazor/Components/Instances/InstanceRow.razor b/src/KInspector.Blazor/Components/Instances/InstanceRow.razor new file mode 100644 index 00000000..57bb7af4 --- /dev/null +++ b/src/KInspector.Blazor/Components/Instances/InstanceRow.razor @@ -0,0 +1,96 @@ +@using KInspector.Core.Models +@using KInspector.Core.Services.Interfaces +@inject IInstanceService instanceService +@inject IConfigService configService +@inject NavigationManager navigationManager + +@{ + var currentInstance = configService.GetCurrentInstance(); + var details = instanceService.GetInstanceDetails(Instance); +} + + + + @if (Instance!.Guid.Equals(currentInstance?.Guid)) + { + + } + else + { + + } +
+
@Instance!.Name
+ +
+ + + @details.AdministrationVersion + + + @details.AdministrationDatabaseVersion + + + @if (details.Sites.Any()) + { + @(details.Sites.Count()) + } + else + { + 0 + } + + + + + +@if (ShowSites) +{ + + + + + +} + +@code { + [Parameter, EditorRequired] + public Instance? Instance { get; set; } + + private bool ShowSites { get; set; } + + private void SetCurrentInstance() + { + configService.SetCurrentInstance(Instance!.Guid); + navigationManager.NavigateTo("/instances", true); + } + + private void DisconnectInstance() + { + configService.SetCurrentInstance(null); + navigationManager.NavigateTo("/instances", true); + } + + private void DeleteInstance() + { + configService.DeleteInstance(Instance!.Guid); + navigationManager.NavigateTo("/instances", true); + } +} diff --git a/src/KInspector.Blazor/Components/Instances/NewInstanceModal.razor b/src/KInspector.Blazor/Components/Instances/NewInstanceModal.razor new file mode 100644 index 00000000..8e6048c2 --- /dev/null +++ b/src/KInspector.Blazor/Components/Instances/NewInstanceModal.razor @@ -0,0 +1,156 @@ +@using System.ComponentModel.DataAnnotations +@using KInspector.Core.Services.Interfaces +@inject IConfigService configService +@inject ICmsFileService fileService +@inject NavigationManager navigationManager + +@{ + Model!.CMSConnectionString = fileService.GetCMSConnectionString(Model?.AdminPath); +} + + + +@code { + [SupplyParameterFromForm] + public NewInstance? Model { get; set; } + + protected override void OnInitialized() => Model ??= new(); + + private void Submit() + { + configService.UpsertInstance(new() + { + Guid = Guid.NewGuid(), + AdministrationPath = Model!.AdminPath, + AdministrationUrl = Model!.AdminUrl, + Name = Model!.Name, + DatabaseSettings = new() + { + Server = Model!.Server, + Database = Model!.Database, + IntegratedSecurity = Model!.IntegratedSecurity, + User = Model!.User, + Password = Model!.Password, + AdministrationConnectionString = Model!.CMSConnectionString + } + }); + + navigationManager.NavigateTo("/instances", true); + } + + public class NewInstance + { + [Required] + public string? Name { get; set; } + + [Required] + public string? AdminPath { get; set; } + + [Required] + public string? AdminUrl { get; set; } + + public string? Server { get; set; } + + public string? Database { get; set; } + + public bool IntegratedSecurity { get; set; } + + public string? User { get; set; } + + public string? Password { get; set; } + + public string? CMSConnectionString { get; set; } + } +} diff --git a/src/KInspector.Blazor/Components/Instances/SiteTable.razor b/src/KInspector.Blazor/Components/Instances/SiteTable.razor new file mode 100644 index 00000000..e9c45f14 --- /dev/null +++ b/src/KInspector.Blazor/Components/Instances/SiteTable.razor @@ -0,0 +1,52 @@ +@using KInspector.Core.Models + +
+ + + + + + + + + + + + @foreach (var site in Sites!) + { + + + + + + + + } + +
+ ID + + Name + + Administration + + Live site + + Status +
+ @site.Id + + @site.Name + + https://@(site.DomainName) + + @site.PresentationUrl + + @site.Status +
+
+ +@code { + [Parameter, EditorRequired] + public IEnumerable? Sites { get; set; } +} diff --git a/src/KInspector.Blazor/Components/MainLayout.razor b/src/KInspector.Blazor/Components/MainLayout.razor new file mode 100644 index 00000000..0bc7294d --- /dev/null +++ b/src/KInspector.Blazor/Components/MainLayout.razor @@ -0,0 +1,11 @@ +@inherits LayoutComponentBase + +KInspector + +
+ + +
+ @Body +
+
diff --git a/src/KInspector.Blazor/Components/Modules/ModuleFilters.razor b/src/KInspector.Blazor/Components/Modules/ModuleFilters.razor new file mode 100644 index 00000000..7eea3f10 --- /dev/null +++ b/src/KInspector.Blazor/Components/Modules/ModuleFilters.razor @@ -0,0 +1,98 @@ +
+ + +
+ +
+ +
+ +@code { + private string tag = string.Empty, nameFilter = string.Empty; + private bool showUntested, showIncompatible; + + [Parameter] + public Action? FiltersChanged { get; set; } + + [Parameter, EditorRequired] + public IEnumerable? Tags { get; set; } + + public string NameFilter + { + get + { + return nameFilter; + } + set + { + nameFilter = value; + FiltersChanged?.Invoke(); + } + } + + public string SelectedTag + { + get + { + return tag; + } + + set + { + tag = value; + FiltersChanged?.Invoke(); + } + } + + public bool ShowUntested + { + get + { + return showUntested; + } + + set + { + showUntested = value; + FiltersChanged?.Invoke(); + } + } + + public bool ShowIncompatible + { + get + { + return showIncompatible; + } + + set + { + showIncompatible = value; + FiltersChanged?.Invoke(); + } + } +} diff --git a/src/KInspector.Blazor/Components/Modules/ModuleHeader.razor b/src/KInspector.Blazor/Components/Modules/ModuleHeader.razor new file mode 100644 index 00000000..afc4a8fc --- /dev/null +++ b/src/KInspector.Blazor/Components/Modules/ModuleHeader.razor @@ -0,0 +1,95 @@ +@using KInspector.Blazor.Services +@using KInspector.Core.Models +@using KInspector.Core.Modules +@using KInspector.Core.Services.Interfaces +@using Markdig +@implements IDisposable +@inject IConfigService configService +@inject IInstanceService instanceService +@inject IModuleMetadataService moduleMetadataService +@inject StateContainer stateContainer + +
+ @if (IsRunning) + { +
+ + Loading... +
+ } + else + { + + } +
+

+ @Name +

+ @ShortDescription +
+
+ @foreach (var tag in Module!.Tags) + { + @tag + } + @if (IsIncompatible) + { + Incompatible + } + @if (IsUntested && !IsIncompatible) + { + Untested + } +
+
+ +@code { + private int adminDbVersion = 0; + + [Parameter, EditorRequired] + public IModule? Module { get; set; } + + [Parameter, EditorRequired] + public Func? Handler { get; set; } + + private ModuleDetails ModuleDetails => moduleMetadataService.GetModuleDetails(Module!.Codename); + + private MarkupString Name => new MarkupString(Markdown.ToHtml(ModuleDetails.Name ?? string.Empty)); + + private MarkupString ShortDescription => new MarkupString(Markdown.ToHtml(ModuleDetails.ShortDescription ?? string.Empty)); + + private bool IsIncompatible => Module!.IncompatibleVersions.Select(v => v.Major).Contains(AdminDatabaseMajorVersion); + + private bool IsUntested => !Module!.CompatibleVersions.Select(v => v.Major).Contains(AdminDatabaseMajorVersion); + + private bool IsRunning => stateContainer.Contains(Module!.Codename); + + private int AdminDatabaseMajorVersion + { + get + { + if (adminDbVersion == 0) + { + var currentInstance = configService.GetCurrentInstance(); + var instanceDetails = instanceService.GetInstanceDetails(currentInstance); + + adminDbVersion = instanceDetails?.AdministrationDatabaseVersion?.Major ?? 0; + } + + return adminDbVersion; + } + } + + protected override void OnInitialized() => stateContainer.OnChange += StateHasChanged; + + public void Dispose() => stateContainer.OnChange -= StateHasChanged; +} diff --git a/src/KInspector.Blazor/Components/Modules/ModuleResult.razor b/src/KInspector.Blazor/Components/Modules/ModuleResult.razor new file mode 100644 index 00000000..05d229b3 --- /dev/null +++ b/src/KInspector.Blazor/Components/Modules/ModuleResult.razor @@ -0,0 +1,41 @@ +@using KInspector.Core.Constants +@using KInspector.Core.Models + +@if (ShowNoResults) +{ + No results +} +else +{ + @switch (Results!.Type) + { + case ResultsType.TableList: + foreach (var table in Results!.TableResults) + { + if (!table.Rows.Any()) continue; + + + } + break; + case ResultsType.StringList: + if (Results!.StringResults.Any()) + { +
    + @foreach (var str in Results!.StringResults) + { +
  • @str
  • + } +
+ } + break; + } +} + +@code { + [Parameter, EditorRequired] + public ModuleResults? Results { get; set; } + + private bool ShowNoResults => Results!.Type == ResultsType.NoResults + || (Results!.Type == ResultsType.TableList && !Results!.TableResults.Any(t => t.Rows.Any())) + || (Results!.Type == ResultsType.StringList && !Results!.StringResults.Any()); +} diff --git a/src/KInspector.Blazor/Components/Modules/ResultStatus.razor b/src/KInspector.Blazor/Components/Modules/ResultStatus.razor new file mode 100644 index 00000000..e322391e --- /dev/null +++ b/src/KInspector.Blazor/Components/Modules/ResultStatus.razor @@ -0,0 +1,86 @@ +@using KInspector.Core.Constants +@using KInspector.Core.Models + +
+ @switch (Result!.Status) + { + case ResultsStatus.Good: + + break; + case ResultsStatus.Information: + + break; + case ResultsStatus.Warning: + + break; + case ResultsStatus.Error: + + break; + case ResultsStatus.NotRun: + + break; + } + + @if (Result.Status == ResultsStatus.NotRun) + { + Not run yet + } + else + { + @Result.Summary + } +
+ +@code { + [Parameter, EditorRequired] + public ModuleResults? Result { get; set; } + + private string TextColor + { + get + { + if (Result!.Status == ResultsStatus.NotRun) + { + return "text-gray-500 dark:text-gray-400"; + } + + return "text-gray-700"; + } + } + + private string BackgroundColor + { + get + { + switch (Result!.Status) + { + case ResultsStatus.Good: + return Constants.COLOR_GOOD; + case ResultsStatus.Error: + return Constants.COLOR_ERROR; + case ResultsStatus.Information: + return Constants.COLOR_INFO; + case ResultsStatus.Warning: + return Constants.COLOR_WARN; + default: + case ResultsStatus.NotRun: + return "bg-gray-100 dark:bg-gray-700"; + } + } + } +} diff --git a/src/KInspector.Blazor/Components/Modules/ResultTable.razor b/src/KInspector.Blazor/Components/Modules/ResultTable.razor new file mode 100644 index 00000000..274aa98b --- /dev/null +++ b/src/KInspector.Blazor/Components/Modules/ResultTable.razor @@ -0,0 +1,145 @@ +@using System.Reflection +@using KInspector.Core.Models + +
+
+
+
+
+
@Table!.Name
+
+
+
+
+ + + + @foreach (var header in Headers) + { + + } + + + + @foreach (var row in GetPagedObjects(currentPage)) + { + + @foreach (var value in GetRowValues(row)) + { + + } + + } + +
+ @header +
+ @if (value is null) + { + null + } + else + { + @value + } +
+ +
+ +@code { + private int currentPage = 0; + private readonly int PAGE_SIZE = 10; + + [Parameter, EditorRequired] + public TableResult? Table { get; set; } + + private IEnumerable Headers + { + get + { + var firstItem = Table!.Rows.FirstOrDefault(); + if (firstItem is null) + { + return Enumerable.Empty(); + } + + IEnumerable properties = firstItem.GetType().GetProperties(); + + return properties.Select(prop => prop.Name); + } + } + + private int NextPage => currentPage == PageCount - 1 ? currentPage : currentPage + 1; + + private int PreviousPage => currentPage == 0 ? 0 : currentPage - 1; + + private int CurrentPageStartingIndex => (currentPage * PAGE_SIZE) + 1; + + private int CurrentPageEndingIndex + { + get + { + var index = (currentPage * PAGE_SIZE) + PAGE_SIZE; + if (index > RowCount) + { + index = RowCount; + } + + return index; + } + } + + private int PageCount => Convert.ToInt32(Math.Ceiling(RowCount / Convert.ToDecimal(PAGE_SIZE))); + + private int RowCount => Table!.Rows.Count(); + + private void SetPage(int page) => currentPage = page; + + private IEnumerable GetPagedObjects(int page = 0) => + Table!.Rows.AsEnumerable() + .Skip(PAGE_SIZE * page) + .Take(PAGE_SIZE); + + private IEnumerable GetRowValues(dynamic row) + { + IEnumerable properties = row.GetType().GetProperties(); + + return properties.Select(prop => prop.GetValue(row)); + } +} diff --git a/src/KInspector.Blazor/Components/NavMenu.razor b/src/KInspector.Blazor/Components/NavMenu.razor new file mode 100644 index 00000000..ece6660b --- /dev/null +++ b/src/KInspector.Blazor/Components/NavMenu.razor @@ -0,0 +1,114 @@ +@using KInspector.Core.Models +@using KInspector.Core.Services.Interfaces +@using System.Reflection +@inject IConfigService configService +@inject IInstanceService instanceService + + + + + + + +@code { + private Instance? currentInstance; + + private Version? Version => typeof(Program).Assembly.GetName().Version; + + private Instance? CurrentInstance => currentInstance ??= configService.GetCurrentInstance(); + + private string DisabledLinkCss => CurrentInstance is null ? "pointer-events-none text-gray-400 dark:text-gray-400" : "text-gray-900 dark:text-white"; +} \ No newline at end of file diff --git a/src/KInspector.Blazor/Components/Reports/ReportCard.razor b/src/KInspector.Blazor/Components/Reports/ReportCard.razor new file mode 100644 index 00000000..015e33d7 --- /dev/null +++ b/src/KInspector.Blazor/Components/Reports/ReportCard.razor @@ -0,0 +1,70 @@ +@using KInspector.Blazor.Services +@using KInspector.Core.Constants +@using KInspector.Core.Models +@using KInspector.Core.Modules +@using KInspector.Core.Services.Interfaces +@using Markdig +@using Newtonsoft.Json +@implements IDisposable +@inject StateContainer stateContainer +@inject IModuleService moduleService +@inject IModuleMetadataService moduleMetadataService + +
+ + +
+
    + + +
+
+
+ + +
+
+ + +@code { + [Parameter, EditorRequired] + public IReport? Report { get; set; } + + public ModuleResults Results { get; set; } = new(); + + private ModuleDetails ModuleDetails => moduleMetadataService.GetModuleDetails(Report!.Codename); + + private MarkupString LongDescription => new MarkupString(Markdown.ToHtml(ModuleDetails.LongDescription ?? string.Empty)); + + protected override void OnInitialized() => stateContainer.OnChange += StateHasChanged; + + public void Dispose() => stateContainer.OnChange -= StateHasChanged; + + private Task RunReport() + { + stateContainer.AddModule(Report!.Codename); + return moduleService.GetReportResults(Report!, results => + { + Results = results; + stateContainer.RemoveModule(Report!.Codename); + }); + } +} diff --git a/src/KInspector.Blazor/Components/Reports/ReportList.razor b/src/KInspector.Blazor/Components/Reports/ReportList.razor new file mode 100644 index 00000000..c1292785 --- /dev/null +++ b/src/KInspector.Blazor/Components/Reports/ReportList.razor @@ -0,0 +1,53 @@ +@using KInspector.Core.Modules +@using KInspector.Core.Repositories.Interfaces +@using KInspector.Core.Services.Interfaces +@inject IJSRuntime js +@inject IModuleService moduleService +@inject IReportRepository reportRepository + + + +
+ @foreach (var report in Reports) + { + + } +
+ +@code { + ModuleFilters? Filters; + + private IEnumerable UsedTags + { + get + { + var reports = reportRepository.GetReports(); + var tags = Enumerable.Empty(); + foreach (var r in reports) + { + tags = tags.Union(r.Tags); + } + + return tags; + } + } + + private IEnumerable Reports + { + get + { + var tag = Filters?.SelectedTag; + var showUntested = Filters?.ShowUntested ?? false; + var showIncompatible = Filters?.ShowIncompatible ?? false; + var nameFilter = Filters?.NameFilter; + + return moduleService.GetReports(showUntested, showIncompatible, tag, nameFilter); + } + } + + protected override async Task OnAfterRenderAsync(bool isFirstRender) + { + // Init Flowbite every time, not just first load as elements added to the layout dynamically don't function without Flowbite + await js.InvokeVoidAsync("window.initializeFlowbite"); + } +} diff --git a/src/KInspector.Blazor/Constants.cs b/src/KInspector.Blazor/Constants.cs new file mode 100644 index 00000000..ac0e6124 --- /dev/null +++ b/src/KInspector.Blazor/Constants.cs @@ -0,0 +1,10 @@ +namespace KInspector.Blazor +{ + public static class Constants + { + public const string COLOR_GOOD = "bg-green-400"; + public const string COLOR_ERROR = "bg-red-400"; + public const string COLOR_INFO = "bg-blue-400"; + public const string COLOR_WARN = "bg-orange-400"; + } +} diff --git a/src/KInspector.Blazor/KInspector.Blazor.csproj b/src/KInspector.Blazor/KInspector.Blazor.csproj new file mode 100644 index 00000000..e85be00c --- /dev/null +++ b/src/KInspector.Blazor/KInspector.Blazor.csproj @@ -0,0 +1,17 @@ + + + KInspector.Blazor + net8.0 + + + + + + + + + + + + + diff --git a/src/KInspector.Blazor/Pages/Actions.razor b/src/KInspector.Blazor/Pages/Actions.razor new file mode 100644 index 00000000..ee12d236 --- /dev/null +++ b/src/KInspector.Blazor/Pages/Actions.razor @@ -0,0 +1,26 @@ +@page "/actions" + +Actions + +

Actions

+ + + + diff --git a/src/KInspector.Blazor/Pages/Instances.razor b/src/KInspector.Blazor/Pages/Instances.razor new file mode 100644 index 00000000..23728c3a --- /dev/null +++ b/src/KInspector.Blazor/Pages/Instances.razor @@ -0,0 +1,66 @@ +@page "/" +@page "/instances" +@using KInspector.Core.Models +@using KInspector.Core.Services.Interfaces +@inject IConfigService configService +@inject IJSRuntime js + +Instances + +@{ + var instances = configService.GetConfig().Instances; +} + +

Instances

+ + + +@if (instances.Any()) +{ +
+ + + + + + + + + + + + @foreach (var instance in instances) + { + + } + +
+ Name + + DLL Version + + Database Version + + # of Sites +
+
+} + + + +@code { + protected override async Task OnAfterRenderAsync(bool isFirstRender) + { + if (isFirstRender) + { + await js.InvokeVoidAsync("window.initializeFlowbite"); + } + } +} diff --git a/src/KInspector.Blazor/Pages/Reports.razor b/src/KInspector.Blazor/Pages/Reports.razor new file mode 100644 index 00000000..4b72645c --- /dev/null +++ b/src/KInspector.Blazor/Pages/Reports.razor @@ -0,0 +1,7 @@ +@page "/reports" + +Reports + +

Reports

+ + diff --git a/src/KInspector.Blazor/Pages/_Host.cshtml b/src/KInspector.Blazor/Pages/_Host.cshtml new file mode 100644 index 00000000..a59a7b34 --- /dev/null +++ b/src/KInspector.Blazor/Pages/_Host.cshtml @@ -0,0 +1,36 @@ +@page "/" +@using KInspector.Blazor +@using Microsoft.AspNetCore.Components.Web +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/KInspector.Blazor/Program.cs b/src/KInspector.Blazor/Program.cs new file mode 100644 index 00000000..b89b4e5b --- /dev/null +++ b/src/KInspector.Blazor/Program.cs @@ -0,0 +1,43 @@ +using Autofac; +using Autofac.Extensions.DependencyInjection; + +using KInspector.Blazor.Services; +using KInspector.Core; +using KInspector.Infrastructure; +using KInspector.Reports; + +using System.Text.Json.Serialization; + +var builder = WebApplication.CreateBuilder(args); +builder.Host + .UseServiceProviderFactory(new AutofacServiceProviderFactory()) + .ConfigureContainer((containerBuilder) => + { + containerBuilder.RegisterModule(); + containerBuilder.RegisterModule(); + containerBuilder.RegisterModule(); + containerBuilder.RegisterModule(); + }); + +builder.Services.AddScoped(); + +builder.Services.AddRazorPages().AddJsonOptions(o => +{ + o.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; +}); +builder.Services.AddServerSideBlazor(); + +var app = builder.Build(); +if (!app.Environment.IsDevelopment()) +{ + app.UseHsts(); +} + +app.UseDeveloperExceptionPage(); +app.UseHttpsRedirection(); +app.UseStaticFiles(); +app.UseRouting(); +app.MapBlazorHub(); +app.MapFallbackToPage("/_Host"); + +app.Run(); diff --git a/KenticoInspector.WebApplication/Properties/launchSettings.json b/src/KInspector.Blazor/Properties/launchSettings.json similarity index 51% rename from KenticoInspector.WebApplication/Properties/launchSettings.json rename to src/KInspector.Blazor/Properties/launchSettings.json index 3299c888..217984c5 100644 --- a/KenticoInspector.WebApplication/Properties/launchSettings.json +++ b/src/KInspector.Blazor/Properties/launchSettings.json @@ -1,35 +1,37 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", +{ "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, + "windowsAuthentication": false, + "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:54494" + "applicationUrl": "http://localhost:14299", + "sslPort": 44365 } }, "profiles": { - "IIS Express": { - "commandName": "IISExpress", + "http": { + "commandName": "Project", + "dotnetRunMessages": true, "launchBrowser": true, + "applicationUrl": "http://localhost:5225", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, - "Console": { + "https": { "commandName": "Project", + "dotnetRunMessages": true, "launchBrowser": true, - "applicationUrl": "http://localhost:5000", + "applicationUrl": "https://localhost:7282;http://localhost:5225", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, - "UI Development": { + "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development", - "ASPNETCORE_USE_EXTERNAL_CLIENT": "true" + "ASPNETCORE_ENVIRONMENT": "Development" } } } -} \ No newline at end of file +} diff --git a/src/KInspector.Blazor/Services/StateContainer.cs b/src/KInspector.Blazor/Services/StateContainer.cs new file mode 100644 index 00000000..f8fbc74e --- /dev/null +++ b/src/KInspector.Blazor/Services/StateContainer.cs @@ -0,0 +1,34 @@ +namespace KInspector.Blazor.Services +{ + /// + /// Stores data to be accessed by Blazor components and allows components to react to data modification. + /// + public class StateContainer + { + private readonly List runningModules = new(); + + public event Action? OnChange; + + private void NotifyStateChanged() => OnChange?.Invoke(); + + /// + /// Adds a module to the list of running modules. + /// + public void AddModule(string codename) + { + runningModules.Add(codename); + NotifyStateChanged(); + } + + /// + /// Removes a module from the list of running modules. + /// + public void RemoveModule(string codename) + { + runningModules.Remove(codename); + NotifyStateChanged(); + } + + public bool Contains(string codename) => runningModules.Contains(codename); + } +} diff --git a/src/KInspector.Blazor/_Imports.razor b/src/KInspector.Blazor/_Imports.razor new file mode 100644 index 00000000..0f7b52ec --- /dev/null +++ b/src/KInspector.Blazor/_Imports.razor @@ -0,0 +1,15 @@ +@using System.Net.Http +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using KInspector.Blazor +@using KInspector.Blazor.Components +@using KInspector.Blazor.Components.Modules +@using KInspector.Blazor.Components.Reports +@using KInspector.Blazor.Components.Actions +@using KInspector.Blazor.Components.Instances +@using KInspector.Blazor.Pages diff --git a/src/KInspector.Blazor/appsettings.Development.json b/src/KInspector.Blazor/appsettings.Development.json new file mode 100644 index 00000000..770d3e93 --- /dev/null +++ b/src/KInspector.Blazor/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "DetailedErrors": true, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/src/KInspector.Blazor/appsettings.json b/src/KInspector.Blazor/appsettings.json new file mode 100644 index 00000000..10f68b8c --- /dev/null +++ b/src/KInspector.Blazor/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/src/KInspector.Blazor/package-lock.json b/src/KInspector.Blazor/package-lock.json new file mode 100644 index 00000000..ed911d0e --- /dev/null +++ b/src/KInspector.Blazor/package-lock.json @@ -0,0 +1,1999 @@ +{ + "name": "KInspector.Blazor", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "flowbite": "^2.3.0" + }, + "devDependencies": { + "autoprefixer": "^10.4.19", + "postcss": "^8.4.38", + "postcss-cli": "^11.0.0", + "tailwindcss": "^3.4.3" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": 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, + "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, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "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, + "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, + "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, + "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, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "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, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001614", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz", + "integrity": "sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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, + "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/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/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, + "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 + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "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, + "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, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.751", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.751.tgz", + "integrity": "sha512-2DEPi++qa89SMGRhufWTiLmzqyuGmNF3SK4+PQetW1JKiZdEpF4XQonJXJCzyuYSA6mauiMhbyVhqYAP45Hvfw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flowbite": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/flowbite/-/flowbite-2.3.0.tgz", + "integrity": "sha512-pm3JRo8OIJHGfFYWgaGpPv8E+UdWy0Z3gEAGufw+G/1dusaU/P1zoBLiQpf2/+bYAi+GBQtPVG86KYlV0W+AFQ==", + "dependencies": { + "@popperjs/core": "^2.9.3", + "mini-svg-data-uri": "^1.4.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "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, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "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, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", + "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "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, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-cli": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.0.tgz", + "integrity": "sha512-xMITAI7M0u1yolVcXJ9XTZiO9aO49mcoKQy6pCDFdMh9kGqhzLVpWxeD/32M/QBmkhcGypZFFOLNLmIW4Pg4RA==", + "dev": true, + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^11.0.0", + "get-stdin": "^9.0.0", + "globby": "^14.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^5.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.0.3.tgz", + "integrity": "sha512-90pBBI5apUVruIEdCxZic93Wm+i9fTrp7TXbgdUCH+/L+2WnfpITSpq5dFU/IPvbv7aNiMlQISpUkAm3fEcvgQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-reporter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/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, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.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==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/src/KInspector.Blazor/package.json b/src/KInspector.Blazor/package.json new file mode 100644 index 00000000..0b70616b --- /dev/null +++ b/src/KInspector.Blazor/package.json @@ -0,0 +1,14 @@ +{ + "scripts": { + "css": "npx tailwindcss -i wwwroot/css/app.css -o wwwroot/css/app.min.css" + }, + "dependencies": { + "flowbite": "^2.3.0" + }, + "devDependencies": { + "autoprefixer": "^10.4.19", + "postcss": "^8.4.38", + "postcss-cli": "^11.0.0", + "tailwindcss": "^3.4.3" + } +} diff --git a/src/KInspector.Blazor/postcss.config.js b/src/KInspector.Blazor/postcss.config.js new file mode 100644 index 00000000..ca0c0cda --- /dev/null +++ b/src/KInspector.Blazor/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + } +} \ No newline at end of file diff --git a/src/KInspector.Blazor/tailwind.config.js b/src/KInspector.Blazor/tailwind.config.js new file mode 100644 index 00000000..032d1351 --- /dev/null +++ b/src/KInspector.Blazor/tailwind.config.js @@ -0,0 +1,66 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./**/*.{razor,html,cshtml}", + "./node_modules/flowbite/**/*.js" + ], + plugins: [ + require('flowbite/plugin') + ], + darkMode: 'class', + theme: { + extend: { + colors: { + primary: { + "50": "#eff6ff", + "100": "#dbeafe", + "200": "#bfdbfe", + "300": "#93c5fd", + "400": "#60a5fa", + "500": "#3b82f6", + "600": "#2563eb", + "700": "#1d4ed8", + "800": "#1e40af", + "900": "#1e3a8a", + "950": "#172554" + } + } + }, + fontFamily: { + 'body': [ + 'Inter', + 'ui-sans-serif', + 'system-ui', + '-apple-system', + 'system-ui', + 'Segoe UI', + 'Roboto', + 'Helvetica Neue', + 'Arial', + 'Noto Sans', + 'sans-serif', + 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Segoe UI Symbol', + 'Noto Color Emoji' + ], + 'sans': [ + 'Inter', + 'ui-sans-serif', + 'system-ui', + '-apple-system', + 'system-ui', + 'Segoe UI', + 'Roboto', + 'Helvetica Neue', + 'Arial', + 'Noto Sans', + 'sans-serif', + 'Apple Color Emoji', + 'Segoe UI Emoji', + 'Segoe UI Symbol', + 'Noto Color Emoji' + ] + } + }, +} \ No newline at end of file diff --git a/src/KInspector.Blazor/wwwroot/css/app.css b/src/KInspector.Blazor/wwwroot/css/app.css new file mode 100644 index 00000000..a016cae1 --- /dev/null +++ b/src/KInspector.Blazor/wwwroot/css/app.css @@ -0,0 +1,27 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +.navigation .instance-dropdown { + width: 350px; +} + +.navigation .instance-dropdown ul, +.module-card .module-description ul, +.module-card .module-results ul { + list-style-type: disc; + list-style-position: inside; + margin-left: .5em; +} + +.module-card .module-results .result-table .pagination ul { + list-style-type: none; +} + +.module-card .module-description p { + padding: .5em; +} + +.module-card .module-description a { + text-decoration: underline; +} diff --git a/src/KInspector.Blazor/wwwroot/css/app.min.css b/src/KInspector.Blazor/wwwroot/css/app.min.css new file mode 100644 index 00000000..fd482f93 --- /dev/null +++ b/src/KInspector.Blazor/wwwroot/css/app.min.css @@ -0,0 +1,2777 @@ +/* +! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #E5E7EB; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: Inter, ui-sans-serif, system-ui, -apple-system, system-ui, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + letter-spacing: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9CA3AF; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9CA3AF; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +.tooltip-arrow,.tooltip-arrow:before { + position: absolute; + width: 8px; + height: 8px; + background: inherit; +} + +.tooltip-arrow { + visibility: hidden; +} + +.tooltip-arrow:before { + content: ""; + visibility: visible; + transform: rotate(45deg); +} + +[data-tooltip-style^='light'] + .tooltip > .tooltip-arrow:before { + border-style: solid; + border-color: #e5e7eb; +} + +[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='top'] > .tooltip-arrow:before { + border-bottom-width: 1px; + border-right-width: 1px; +} + +[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='right'] > .tooltip-arrow:before { + border-bottom-width: 1px; + border-left-width: 1px; +} + +[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='bottom'] > .tooltip-arrow:before { + border-top-width: 1px; + border-left-width: 1px; +} + +[data-tooltip-style^='light'] + .tooltip[data-popper-placement^='left'] > .tooltip-arrow:before { + border-top-width: 1px; + border-right-width: 1px; +} + +.tooltip[data-popper-placement^='top'] > .tooltip-arrow { + bottom: -4px; +} + +.tooltip[data-popper-placement^='bottom'] > .tooltip-arrow { + top: -4px; +} + +.tooltip[data-popper-placement^='left'] > .tooltip-arrow { + right: -4px; +} + +.tooltip[data-popper-placement^='right'] > .tooltip-arrow { + left: -4px; +} + +.tooltip.invisible > .tooltip-arrow:before { + visibility: hidden; +} + +[data-popper-arrow],[data-popper-arrow]:before { + position: absolute; + width: 8px; + height: 8px; + background: inherit; +} + +[data-popper-arrow] { + visibility: hidden; +} + +[data-popper-arrow]:before { + content: ""; + visibility: visible; + transform: rotate(45deg); +} + +[data-popper-arrow]:after { + content: ""; + visibility: visible; + transform: rotate(45deg); + position: absolute; + width: 9px; + height: 9px; + background: inherit; +} + +[role="tooltip"] > [data-popper-arrow]:before { + border-style: solid; + border-color: #e5e7eb; +} + +.dark [role="tooltip"] > [data-popper-arrow]:before { + border-style: solid; + border-color: #4b5563; +} + +[role="tooltip"] > [data-popper-arrow]:after { + border-style: solid; + border-color: #e5e7eb; +} + +.dark [role="tooltip"] > [data-popper-arrow]:after { + border-style: solid; + border-color: #4b5563; +} + +[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:before { + border-bottom-width: 1px; + border-right-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:after { + border-bottom-width: 1px; + border-right-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:before { + border-bottom-width: 1px; + border-left-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:after { + border-bottom-width: 1px; + border-left-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:before { + border-top-width: 1px; + border-left-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:after { + border-top-width: 1px; + border-left-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:before { + border-top-width: 1px; + border-right-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:after { + border-top-width: 1px; + border-right-width: 1px; +} + +[data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow] { + bottom: -5px; +} + +[data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow] { + top: -5px; +} + +[data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow] { + right: -5px; +} + +[data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow] { + left: -5px; +} + +[role="tooltip"].invisible > [data-popper-arrow]:before { + visibility: hidden; +} + +[role="tooltip"].invisible > [data-popper-arrow]:after { + visibility: hidden; +} + +[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #6B7280; + border-width: 1px; + border-radius: 0px; + padding-top: 0.5rem; + padding-right: 0.75rem; + padding-bottom: 0.5rem; + padding-left: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; + --tw-shadow: 0 0 #0000; +} + +[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #1C64F2; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + border-color: #1C64F2; +} + +input::-moz-placeholder, textarea::-moz-placeholder { + color: #6B7280; + opacity: 1; +} + +input::placeholder,textarea::placeholder { + color: #6B7280; + opacity: 1; +} + +::-webkit-datetime-edit-fields-wrapper { + padding: 0; +} + +::-webkit-date-and-time-value { + min-height: 1.5em; +} + +select:not([size]) { + background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 10 6'%3e %3cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 1 4 4 4-4'/%3e %3c/svg%3e"); + background-position: right 0.75rem center; + background-repeat: no-repeat; + background-size: 0.75em 0.75em; + padding-right: 2.5rem; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} + +:is([dir=rtl]) select:not([size]) { + background-position: left 0.75rem center; + padding-right: 0.75rem; + padding-left: 0; +} + +[multiple] { + background-image: initial; + background-position: initial; + background-repeat: unset; + background-size: initial; + padding-right: 0.75rem; + -webkit-print-color-adjust: unset; + print-color-adjust: unset; +} + +[type='checkbox'],[type='radio'] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + padding: 0; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + display: inline-block; + vertical-align: middle; + background-origin: border-box; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + flex-shrink: 0; + height: 1rem; + width: 1rem; + color: #1C64F2; + background-color: #fff; + border-color: #6B7280; + border-width: 1px; + --tw-shadow: 0 0 #0000; +} + +[type='checkbox'] { + border-radius: 0px; +} + +[type='radio'] { + border-radius: 100%; +} + +[type='checkbox']:focus,[type='radio']:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 2px; + --tw-ring-offset-color: #fff; + --tw-ring-color: #1C64F2; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); +} + +[type='checkbox']:checked,[type='radio']:checked,.dark [type='checkbox']:checked,.dark [type='radio']:checked { + border-color: transparent; + background-color: currentColor; + background-size: 0.55em 0.55em; + background-position: center; + background-repeat: no-repeat; +} + +[type='checkbox']:checked { + background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M1 5.917 5.724 10.5 15 1.5'/%3e %3c/svg%3e"); + background-repeat: no-repeat; + background-size: 0.55em 0.55em; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} + +[type='radio']:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); + background-size: 1em 1em; +} + +.dark [type='radio']:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); + background-size: 1em 1em; +} + +[type='checkbox']:indeterminate { + background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M0.5 6h14'/%3e %3c/svg%3e"); + background-color: currentColor; + border-color: transparent; + background-position: center; + background-repeat: no-repeat; + background-size: 0.55em 0.55em; + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} + +[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus { + border-color: transparent; + background-color: currentColor; +} + +[type='file'] { + background: unset; + border-color: inherit; + border-width: 0; + border-radius: 0; + padding: 0; + font-size: unset; + line-height: inherit; +} + +[type='file']:focus { + outline: 1px auto inherit; +} + +input[type=file]::file-selector-button { + color: white; + background: #1F2937; + border: 0; + font-weight: 500; + font-size: 0.875rem; + cursor: pointer; + padding-top: 0.625rem; + padding-bottom: 0.625rem; + padding-left: 2rem; + padding-right: 1rem; + margin-inline-start: -1rem; + margin-inline-end: 1rem; +} + +input[type=file]::file-selector-button:hover { + background: #374151; +} + +:is([dir=rtl]) input[type=file]::file-selector-button { + padding-right: 2rem; + padding-left: 1rem; +} + +.dark input[type=file]::file-selector-button { + color: white; + background: #4B5563; +} + +.dark input[type=file]::file-selector-button:hover { + background: #6B7280; +} + +input[type="range"]::-webkit-slider-thumb { + height: 1.25rem; + width: 1.25rem; + background: #1C64F2; + border-radius: 9999px; + border: 0; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + cursor: pointer; +} + +input[type="range"]:disabled::-webkit-slider-thumb { + background: #9CA3AF; +} + +.dark input[type="range"]:disabled::-webkit-slider-thumb { + background: #6B7280; +} + +input[type="range"]:focus::-webkit-slider-thumb { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + --tw-ring-opacity: 1px; + --tw-ring-color: rgb(164 202 254 / var(--tw-ring-opacity)); +} + +input[type="range"]::-moz-range-thumb { + height: 1.25rem; + width: 1.25rem; + background: #1C64F2; + border-radius: 9999px; + border: 0; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + cursor: pointer; +} + +input[type="range"]:disabled::-moz-range-thumb { + background: #9CA3AF; +} + +.dark input[type="range"]:disabled::-moz-range-thumb { + background: #6B7280; +} + +input[type="range"]::-moz-range-progress { + background: #3F83F8; +} + +input[type="range"]::-ms-fill-lower { + background: #3F83F8; +} + +.toggle-bg:after { + content: ""; + position: absolute; + top: 0.125rem; + left: 0.125rem; + background: white; + border-color: #D1D5DB; + border-width: 1px; + border-radius: 9999px; + height: 1.25rem; + width: 1.25rem; + transition-property: background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter; + transition-duration: .15s; + box-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); +} + +input:checked + .toggle-bg:after { + transform: translateX(100%);; + border-color: white; +} + +input:checked + .toggle-bg { + background: #1C64F2; + border-color: #1C64F2; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(63 131 248 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(63 131 248 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.pointer-events-none { + pointer-events: none; +} + +.visible { + visibility: visible; +} + +.invisible { + visibility: hidden; +} + +.collapse { + visibility: collapse; +} + +.static { + position: static; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.inset-0 { + inset: 0px; +} + +.bottom-0 { + bottom: 0px; +} + +.bottom-\[60px\] { + bottom: 60px; +} + +.left-0 { + left: 0px; +} + +.right-0 { + right: 0px; +} + +.top-0 { + top: 0px; +} + +.z-10 { + z-index: 10; +} + +.z-20 { + z-index: 20; +} + +.z-30 { + z-index: 30; +} + +.z-40 { + z-index: 40; +} + +.z-50 { + z-index: 50; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.-mb-px { + margin-bottom: -1px; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-5 { + margin-bottom: 1.25rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.me-2 { + margin-inline-end: 0.5rem; +} + +.me-4 { + margin-inline-end: 1rem; +} + +.ml-3 { + margin-left: 0.75rem; +} + +.mr-3 { + margin-right: 0.75rem; +} + +.ms-0 { + margin-inline-start: 0px; +} + +.ms-2 { + margin-inline-start: 0.5rem; +} + +.ms-3 { + margin-inline-start: 0.75rem; +} + +.ms-auto { + margin-inline-start: auto; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.inline { + display: inline; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.\!table { + display: table !important; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.hidden { + display: none; +} + +.h-3 { + height: 0.75rem; +} + +.h-4 { + height: 1rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-8 { + height: 2rem; +} + +.h-9 { + height: 2.25rem; +} + +.h-\[calc\(100\%-1rem\)\] { + height: calc(100% - 1rem); +} + +.h-auto { + height: auto; +} + +.h-full { + height: 100%; +} + +.h-screen { + height: 100vh; +} + +.max-h-full { + max-height: 100%; +} + +.w-1\/2 { + width: 50%; +} + +.w-11 { + width: 2.75rem; +} + +.w-2\/3 { + width: 66.666667%; +} + +.w-3 { + width: 0.75rem; +} + +.w-4 { + width: 1rem; +} + +.w-5 { + width: 1.25rem; +} + +.w-6 { + width: 1.5rem; +} + +.w-64 { + width: 16rem; +} + +.w-8 { + width: 2rem; +} + +.w-full { + width: 100%; +} + +.max-w-2xl { + max-width: 42rem; +} + +.max-w-sm { + max-width: 24rem; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-shrink { + flex-shrink: 1; +} + +.flex-shrink-0 { + flex-shrink: 0; +} + +.grow { + flex-grow: 1; +} + +.-translate-x-full { + --tw-translate-x: -100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-y-full { + --tw-translate-y: -100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-0 { + --tw-translate-x: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-full { + --tw-translate-x: 100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-full { + --tw-translate-y: 100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-180 { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform-none { + transform: none; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +.animate-spin { + animation: spin 1s linear infinite; +} + +.cursor-default { + cursor: default; +} + +.cursor-not-allowed { + cursor: not-allowed; +} + +.cursor-pointer { + cursor: pointer; +} + +.resize { + resize: both; +} + +.grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.grid-cols-7 { + grid-template-columns: repeat(7, minmax(0, 1fr)); +} + +.flex-row { + flex-direction: row; +} + +.flex-col { + flex-direction: column; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.items-start { + align-items: flex-start; +} + +.items-end { + align-items: flex-end; +} + +.items-center { + align-items: center; +} + +.justify-start { + justify-content: flex-start; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-4 { + gap: 1rem; +} + +.-space-x-px > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(-1px * var(--tw-space-x-reverse)); + margin-left: calc(-1px * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-y-8 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(2rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(2rem * var(--tw-space-y-reverse)); +} + +.divide-y > :not([hidden]) ~ :not([hidden]) { + --tw-divide-y-reverse: 0; + border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); +} + +.divide-gray-100 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-divide-opacity)); +} + +.self-center { + align-self: center; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.overflow-y-auto { + overflow-y: auto; +} + +.overflow-x-hidden { + overflow-x: hidden; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-b { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} + +.rounded-e-lg { + border-start-end-radius: 0.5rem; + border-end-end-radius: 0.5rem; +} + +.rounded-l-lg { + border-top-left-radius: 0.5rem; + border-bottom-left-radius: 0.5rem; +} + +.rounded-r-lg { + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; +} + +.rounded-s-lg { + border-start-start-radius: 0.5rem; + border-end-start-radius: 0.5rem; +} + +.rounded-t { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} + +.rounded-t-lg { + border-top-left-radius: 0.5rem; + border-top-right-radius: 0.5rem; +} + +.border { + border-width: 1px; +} + +.border-0 { + border-width: 0px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-b-2 { + border-bottom-width: 2px; +} + +.border-r { + border-right-width: 1px; +} + +.border-t { + border-top-width: 1px; +} + +.\!border-primary-700 { + --tw-border-opacity: 1 !important; + border-color: rgb(29 78 216 / var(--tw-border-opacity)) !important; +} + +.border-blue-300 { + --tw-border-opacity: 1; + border-color: rgb(164 202 254 / var(--tw-border-opacity)); +} + +.border-blue-600 { + --tw-border-opacity: 1; + border-color: rgb(28 100 242 / var(--tw-border-opacity)); +} + +.border-blue-700 { + --tw-border-opacity: 1; + border-color: rgb(26 86 219 / var(--tw-border-opacity)); +} + +.border-blue-800 { + --tw-border-opacity: 1; + border-color: rgb(30 66 159 / var(--tw-border-opacity)); +} + +.border-gray-100 { + --tw-border-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-border-opacity)); +} + +.border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity)); +} + +.border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.border-gray-400 { + --tw-border-opacity: 1; + border-color: rgb(156 163 175 / var(--tw-border-opacity)); +} + +.border-green-700 { + --tw-border-opacity: 1; + border-color: rgb(4 108 78 / var(--tw-border-opacity)); +} + +.border-red-400 { + --tw-border-opacity: 1; + border-color: rgb(249 128 128 / var(--tw-border-opacity)); +} + +.border-red-700 { + --tw-border-opacity: 1; + border-color: rgb(200 30 30 / var(--tw-border-opacity)); +} + +.border-yellow-300 { + --tw-border-opacity: 1; + border-color: rgb(250 202 21 / var(--tw-border-opacity)); +} + +.\!bg-primary-600 { + --tw-bg-opacity: 1 !important; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)) !important; +} + +.\!bg-primary-700 { + --tw-bg-opacity: 1 !important; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)) !important; +} + +.bg-blue-400 { + --tw-bg-opacity: 1; + background-color: rgb(118 169 250 / var(--tw-bg-opacity)); +} + +.bg-blue-50 { + --tw-bg-opacity: 1; + background-color: rgb(235 245 255 / var(--tw-bg-opacity)); +} + +.bg-blue-700 { + --tw-bg-opacity: 1; + background-color: rgb(26 86 219 / var(--tw-bg-opacity)); +} + +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.bg-gray-50 { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); +} + +.bg-gray-800 { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); +} + +.bg-gray-900\/50 { + background-color: rgb(17 24 39 / 0.5); +} + +.bg-green-400 { + --tw-bg-opacity: 1; + background-color: rgb(49 196 141 / var(--tw-bg-opacity)); +} + +.bg-orange-400 { + --tw-bg-opacity: 1; + background-color: rgb(255 138 76 / var(--tw-bg-opacity)); +} + +.bg-red-100 { + --tw-bg-opacity: 1; + background-color: rgb(253 232 232 / var(--tw-bg-opacity)); +} + +.bg-red-400 { + --tw-bg-opacity: 1; + background-color: rgb(249 128 128 / var(--tw-bg-opacity)); +} + +.bg-red-700 { + --tw-bg-opacity: 1; + background-color: rgb(200 30 30 / var(--tw-bg-opacity)); +} + +.bg-transparent { + background-color: transparent; +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-white\/50 { + background-color: rgb(255 255 255 / 0.5); +} + +.bg-yellow-100 { + --tw-bg-opacity: 1; + background-color: rgb(253 246 178 / var(--tw-bg-opacity)); +} + +.fill-yellow-400 { + fill: #E3A008; +} + +.p-1 { + padding: 0.25rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-2\.5 { + padding: 0.625rem; +} + +.p-4 { + padding: 1rem; +} + +.p-6 { + padding: 1.5rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.px-2\.5 { + padding-left: 0.625rem; + padding-right: 0.625rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.py-0 { + padding-top: 0px; + padding-bottom: 0px; +} + +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-1\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-2\.5 { + padding-top: 0.625rem; + padding-bottom: 0.625rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-5 { + padding-top: 1.25rem; + padding-bottom: 1.25rem; +} + +.pl-12 { + padding-left: 3rem; +} + +.pl-14 { + padding-left: 3.5rem; +} + +.pl-2 { + padding-left: 0.5rem; +} + +.pl-4 { + padding-left: 1rem; +} + +.pr-6 { + padding-right: 1.5rem; +} + +.ps-3 { + padding-inline-start: 0.75rem; +} + +.pt-14 { + padding-top: 3.5rem; +} + +.pt-2 { + padding-top: 0.5rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.font-extrabold { + font-weight: 800; +} + +.font-light { + font-weight: 300; +} + +.font-medium { + font-weight: 500; +} + +.font-normal { + font-weight: 400; +} + +.font-semibold { + font-weight: 600; +} + +.uppercase { + text-transform: uppercase; +} + +.leading-6 { + line-height: 1.5rem; +} + +.leading-9 { + line-height: 2.25rem; +} + +.leading-none { + line-height: 1; +} + +.leading-tight { + line-height: 1.25; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(28 100 242 / var(--tw-text-opacity)); +} + +.text-blue-700 { + --tw-text-opacity: 1; + color: rgb(26 86 219 / var(--tw-text-opacity)); +} + +.text-blue-800 { + --tw-text-opacity: 1; + color: rgb(30 66 159 / var(--tw-text-opacity)); +} + +.text-gray-200 { + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity)); +} + +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} + +.text-gray-900 { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.text-green-700 { + --tw-text-opacity: 1; + color: rgb(4 108 78 / var(--tw-text-opacity)); +} + +.text-red-500 { + --tw-text-opacity: 1; + color: rgb(240 82 82 / var(--tw-text-opacity)); +} + +.text-red-700 { + --tw-text-opacity: 1; + color: rgb(200 30 30 / var(--tw-text-opacity)); +} + +.text-red-800 { + --tw-text-opacity: 1; + color: rgb(155 28 28 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-yellow-800 { + --tw-text-opacity: 1; + color: rgb(114 59 19 / var(--tw-text-opacity)); +} + +.underline { + text-decoration-line: underline; +} + +.antialiased { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.opacity-0 { + opacity: 0; +} + +.opacity-100 { + opacity: 1; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.outline { + outline-style: solid; +} + +.blur { + --tw-blur: blur(8px); + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-opacity { + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.ease-out { + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} + +.navigation .instance-dropdown { + width: 350px; +} + +.navigation .instance-dropdown ul, +.module-card .module-description ul, +.module-card .module-results ul { + list-style-type: disc; + list-style-position: inside; + margin-left: .5em; +} + +.module-card .module-results .result-table .pagination ul { + list-style-type: none; +} + +.module-card .module-description p { + padding: .5em; +} + +.module-card .module-description a { + text-decoration: underline; +} + +.after\:absolute::after { + content: var(--tw-content); + position: absolute; +} + +.after\:start-\[2px\]::after { + content: var(--tw-content); + inset-inline-start: 2px; +} + +.after\:top-\[2px\]::after { + content: var(--tw-content); + top: 2px; +} + +.after\:h-5::after { + content: var(--tw-content); + height: 1.25rem; +} + +.after\:w-5::after { + content: var(--tw-content); + width: 1.25rem; +} + +.after\:rounded-full::after { + content: var(--tw-content); + border-radius: 9999px; +} + +.after\:border::after { + content: var(--tw-content); + border-width: 1px; +} + +.after\:border-gray-300::after { + content: var(--tw-content); + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.after\:bg-white::after { + content: var(--tw-content); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.after\:transition-all::after { + content: var(--tw-content); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.after\:content-\[\'\'\]::after { + --tw-content: ''; + content: var(--tw-content); +} + +.hover\:border-gray-300:hover { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.hover\:\!bg-primary-800:hover { + --tw-bg-opacity: 1 !important; + background-color: rgb(30 64 175 / var(--tw-bg-opacity)) !important; +} + +.hover\:bg-blue-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(225 239 254 / var(--tw-bg-opacity)); +} + +.hover\:bg-blue-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(30 66 159 / var(--tw-bg-opacity)); +} + +.hover\:bg-blue-900:hover { + --tw-bg-opacity: 1; + background-color: rgb(35 56 118 / var(--tw-bg-opacity)); +} + +.hover\:bg-gray-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.hover\:bg-gray-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.hover\:bg-gray-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); +} + +.hover\:bg-green-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(3 84 63 / var(--tw-bg-opacity)); +} + +.hover\:bg-red-800:hover { + --tw-bg-opacity: 1; + background-color: rgb(155 28 28 / var(--tw-bg-opacity)); +} + +.hover\:bg-white:hover { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.hover\:text-blue-600:hover { + --tw-text-opacity: 1; + color: rgb(28 100 242 / var(--tw-text-opacity)); +} + +.hover\:text-blue-700:hover { + --tw-text-opacity: 1; + color: rgb(26 86 219 / var(--tw-text-opacity)); +} + +.hover\:text-gray-600:hover { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} + +.hover\:text-gray-700:hover { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.hover\:text-gray-900:hover { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.hover\:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.focus\:border-blue-500:focus { + --tw-border-opacity: 1; + border-color: rgb(63 131 248 / var(--tw-border-opacity)); +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus\:ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-4:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:\!ring-primary-300:focus { + --tw-ring-opacity: 1 !important; + --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity)) !important; +} + +.focus\:ring-blue-200:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(195 221 253 / var(--tw-ring-opacity)); +} + +.focus\:ring-blue-300:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(164 202 254 / var(--tw-ring-opacity)); +} + +.focus\:ring-blue-500:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(63 131 248 / var(--tw-ring-opacity)); +} + +.focus\:ring-gray-200:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity)); +} + +.focus\:ring-gray-300:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); +} + +.focus\:ring-green-300:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(132 225 188 / var(--tw-ring-opacity)); +} + +.focus\:ring-red-300:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(248 180 180 / var(--tw-ring-opacity)); +} + +.peer:checked ~ .peer-checked\:bg-blue-600 { + --tw-bg-opacity: 1; + background-color: rgb(28 100 242 / var(--tw-bg-opacity)); +} + +.peer:checked ~ .peer-checked\:after\:translate-x-full::after { + content: var(--tw-content); + --tw-translate-x: 100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.peer:checked ~ .peer-checked\:after\:border-white::after { + content: var(--tw-content); + --tw-border-opacity: 1; + border-color: rgb(255 255 255 / var(--tw-border-opacity)); +} + +.peer:focus ~ .peer-focus\:outline-none { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.peer:focus ~ .peer-focus\:ring-4 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.peer:focus ~ .peer-focus\:ring-blue-300 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(164 202 254 / var(--tw-ring-opacity)); +} + +.dark\:divide-gray-600:is(.dark *) > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(75 85 99 / var(--tw-divide-opacity)); +} + +.dark\:border-blue-500:is(.dark *) { + --tw-border-opacity: 1; + border-color: rgb(63 131 248 / var(--tw-border-opacity)); +} + +.dark\:border-blue-600:is(.dark *) { + --tw-border-opacity: 1; + border-color: rgb(28 100 242 / var(--tw-border-opacity)); +} + +.dark\:border-blue-800:is(.dark *) { + --tw-border-opacity: 1; + border-color: rgb(30 66 159 / var(--tw-border-opacity)); +} + +.dark\:border-gray-600:is(.dark *) { + --tw-border-opacity: 1; + border-color: rgb(75 85 99 / var(--tw-border-opacity)); +} + +.dark\:border-gray-700:is(.dark *) { + --tw-border-opacity: 1; + border-color: rgb(55 65 81 / var(--tw-border-opacity)); +} + +.dark\:border-green-500:is(.dark *) { + --tw-border-opacity: 1; + border-color: rgb(14 159 110 / var(--tw-border-opacity)); +} + +.dark\:border-red-500:is(.dark *) { + --tw-border-opacity: 1; + border-color: rgb(240 82 82 / var(--tw-border-opacity)); +} + +.dark\:border-transparent:is(.dark *) { + border-color: transparent; +} + +.dark\:\!bg-primary-600:is(.dark *) { + --tw-bg-opacity: 1 !important; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)) !important; +} + +.dark\:\!bg-primary-700:is(.dark *) { + --tw-bg-opacity: 1 !important; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)) !important; +} + +.dark\:bg-blue-600:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(28 100 242 / var(--tw-bg-opacity)); +} + +.dark\:bg-gray-600:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(75 85 99 / var(--tw-bg-opacity)); +} + +.dark\:bg-gray-700:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); +} + +.dark\:bg-gray-800:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); +} + +.dark\:bg-gray-800\/50:is(.dark *) { + background-color: rgb(31 41 55 / 0.5); +} + +.dark\:bg-gray-900:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity)); +} + +.dark\:bg-gray-900\/80:is(.dark *) { + background-color: rgb(17 24 39 / 0.8); +} + +.dark\:bg-red-600:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(224 36 36 / var(--tw-bg-opacity)); +} + +.dark\:text-blue-400:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(118 169 250 / var(--tw-text-opacity)); +} + +.dark\:text-blue-500:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(63 131 248 / var(--tw-text-opacity)); +} + +.dark\:text-gray-100:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(243 244 246 / var(--tw-text-opacity)); +} + +.dark\:text-gray-300:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity)); +} + +.dark\:text-gray-400:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.dark\:text-gray-600:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} + +.dark\:text-green-500:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(14 159 110 / var(--tw-text-opacity)); +} + +.dark\:text-red-400:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(249 128 128 / var(--tw-text-opacity)); +} + +.dark\:text-red-500:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(240 82 82 / var(--tw-text-opacity)); +} + +.dark\:text-white:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.dark\:text-yellow-300:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(250 202 21 / var(--tw-text-opacity)); +} + +.dark\:placeholder-gray-400:is(.dark *)::-moz-placeholder { + --tw-placeholder-opacity: 1; + color: rgb(156 163 175 / var(--tw-placeholder-opacity)); +} + +.dark\:placeholder-gray-400:is(.dark *)::placeholder { + --tw-placeholder-opacity: 1; + color: rgb(156 163 175 / var(--tw-placeholder-opacity)); +} + +.dark\:ring-offset-gray-800:is(.dark *) { + --tw-ring-offset-color: #1F2937; +} + +.dark\:hover\:\!bg-primary-700:hover:is(.dark *) { + --tw-bg-opacity: 1 !important; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)) !important; +} + +.dark\:hover\:bg-blue-500:hover:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(63 131 248 / var(--tw-bg-opacity)); +} + +.dark\:hover\:bg-blue-600:hover:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(28 100 242 / var(--tw-bg-opacity)); +} + +.dark\:hover\:bg-blue-700:hover:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(26 86 219 / var(--tw-bg-opacity)); +} + +.dark\:hover\:bg-gray-600:hover:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(75 85 99 / var(--tw-bg-opacity)); +} + +.dark\:hover\:bg-gray-700:hover:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); +} + +.dark\:hover\:bg-gray-800:hover:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); +} + +.dark\:hover\:bg-green-600:hover:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(5 122 85 / var(--tw-bg-opacity)); +} + +.dark\:hover\:bg-red-500:hover:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(240 82 82 / var(--tw-bg-opacity)); +} + +.dark\:hover\:bg-red-700:hover:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(200 30 30 / var(--tw-bg-opacity)); +} + +.dark\:hover\:text-blue-500:hover:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(63 131 248 / var(--tw-text-opacity)); +} + +.dark\:hover\:text-gray-300:hover:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity)); +} + +.dark\:hover\:text-white:hover:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.dark\:focus\:border-blue-500:focus:is(.dark *) { + --tw-border-opacity: 1; + border-color: rgb(63 131 248 / var(--tw-border-opacity)); +} + +.dark\:focus\:ring-blue-500:focus:is(.dark *) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(63 131 248 / var(--tw-ring-opacity)); +} + +.dark\:focus\:ring-blue-600:focus:is(.dark *) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(28 100 242 / var(--tw-ring-opacity)); +} + +.dark\:focus\:ring-blue-800:focus:is(.dark *) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(30 66 159 / var(--tw-ring-opacity)); +} + +.dark\:focus\:ring-gray-700:focus:is(.dark *) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(55 65 81 / var(--tw-ring-opacity)); +} + +.dark\:focus\:ring-gray-800:focus:is(.dark *) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(31 41 55 / var(--tw-ring-opacity)); +} + +.dark\:focus\:ring-green-800:focus:is(.dark *) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(3 84 63 / var(--tw-ring-opacity)); +} + +.dark\:focus\:ring-red-800:focus:is(.dark *) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(155 28 28 / var(--tw-ring-opacity)); +} + +.dark\:focus\:ring-offset-gray-800:focus:is(.dark *) { + --tw-ring-offset-color: #1F2937; +} + +.peer:focus ~ .dark\:peer-focus\:ring-blue-800:is(.dark *) { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(30 66 159 / var(--tw-ring-opacity)); +} + +@media (min-width: 640px) { + .sm\:flex { + display: flex; + } + + .sm\:space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); + } + + .sm\:space-y-0 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0px * var(--tw-space-y-reverse)); + } + + .sm\:rounded-lg { + border-radius: 0.5rem; + } +} + +@media (min-width: 768px) { + .md\:inset-0 { + inset: 0px; + } + + .md\:mb-0 { + margin-bottom: 0px; + } + + .md\:ml-64 { + margin-left: 16rem; + } + + .md\:inline { + display: inline; + } + + .md\:w-auto { + width: auto; + } + + .md\:translate-x-0 { + --tw-translate-x: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); + } + + .md\:flex-row { + flex-direction: row; + } + + .md\:p-5 { + padding: 1.25rem; + } + + .md\:p-8 { + padding: 2rem; + } + + .md\:text-5xl { + font-size: 3rem; + line-height: 1; + } +} + +@media (min-width: 1024px) { + .lg\:flex { + display: flex; + } + + .lg\:text-6xl { + font-size: 3.75rem; + line-height: 1; + } +} + +.rtl\:rotate-180:where([dir="rtl"], [dir="rtl"] *) { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rtl\:space-x-reverse:where([dir="rtl"], [dir="rtl"] *) > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 1; +} + +.rtl\:text-right:where([dir="rtl"], [dir="rtl"] *) { + text-align: right; +} + +.peer:checked ~ .rtl\:peer-checked\:after\:-translate-x-full:where([dir="rtl"], [dir="rtl"] *)::after { + content: var(--tw-content); + --tw-translate-x: -100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} diff --git a/KenticoInspector.WebApplication/ClientApp/public/favicon.ico b/src/KInspector.Blazor/wwwroot/img/favicon.ico similarity index 100% rename from KenticoInspector.WebApplication/ClientApp/public/favicon.ico rename to src/KInspector.Blazor/wwwroot/img/favicon.ico diff --git a/src/KInspector.Core/AbstractAction.cs b/src/KInspector.Core/AbstractAction.cs new file mode 100644 index 00000000..dcee64ba --- /dev/null +++ b/src/KInspector.Core/AbstractAction.cs @@ -0,0 +1,108 @@ +using KInspector.Core.Models; +using KInspector.Core.Modules; +using KInspector.Core.Services.Interfaces; + +using Newtonsoft.Json; + +using System.Reflection; + +namespace KInspector.Core +{ + public abstract class AbstractAction : AbstractModule, IAction + where TTerms : new() + where TOptions: new() + { + public TOptions Options => new(); + + protected AbstractAction(IModuleMetadataService moduleMetadataService) + : base(moduleMetadataService) { } + + public Task Execute(string optionsJson) + { + try + { + var options = JsonConvert.DeserializeObject(optionsJson); + if (OptionsNull(options)) + { + return ExecuteListing(); + } + + if (OptionsPartial(options)) + { + return ExecutePartial(options); + } + + return Execute(options); + } + catch + { + return GetInvalidOptionsResult(); + } + } + + public Type GetOptionsType() + { + return typeof(TOptions); + } + + /// + /// Executed when all options are populated. + /// + public abstract Task Execute(TOptions? options); + + /// + /// Executed when at least one option has a value and one doesn't. + /// This could be a valid scenario where an option is hidden and not needed when another option + /// is set to a specific value. + /// + public abstract Task ExecutePartial(TOptions? options); + + /// + /// Executed when no options are provided. Should display a list of data that can be modified by + /// the action. + /// + public abstract Task ExecuteListing(); + + public abstract Task GetInvalidOptionsResult(); + + /// + /// Returns true if at least one option has a value and one doesn't. + /// + private static bool OptionsPartial(TOptions? options) + { + var hasNull = false; + var hasValue = false; + PropertyInfo[] properties = typeof(TOptions).GetProperties(); + foreach (PropertyInfo property in properties) + { + if (property.GetValue(options) is null) + { + hasNull = true; + } + else + { + hasValue = true; + } + } + + return hasNull && hasValue; + } + + /// + /// Returns true if all options are null. + /// + private static bool OptionsNull(TOptions? options) + { + PropertyInfo[] properties = typeof(TOptions).GetProperties(); + foreach (PropertyInfo property in properties) + { + if (property.GetValue(options) is not null) + { + return false; + } + } + + return true; + } + } +} diff --git a/KenticoInspector.Core/AbstractModule.cs b/src/KInspector.Core/AbstractModule.cs similarity index 73% rename from KenticoInspector.Core/AbstractModule.cs rename to src/KInspector.Core/AbstractModule.cs index 62ab6f8c..08e6dce2 100644 --- a/KenticoInspector.Core/AbstractModule.cs +++ b/src/KInspector.Core/AbstractModule.cs @@ -1,17 +1,14 @@ -using System; -using System.Collections.Generic; +using KInspector.Core.Models; +using KInspector.Core.Modules; +using KInspector.Core.Services.Interfaces; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Modules; -using KenticoInspector.Core.Services.Interfaces; - -namespace KenticoInspector.Core +namespace KInspector.Core { public abstract class AbstractModule : IModule, IWithModuleMetadata where T : new() { protected readonly IModuleMetadataService moduleMetadataService; - private ModuleMetadata metadata; + private ModuleMetadata? metadata; protected AbstractModule(IModuleMetadataService moduleMetadataService) { @@ -28,7 +25,7 @@ public ModuleMetadata Metadata { get { - return metadata ?? (metadata = moduleMetadataService.GetModuleMetadata(Codename)); + return metadata ??= moduleMetadataService.GetModuleMetadata(Codename); } } @@ -41,7 +38,7 @@ public static string GetCodename(Type reportType) private static string GetDirectParentNamespace(Type reportType) { - var fullNameSpace = reportType.Namespace; + var fullNameSpace = reportType.Namespace ?? throw new InvalidOperationException("Error getting report namespace."); var indexAfterLastPeriod = fullNameSpace.LastIndexOf('.') + 1; return fullNameSpace.Substring(indexAfterLastPeriod, fullNameSpace.Length - indexAfterLastPeriod); diff --git a/KenticoInspector.Core/AbstractReport.cs b/src/KInspector.Core/AbstractReport.cs similarity index 52% rename from KenticoInspector.Core/AbstractReport.cs rename to src/KInspector.Core/AbstractReport.cs index 9d6c96d5..8481ea67 100644 --- a/KenticoInspector.Core/AbstractReport.cs +++ b/src/KInspector.Core/AbstractReport.cs @@ -1,8 +1,8 @@ -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Modules; -using KenticoInspector.Core.Services.Interfaces; +using KInspector.Core.Models; +using KInspector.Core.Modules; +using KInspector.Core.Services.Interfaces; -namespace KenticoInspector.Core +namespace KInspector.Core { public abstract class AbstractReport : AbstractModule, IReport where T : new() { @@ -10,6 +10,6 @@ protected AbstractReport(IModuleMetadataService moduleMetadataService) : base(mo { } - public abstract ReportResults GetResults(); + public abstract Task GetResults(); } } \ No newline at end of file diff --git a/KenticoInspector.Core/Constants/DefaultKenticoPaths.cs b/src/KInspector.Core/Constants/DefaultKenticoPaths.cs similarity index 85% rename from KenticoInspector.Core/Constants/DefaultKenticoPaths.cs rename to src/KInspector.Core/Constants/DefaultKenticoPaths.cs index 1c47d33f..0adf911c 100644 --- a/KenticoInspector.Core/Constants/DefaultKenticoPaths.cs +++ b/src/KInspector.Core/Constants/DefaultKenticoPaths.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Core.Constants +namespace KInspector.Core.Constants { public static class DefaultKenticoPaths { diff --git a/KenticoInspector.Core/Constants/ReportTags.cs b/src/KInspector.Core/Constants/ModuleTags.cs similarity index 65% rename from KenticoInspector.Core/Constants/ReportTags.cs rename to src/KInspector.Core/Constants/ModuleTags.cs index 95d7d9ce..d9c4aec3 100644 --- a/KenticoInspector.Core/Constants/ReportTags.cs +++ b/src/KInspector.Core/Constants/ModuleTags.cs @@ -1,6 +1,6 @@ -namespace KenticoInspector.Core.Constants +namespace KInspector.Core.Constants { - public static class ReportTags + public static class ModuleTags { public const string Consistency = "Consistency"; public const string EventLog = "Event Log"; @@ -14,5 +14,11 @@ public static class ReportTags public const string WebParts = "Web Parts"; public const string Configuration = "Configuration"; public const string OnlineMarketing = "On-line Marketing"; + public const string Reset = "Reset"; + public const string User = "User"; + public const string Site = "Site"; + public const string WebFarms = "Web farms"; + public const string Staging = "Content staging"; + public const string Emails = "Emails"; } } \ No newline at end of file diff --git a/KenticoInspector.Core/Constants/ResultsStatus.cs b/src/KInspector.Core/Constants/ResultsStatus.cs similarity index 93% rename from KenticoInspector.Core/Constants/ResultsStatus.cs rename to src/KInspector.Core/Constants/ResultsStatus.cs index 018cae81..fcfac9e7 100644 --- a/KenticoInspector.Core/Constants/ResultsStatus.cs +++ b/src/KInspector.Core/Constants/ResultsStatus.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Core.Constants +namespace KInspector.Core.Constants { public enum ResultsStatus { diff --git a/KenticoInspector.Core/Constants/ResultsType.cs b/src/KInspector.Core/Constants/ResultsType.cs similarity index 51% rename from KenticoInspector.Core/Constants/ResultsType.cs rename to src/KInspector.Core/Constants/ResultsType.cs index beeee4f8..ee9653ca 100644 --- a/KenticoInspector.Core/Constants/ResultsType.cs +++ b/src/KInspector.Core/Constants/ResultsType.cs @@ -1,10 +1,9 @@ -namespace KenticoInspector.Core.Constants +namespace KInspector.Core.Constants { public enum ResultsType { - String, + NoResults, StringList, - Table, TableList } } \ No newline at end of file diff --git a/KenticoInspector.Core/CoreModule.cs b/src/KInspector.Core/CoreModule.cs similarity index 83% rename from KenticoInspector.Core/CoreModule.cs rename to src/KInspector.Core/CoreModule.cs index 53912777..d62071cc 100644 --- a/KenticoInspector.Core/CoreModule.cs +++ b/src/KInspector.Core/CoreModule.cs @@ -1,13 +1,12 @@ -using System.Linq; using System.Reflection; using Autofac; -using KenticoInspector.Core.Repositories.Interfaces; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Core.Tokens; +using KInspector.Core.Repositories.Interfaces; +using KInspector.Core.Services.Interfaces; +using KInspector.Core.Tokens; -namespace KenticoInspector.Core +namespace KInspector.Core { public class CoreModule : Autofac.Module { diff --git a/KenticoInspector.Core/Extensions/StringExtensions.cs b/src/KInspector.Core/Extensions/StringExtensions.cs similarity index 69% rename from KenticoInspector.Core/Extensions/StringExtensions.cs rename to src/KInspector.Core/Extensions/StringExtensions.cs index 2d9b54a5..309f1962 100644 --- a/KenticoInspector.Core/Extensions/StringExtensions.cs +++ b/src/KInspector.Core/Extensions/StringExtensions.cs @@ -1,10 +1,8 @@ -using System; - -namespace KenticoInspector.Core.Extensions +namespace KInspector.Core.Extensions { public static class StringExtensions { - public static (string first, string second) SplitAtFirst(this string source, char splitChar) + public static (string? first, string? second) SplitAtFirst(this string source, char splitChar) { var index = source.IndexOf(splitChar); if (index < 0) diff --git a/src/KInspector.Core/Helpers/DatabaseHelper.cs b/src/KInspector.Core/Helpers/DatabaseHelper.cs new file mode 100644 index 00000000..fd9e4b6a --- /dev/null +++ b/src/KInspector.Core/Helpers/DatabaseHelper.cs @@ -0,0 +1,35 @@ +using System.Data.SqlClient; + +using KInspector.Core.Models; + +namespace KInspector.Core.Helpers +{ + public static class DatabaseHelper + { + public static SqlConnection GetSqlConnection(DatabaseSettings databaseSettings) + { + if (!string.IsNullOrEmpty(databaseSettings.AdministrationConnectionString)) + { + return new SqlConnection(databaseSettings.AdministrationConnectionString); + } + else + { + SqlConnectionStringBuilder sb = new(); + if (databaseSettings.IntegratedSecurity) + { + sb.IntegratedSecurity = true; + } + else + { + sb.UserID = databaseSettings.User; + sb.Password = databaseSettings.Password; + } + + sb["Server"] = databaseSettings.Server; + sb["Database"] = databaseSettings.Database; + + return new SqlConnection(sb.ConnectionString); + } + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Core/Helpers/DirectoryHelper.cs b/src/KInspector.Core/Helpers/DirectoryHelper.cs similarity index 76% rename from KenticoInspector.Core/Helpers/DirectoryHelper.cs rename to src/KInspector.Core/Helpers/DirectoryHelper.cs index 631038aa..5c4a6984 100644 --- a/KenticoInspector.Core/Helpers/DirectoryHelper.cs +++ b/src/KInspector.Core/Helpers/DirectoryHelper.cs @@ -1,7 +1,6 @@ -using System.IO; -using System.Reflection; +using System.Reflection; -namespace KenticoInspector.Core.Helpers +namespace KInspector.Core.Helpers { public static class DirectoryHelper { @@ -9,9 +8,10 @@ public static class DirectoryHelper /// Gets the executing directory of the application. /// /// A string that contains the path of the executing directory, and does not end with a backslash (\). - public static string GetExecutingDirectory() + public static string? GetExecutingDirectory() { var assemblyPath = Assembly.GetExecutingAssembly().Location; + return Path.GetDirectoryName(assemblyPath); } } diff --git a/KenticoInspector.Core/Helpers/FileHelper.cs b/src/KInspector.Core/Helpers/FileHelper.cs similarity index 84% rename from KenticoInspector.Core/Helpers/FileHelper.cs rename to src/KInspector.Core/Helpers/FileHelper.cs index b41bbebe..7c4a2d91 100644 --- a/KenticoInspector.Core/Helpers/FileHelper.cs +++ b/src/KInspector.Core/Helpers/FileHelper.cs @@ -1,8 +1,6 @@ -using System.Collections.Generic; -using System.IO; -using System.Xml.Linq; +using System.Xml.Linq; -namespace KenticoInspector.Core.Helpers +namespace KInspector.Core.Helpers { public static class FileHelper { @@ -12,12 +10,12 @@ public static class FileHelper /// Relative file path not starting with a slash (/). /// Dictionary of string replacements. /// - public static string GetSqlQueryText(string relativeFilePath, IDictionary literalReplacements = null) + public static string GetSqlQueryText(string relativeFilePath, IDictionary? literalReplacements = null) { var executingDirectory = DirectoryHelper.GetExecutingDirectory(); var fullPathToScript = $"{executingDirectory}/{relativeFilePath}"; var query = File.ReadAllText(fullPathToScript); - if (literalReplacements != null) + if (literalReplacements is not null) { foreach (var replacement in literalReplacements) { diff --git a/KenticoInspector.Core/Helpers/UriHelper.cs b/src/KInspector.Core/Helpers/UriHelper.cs similarity index 79% rename from KenticoInspector.Core/Helpers/UriHelper.cs rename to src/KInspector.Core/Helpers/UriHelper.cs index da296d38..27970bbc 100644 --- a/KenticoInspector.Core/Helpers/UriHelper.cs +++ b/src/KInspector.Core/Helpers/UriHelper.cs @@ -1,6 +1,4 @@ -using System; - -namespace KenticoInspector.Core.Helpers +namespace KInspector.Core.Helpers { public static class UriHelper { diff --git a/KenticoInspector.Core/Helpers/VersionHelper.cs b/src/KInspector.Core/Helpers/VersionHelper.cs similarity index 77% rename from KenticoInspector.Core/Helpers/VersionHelper.cs rename to src/KInspector.Core/Helpers/VersionHelper.cs index e390820a..21c46429 100644 --- a/KenticoInspector.Core/Helpers/VersionHelper.cs +++ b/src/KInspector.Core/Helpers/VersionHelper.cs @@ -1,8 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using System.Text; -namespace KenticoInspector.Core.Helpers +namespace KInspector.Core.Helpers { public static class VersionHelper { @@ -22,12 +20,13 @@ public static Version GetVersionFromShortString(string version) public static string ExpandVersionString(string version) { + var builder = new StringBuilder(version); for (int i = 0; i < 2; i++) { - version += ".0"; + builder.Append(".0"); } - return version; + return builder.ToString(); } } } \ No newline at end of file diff --git a/KenticoInspector.Core/KenticoInspector.Core.csproj b/src/KInspector.Core/KInspector.Core.csproj similarity index 57% rename from KenticoInspector.Core/KenticoInspector.Core.csproj rename to src/KInspector.Core/KInspector.Core.csproj index be5f6cc5..d650013c 100644 --- a/KenticoInspector.Core/KenticoInspector.Core.csproj +++ b/src/KInspector.Core/KInspector.Core.csproj @@ -1,13 +1,8 @@  - net8.0 - 9.0 - - - - - + KInspector.Core + net8.0 @@ -16,12 +11,6 @@ - - - ..\..\..\Program Files\dotnet\sdk\NuGetFallbackFolder\system.data.sqlclient\4.6.0\ref\netcoreapp2.1\System.Data.SqlClient.dll - - - Always diff --git a/src/KInspector.Core/Models/DatabaseSettings.cs b/src/KInspector.Core/Models/DatabaseSettings.cs new file mode 100644 index 00000000..3666c491 --- /dev/null +++ b/src/KInspector.Core/Models/DatabaseSettings.cs @@ -0,0 +1,38 @@ +namespace KInspector.Core.Models +{ + /// + /// Represents the configuration required to connect to an instance's database. + /// + public class DatabaseSettings + { + /// + /// The name of the database. + /// + public string? Database { get; set; } + + /// + /// True if the database connection uses Integrated Security. + /// + public bool IntegratedSecurity { get; set; } + + /// + /// The password used in the database credentials, if is false. + /// + public string? Password { get; set; } + + /// + /// The name of the SQL Server. + /// + public string? Server { get; set; } + + /// + /// The user name used in the database credentials, if is false. + /// + public string? User { get; set; } + + /// + /// If not null, this connection string is used to connect to the database and other properties are ignored. + /// + public string? AdministrationConnectionString { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Models/InspectorConfig.cs b/src/KInspector.Core/Models/InspectorConfig.cs new file mode 100644 index 00000000..c041f632 --- /dev/null +++ b/src/KInspector.Core/Models/InspectorConfig.cs @@ -0,0 +1,18 @@ +namespace KInspector.Core.Models +{ + /// + /// Represents the local configuration of the KInspector application. + /// + public class InspectorConfig + { + /// + /// The GUID of the currently connected instance. + /// + public Guid? CurrentInstance { get; set; } + + /// + /// A list of registered Kentico instances. + /// + public List Instances { get; set; } = new(); + } +} diff --git a/src/KInspector.Core/Models/Instance.cs b/src/KInspector.Core/Models/Instance.cs new file mode 100644 index 00000000..15260c99 --- /dev/null +++ b/src/KInspector.Core/Models/Instance.cs @@ -0,0 +1,33 @@ +namespace KInspector.Core.Models +{ + /// + /// Represents a Kentico instance and its configuration. + /// + public class Instance + { + /// + /// The configuration required to connect to the instance's database. + /// + public DatabaseSettings DatabaseSettings { get; set; } = new(); + + /// + /// The instance GUID. + /// + public Guid? Guid { get; set; } + + /// + /// The instance name. + /// + public string? Name { get; set; } + + /// + /// The absolute path to the administration website root directory. + /// + public string? AdministrationPath { get; set; } + + /// + /// The administration website's URL. + /// + public string? AdministrationUrl { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Models/InstanceDetails.cs b/src/KInspector.Core/Models/InstanceDetails.cs new file mode 100644 index 00000000..b3d63dad --- /dev/null +++ b/src/KInspector.Core/Models/InstanceDetails.cs @@ -0,0 +1,23 @@ +namespace KInspector.Core.Models +{ + /// + /// Represents additional information about an instance not stored in the application's configuration file. + /// + public class InstanceDetails + { + /// + /// The version of the Kentico DLLs in the administration website. + /// + public Version? AdministrationVersion { get; set; } + + /// + /// The version of the Kentico DLLs in the administration website. + /// + public Version? AdministrationDatabaseVersion { get; set; } + + /// + /// The sites contained in the instance's CMS_Site table. + /// + public IEnumerable Sites { get; set; } = Enumerable.Empty(); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Models/ModuleDetails.cs b/src/KInspector.Core/Models/ModuleDetails.cs new file mode 100644 index 00000000..e09e56ce --- /dev/null +++ b/src/KInspector.Core/Models/ModuleDetails.cs @@ -0,0 +1,23 @@ +namespace KInspector.Core.Models +{ + /// + /// Represents basic details about the module. + /// + public class ModuleDetails + { + /// + /// The detailed description of the module's function. + /// + public string? LongDescription { get; set; } + + /// + /// The human-friendly name of the module. + /// + public string? Name { get; set; } + + /// + /// The short description of the module's function. + /// + public string? ShortDescription { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Models/ModuleMetadata.cs b/src/KInspector.Core/Models/ModuleMetadata.cs new file mode 100644 index 00000000..80097105 --- /dev/null +++ b/src/KInspector.Core/Models/ModuleMetadata.cs @@ -0,0 +1,22 @@ +using Newtonsoft.Json; + +namespace KInspector.Core.Models +{ + /// + /// Represents basic details about the module and all terms used in the module's function. + /// + /// + public class ModuleMetadata where T : new() + { + /// + /// The basic details about the module. + /// + public ModuleDetails Details { get; set; } = new ModuleDetails(); + + /// + /// Terms to be by the module results. + /// + [JsonIgnore] + public T Terms { get; set; } = new T(); + } +} diff --git a/src/KInspector.Core/Models/ModuleResults.cs b/src/KInspector.Core/Models/ModuleResults.cs new file mode 100644 index 00000000..9765ef43 --- /dev/null +++ b/src/KInspector.Core/Models/ModuleResults.cs @@ -0,0 +1,40 @@ +using KInspector.Core.Constants; + +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace KInspector.Core.Models +{ + /// + /// Represents the results of a module's execution. + /// + public class ModuleResults + { + /// + /// Indicates whether the module has been executed and its status. + /// + [JsonConverter(typeof(StringEnumConverter))] + public ResultsStatus Status { get; set; } = ResultsStatus.NotRun; + + /// + /// The short description of the execution's results. + /// + public string? Summary { get; set; } + + /// + /// Indicates whether the execution returned results, and of what type. + /// + [JsonConverter(typeof(StringEnumConverter))] + public ResultsType Type { get; set; } = ResultsType.NoResults; + + /// + /// The list of tables returned by the execution, if any. + /// + public IList TableResults { get; } = new List(); + + /// + /// The list of strings returned by the execution, if any. + /// + public IList StringResults { get; } = new List(); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Models/Site.cs b/src/KInspector.Core/Models/Site.cs new file mode 100644 index 00000000..9bcbbdbf --- /dev/null +++ b/src/KInspector.Core/Models/Site.cs @@ -0,0 +1,38 @@ +namespace KInspector.Core.Models +{ + /// + /// Represents a Kentico website from the CMS_Site table. + /// + public class Site + { + /// + /// The site administration domain name. + /// + public string? DomainName { get; set; } + + /// + /// The site GUID. + /// + public Guid Guid { get; set; } + + /// + /// The site ID. + /// + public int Id { get; set; } + + /// + /// The site name. + /// + public string? Name { get; set; } + + /// + /// The site presentation URL. + /// + public string? PresentationUrl { get; set; } + + /// + /// The site status. + /// + public string? Status { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Models/TableResult.cs b/src/KInspector.Core/Models/TableResult.cs new file mode 100644 index 00000000..7917ad13 --- /dev/null +++ b/src/KInspector.Core/Models/TableResult.cs @@ -0,0 +1,18 @@ +namespace KInspector.Core.Models +{ + /// + /// Represents a table containing results of a module's execution. + /// + public class TableResult + { + /// + /// The name of the table. + /// + public string? Name { get; set; } + + /// + /// The table rows. + /// + public IEnumerable Rows { get; set; } = Enumerable.Empty(); + } +} \ No newline at end of file diff --git a/KenticoInspector.Core/Models/Term.cs b/src/KInspector.Core/Models/Term.cs similarity index 62% rename from KenticoInspector.Core/Models/Term.cs rename to src/KInspector.Core/Models/Term.cs index 647d7c4f..948188b0 100644 --- a/KenticoInspector.Core/Models/Term.cs +++ b/src/KInspector.Core/Models/Term.cs @@ -1,31 +1,34 @@ -using KenticoInspector.Core.Tokens; +using KInspector.Core.Tokens; -namespace KenticoInspector.Core.Models +namespace KInspector.Core.Models { + /// + /// A string containing tokens which can be replaced with provided values. + /// public class Term { private string Markdown { get; set; } - private object TokenValues { get; set; } + private object? TokenValues { get; set; } - private Term(string value) + private Term(string? value) { - Markdown = value; + Markdown = value ?? string.Empty; } - public static implicit operator Term(string value) + public static implicit operator Term(string? value) { return new Term(value); } - public static implicit operator string(Term term) + public static implicit operator string(Term? term) { - return term.ToString(); + return term?.ToString() ?? string.Empty; } public override string ToString() { - if (TokenValues != null) + if (TokenValues is not null) { return TokenExpressionResolver.ResolveTokenExpressions(Markdown, TokenValues); } diff --git a/src/KInspector.Core/Modules/IAction.cs b/src/KInspector.Core/Modules/IAction.cs new file mode 100644 index 00000000..916f56b5 --- /dev/null +++ b/src/KInspector.Core/Modules/IAction.cs @@ -0,0 +1,21 @@ +using KInspector.Core.Models; + +namespace KInspector.Core.Modules +{ + /// + /// A module which modifies data in the connected instance. + /// + public interface IAction : IModule + { + /// + /// Executes the action. + /// + /// A serialized object containing parameters to execute the action with. + Task Execute(string optionsJson); + + /// + /// Gets the type of the object expected when executing the action. + /// + Type GetOptionsType(); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Modules/IModule.cs b/src/KInspector.Core/Modules/IModule.cs new file mode 100644 index 00000000..babef786 --- /dev/null +++ b/src/KInspector.Core/Modules/IModule.cs @@ -0,0 +1,28 @@ +namespace KInspector.Core.Modules +{ + /// + /// A module that can be executed against the connected instance. + /// + public interface IModule + { + /// + /// The module code name. + /// + string Codename { get; } + + /// + /// A list of Kentico major versions which are supported by the module. + /// + IList CompatibleVersions { get; } + + /// + /// A list of Kentico major versions which are not supported by the module. + /// + IList IncompatibleVersions { get; } + + /// + /// The module tags found in . + /// + IList Tags { get; } + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Modules/IReport.cs b/src/KInspector.Core/Modules/IReport.cs new file mode 100644 index 00000000..6c7805fb --- /dev/null +++ b/src/KInspector.Core/Modules/IReport.cs @@ -0,0 +1,15 @@ +using KInspector.Core.Models; + +namespace KInspector.Core.Modules +{ + /// + /// A module which returns information from the connected instance without modifying data. + /// + public interface IReport : IModule + { + /// + /// Executes the report. + /// + Task GetResults(); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Modules/IWithModuleMetadata.cs b/src/KInspector.Core/Modules/IWithModuleMetadata.cs new file mode 100644 index 00000000..e11fe03c --- /dev/null +++ b/src/KInspector.Core/Modules/IWithModuleMetadata.cs @@ -0,0 +1,15 @@ +using KInspector.Core.Models; + +namespace KInspector.Core.Modules +{ + /// + /// A module that contains metadata. + /// + public interface IWithModuleMetadata where T : new() + { + /// + /// The module metadata. + /// + ModuleMetadata Metadata { get; } + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Repositories/Interfaces/IActionRepository.cs b/src/KInspector.Core/Repositories/Interfaces/IActionRepository.cs new file mode 100644 index 00000000..cfa24bd8 --- /dev/null +++ b/src/KInspector.Core/Repositories/Interfaces/IActionRepository.cs @@ -0,0 +1,20 @@ +using KInspector.Core.Modules; + +namespace KInspector.Core.Repositories.Interfaces +{ + /// + /// Contains all actions found in referenced assemblies. + /// + public interface IActionRepository : IRepository + { + /// + /// Gets all registered actions. + /// + IEnumerable GetActions(); + + /// + /// Gets the action with the provided codename, or null if not found. + /// + IAction? GetAction(string codename); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Repositories/Interfaces/IReportRepository.cs b/src/KInspector.Core/Repositories/Interfaces/IReportRepository.cs new file mode 100644 index 00000000..15c3eb17 --- /dev/null +++ b/src/KInspector.Core/Repositories/Interfaces/IReportRepository.cs @@ -0,0 +1,20 @@ +using KInspector.Core.Modules; + +namespace KInspector.Core.Repositories.Interfaces +{ + /// + /// Contains all reports found in referenced assemblies. + /// + public interface IReportRepository : IRepository + { + /// + /// Gets all registered reports. + /// + IEnumerable GetReports(); + + /// + /// Gets the report with the provided codename, or null if not found. + /// + IReport? GetReport(string codename); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Repositories/Interfaces/IRepository.cs b/src/KInspector.Core/Repositories/Interfaces/IRepository.cs new file mode 100644 index 00000000..97e49ac9 --- /dev/null +++ b/src/KInspector.Core/Repositories/Interfaces/IRepository.cs @@ -0,0 +1,6 @@ +namespace KInspector.Core.Repositories.Interfaces +{ + public interface IRepository + { + } +} \ No newline at end of file diff --git a/KenticoInspector.Core/Scripts/GetCmsSettings.sql b/src/KInspector.Core/Scripts/GetCmsSettings.sql similarity index 100% rename from KenticoInspector.Core/Scripts/GetCmsSettings.sql rename to src/KInspector.Core/Scripts/GetCmsSettings.sql diff --git a/KenticoInspector.Core/Scripts/GetCmsSites.sql b/src/KInspector.Core/Scripts/GetCmsSites.sql similarity index 100% rename from KenticoInspector.Core/Scripts/GetCmsSites.sql rename to src/KInspector.Core/Scripts/GetCmsSites.sql diff --git a/src/KInspector.Core/Services/Interfaces/ICmsFileService.cs b/src/KInspector.Core/Services/Interfaces/ICmsFileService.cs new file mode 100644 index 00000000..b130b78c --- /dev/null +++ b/src/KInspector.Core/Services/Interfaces/ICmsFileService.cs @@ -0,0 +1,34 @@ +using KInspector.Core.Constants; + +using System.Xml; + +namespace KInspector.Core.Services.Interfaces +{ + /// + /// Contains methods for reading files from a Kentico instance's filesystem. + /// + public interface ICmsFileService : IService + { + /// + /// Gets a key/vair pair of resource strings from the provided .resx file. + /// + /// The root of the Kentico administration website. + /// The relative path of the .resx file within the . + Dictionary GetResourceStringsFromResx(string? instanceRoot, string relativeResxFilePath = DefaultKenticoPaths.PrimaryResxFile); + + /// + /// Gets the CMSConnectionString from the provided web.config file. + /// + /// The root of the Kentico administration website. + /// The relative path of the web.config file within the . + string? GetCMSConnectionString(string? instanceRoot, string relativeWebConfigFilePath = DefaultKenticoPaths.WebConfigFile); + + /// + /// Gets the XML contents of the provided .xml file. + /// + /// The root of the Kentico administration website. + /// The relative path of the .xml file within the . + /// + XmlDocument? GetXmlDocument(string? instanceRoot, string relativeFilePath); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Services/Interfaces/IConfigService.cs b/src/KInspector.Core/Services/Interfaces/IConfigService.cs new file mode 100644 index 00000000..6d2b9ae5 --- /dev/null +++ b/src/KInspector.Core/Services/Interfaces/IConfigService.cs @@ -0,0 +1,44 @@ +using KInspector.Core.Models; + +namespace KInspector.Core.Services.Interfaces +{ + /// + /// Contains methods for managing the KInspector configuration file. + /// + public interface IConfigService : IService + { + /// + /// Removes an instance from the configuration file. + /// + /// The GUID of the instance to remove. + /// True if the operation was successful. + bool DeleteInstance(Guid? guid); + + /// + /// Gets an instance from the configuration file. + /// + /// The GUID of the instance to retrieve. + Instance? GetInstance(Guid guid); + + /// + /// Gets the contents of the configuration file. + /// + InspectorConfig GetConfig(); + + /// + /// Adds an instance to the configuration file. + /// + void UpsertInstance(Instance instance); + + /// + /// Gets the currently connected instance from the configuration file, or null if none is set. + /// + Instance? GetCurrentInstance(); + + /// + /// Saves the currently connected instance to the configuration file. + /// + /// The instance with the provided , or null if not found. + Instance? SetCurrentInstance(Guid? guid); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Services/Interfaces/IDatabaseService.cs b/src/KInspector.Core/Services/Interfaces/IDatabaseService.cs new file mode 100644 index 00000000..0b65d987 --- /dev/null +++ b/src/KInspector.Core/Services/Interfaces/IDatabaseService.cs @@ -0,0 +1,115 @@ +using System.Data; + +using KInspector.Core.Models; + +namespace KInspector.Core.Services.Interfaces +{ + /// + /// Contains methods for loading KInspector script files and executing SQL queries against a database. + /// + public interface IDatabaseService : IService + { + /// + /// Connects to the database provided by the database settings. + /// + void Configure(DatabaseSettings databaseSettings); + + /// + /// Executes SQL contained in a KInspector script file. + /// + /// The relative path of the .sql file to execute. + /// Values which will be provided as parameters in the SQL query. + Task ExecuteNonQuery(string relativeFilePath, dynamic parameters); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + Task> ExecuteSqlFromFile(string relativeFilePath); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + /// Values which will be provided as parameters in the SQL query. + Task> ExecuteSqlFromFile(string relativeFilePath, dynamic parameters); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + /// Text within the .sql file matching the keys of this dictionary will be replaced by the values before execution. + Task> ExecuteSqlFromFile(string relativeFilePath, IDictionary literalReplacements); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + /// Text within the .sql file matching the keys of this dictionary will be replaced by the values before execution. + /// Values which will be provided as parameters in the SQL query. + Task> ExecuteSqlFromFile(string relativeFilePath, IDictionary literalReplacements, dynamic parameters); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + [Obsolete("A last resort when it is impossible to create a data model or use one of the generic options.")] + Task ExecuteSqlFromFileAsDataTable(string relativeFilePath); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + Task>> ExecuteSqlFromFileGeneric(string relativeFilePath); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + /// Values which will be provided as parameters in the SQL query. + Task>> ExecuteSqlFromFileGeneric(string relativeFilePath, dynamic parameters); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + /// Text within the .sql file matching the keys of this dictionary will be replaced by the values before execution. + Task>> ExecuteSqlFromFileGeneric(string relativeFilePath, IDictionary literalReplacements); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + /// Text within the .sql file matching the keys of this dictionary will be replaced by the values before execution. + /// Values which will be provided as parameters in the SQL query. + Task>> ExecuteSqlFromFileGeneric(string relativeFilePath, IDictionary literalReplacements, dynamic parameters); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + Task ExecuteSqlFromFileScalar(string relativeFilePath); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + /// Values which will be provided as parameters in the SQL query. + Task ExecuteSqlFromFileScalar(string relativeFilePath, dynamic parameters); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + /// Text within the .sql file matching the keys of this dictionary will be replaced by the values before execution. + Task ExecuteSqlFromFileScalar(string relativeFilePath, IDictionary literalReplacements); + + /// + /// Executes SQL contained in a KInspector script file and returns the results. + /// + /// The relative path of the .sql file to execute. + /// Text within the .sql file matching the keys of this dictionary will be replaced by the values before execution. + /// Values which will be provided as parameters in the SQL query. + Task ExecuteSqlFromFileScalar(string relativeFilePath, IDictionary literalReplacements, dynamic parameters); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Services/Interfaces/IInstanceService.cs b/src/KInspector.Core/Services/Interfaces/IInstanceService.cs new file mode 100644 index 00000000..5b8b2bc9 --- /dev/null +++ b/src/KInspector.Core/Services/Interfaces/IInstanceService.cs @@ -0,0 +1,20 @@ +using KInspector.Core.Models; + +namespace KInspector.Core.Services.Interfaces +{ + /// + /// Contains methods for getting additional instance information. + /// + public interface IInstanceService : IService + { + /// + /// Gets details about the instance. + /// + InstanceDetails GetInstanceDetails(Guid instanceGuid); + + /// + /// Gets details about the instance. + /// + InstanceDetails GetInstanceDetails(Instance? instance); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Services/Interfaces/IModuleMetadataService.cs b/src/KInspector.Core/Services/Interfaces/IModuleMetadataService.cs new file mode 100644 index 00000000..05ae1f41 --- /dev/null +++ b/src/KInspector.Core/Services/Interfaces/IModuleMetadataService.cs @@ -0,0 +1,30 @@ +using KInspector.Core.Models; + +namespace KInspector.Core.Services.Interfaces +{ + /// + /// Contains methods for reading module metadata .yaml files. + /// + public interface IModuleMetadataService : IService + { + /// + /// The name of the default culture, which corresponds with the name of the .yaml file to load. + /// + string DefaultCultureName { get; } + + /// + /// The 's current culture, which corresponds with the name of the .yaml file to load. + /// + string CurrentCultureName { get; } + + /// + /// Gets the provided module's metadata. + /// + ModuleMetadata GetModuleMetadata(string moduleCodename) where T : new(); + + /// + /// Gets the provided module's details. + /// + ModuleDetails GetModuleDetails(string moduleCodename); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Services/Interfaces/IModuleService.cs b/src/KInspector.Core/Services/Interfaces/IModuleService.cs new file mode 100644 index 00000000..fc0a3ab2 --- /dev/null +++ b/src/KInspector.Core/Services/Interfaces/IModuleService.cs @@ -0,0 +1,58 @@ +using KInspector.Core.Models; +using KInspector.Core.Modules; + +namespace KInspector.Core.Services.Interfaces +{ + /// + /// Contains methods for getting modules from repositories and executing them. + /// + public interface IModuleService : IService + { + /// + /// Gets the report with the provided codename, or null if it doesn't exist. + /// + IReport? GetReport(string codename); + + /// + /// Executes a report. + /// + /// The report to execute. + /// The function called when the results are returned. + Task GetReportResults(IReport report, Action callback); + + /// + /// Gets a list of filtered reports. + /// + /// If true, reports where the Kentico major version is not present in either + /// or are included. + /// If true, reports where the Kentico major version is present in + /// are included. + /// If provided, only reports with this tag are included. + /// If provided, only reports where contains the string are included. + IEnumerable GetReports(bool getUntested = false, bool getIncompatible = false, string? tag = null, string? name = null); + + /// + /// Gets a list of filtered actions. + /// + /// If true, actions where the Kentico major version is not present in either + /// or are included. + /// If true, actions where the Kentico major version is present in + /// are included. + /// If provided, only actions with this tag are included. + /// If provided, only actions where contains the string are included. + IEnumerable GetActions(bool getUntested = false, bool getIncompatible = false, string? tag = null, string? name = null); + + /// + /// Gets the action with the provided codename, or null if it doesn't exist. + /// + IAction? GetAction(string codename); + + /// + /// Executes an action. + /// + /// The action to execute. + /// A serialized object containing parameters to execute the action with. + /// The function called when the results are returned. + Task ExecuteAction(IAction action, string optionsJson, Action callback); + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Services/Interfaces/IService.cs b/src/KInspector.Core/Services/Interfaces/IService.cs new file mode 100644 index 00000000..0460ee5a --- /dev/null +++ b/src/KInspector.Core/Services/Interfaces/IService.cs @@ -0,0 +1,6 @@ +namespace KInspector.Core.Services.Interfaces +{ + public interface IService + { + } +} \ No newline at end of file diff --git a/src/KInspector.Core/Services/Interfaces/IVersionService.cs b/src/KInspector.Core/Services/Interfaces/IVersionService.cs new file mode 100644 index 00000000..70aa50ce --- /dev/null +++ b/src/KInspector.Core/Services/Interfaces/IVersionService.cs @@ -0,0 +1,26 @@ +using KInspector.Core.Models; + +namespace KInspector.Core.Services.Interfaces +{ + /// + /// Contains methods for getting version information from a Kentico instance. + /// + public interface IVersionService : IService + { + /// + /// Gets the version of the Kentico DLLs in the administration website, or null if not found. + /// + Version? GetKenticoAdministrationVersion(Instance instance); + + /// + /// Gets the version of the Kentico DLLs in the administration website, or null if not found. + /// + /// The root of the Kentico administration website. + Version? GetKenticoAdministrationVersion(string rootPath); + + /// + /// Gets the version in the Kentico database's CMS_SettingsKey table, or null if not found. + /// + Version? GetKenticoDatabaseVersion(DatabaseSettings databaseSettings); + } +} \ No newline at end of file diff --git a/KenticoInspector.Core/Tokens/Constants.cs b/src/KInspector.Core/Tokens/Constants.cs similarity index 90% rename from KenticoInspector.Core/Tokens/Constants.cs rename to src/KInspector.Core/Tokens/Constants.cs index b21305c2..c6e9348c 100644 --- a/KenticoInspector.Core/Tokens/Constants.cs +++ b/src/KInspector.Core/Tokens/Constants.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Core.Tokens +namespace KInspector.Core.Tokens { internal static class Constants { diff --git a/src/KInspector.Core/Tokens/ITokenExpression.cs b/src/KInspector.Core/Tokens/ITokenExpression.cs new file mode 100644 index 00000000..6058be14 --- /dev/null +++ b/src/KInspector.Core/Tokens/ITokenExpression.cs @@ -0,0 +1,7 @@ +namespace KInspector.Core.Tokens +{ + internal interface ITokenExpression + { + string? Resolve(string tokenExpression, IDictionary tokenDictionary); + } +} diff --git a/KenticoInspector.Core/Tokens/SimpleTokenExpression.cs b/src/KInspector.Core/Tokens/SimpleTokenExpression.cs similarity index 82% rename from KenticoInspector.Core/Tokens/SimpleTokenExpression.cs rename to src/KInspector.Core/Tokens/SimpleTokenExpression.cs index 5b8e18ab..72d614b1 100644 --- a/KenticoInspector.Core/Tokens/SimpleTokenExpression.cs +++ b/src/KInspector.Core/Tokens/SimpleTokenExpression.cs @@ -1,10 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using KInspector.Core.Extensions; -using KenticoInspector.Core.Extensions; - -namespace KenticoInspector.Core.Tokens +namespace KInspector.Core.Tokens { /// /// Represents tokens using a single token and having N cases and an optional default. @@ -14,21 +10,21 @@ internal class SimpleTokenExpression : ITokenExpression { private static readonly char[] expressionBoundary = new[] { '<', '>' }; - public string Resolve(string tokenExpression, IDictionary tokenDictionary) + public string? Resolve(string tokenExpression, IDictionary tokenDictionary) { var trimmedTokenExpression = tokenExpression.Trim(expressionBoundary); var expression = GetExpression(trimmedTokenExpression); - if (tokenDictionary.TryGetValue(expression.token, out object token)) + if (tokenDictionary.TryGetValue(expression.token, out object? token)) { foreach (var (value, operation, result) in expression.cases) { - var resolved = TryResolveToken(token, value, operation, result, out string resolvedToken); + var resolved = TryResolveToken(token, value, operation, result, out string? resolvedToken); if (resolved) return resolvedToken; } } - if (token == null) + if (token is null) { return string.Empty; } @@ -43,8 +39,8 @@ public string Resolve(string tokenExpression, IDictionary tokenD private ( string token, - IEnumerable<(string value, char operation, string result)> cases, - string defaultValue + IEnumerable<(string? value, char operation, string? result)> cases, + string? defaultValue ) GetExpression(string tokenExpression) { if (string.IsNullOrEmpty(tokenExpression)) @@ -54,8 +50,8 @@ string defaultValue if (segments[0].Contains(Constants.Colon)) throw new FormatException($"Simple token expression token '{segments[0]}' must not contain a {Constants.Colon}."); - var cases = new List<(string, char, string)>(); - string defaultValue = null; + var cases = new List<(string?, char, string?)>(); + string? defaultValue = null; switch (segments.Length) { @@ -81,7 +77,7 @@ string defaultValue return (segments[0], cases, defaultValue); } - private static (string, char, string) GetCase(string expressionCase) + private static (string?, char, string?) GetCase(string expressionCase) { var operation = Constants.Equals; var pair = expressionCase.SplitAtFirst(Constants.Colon); @@ -90,7 +86,7 @@ private static (string, char, string) GetCase(string expressionCase) return (null, operation, pair.first); } - var firstChar = pair.first[0]; + var firstChar = pair.first?[0] ?? char.MinValue; var operationChars = new[] { Constants.MoreThan, Constants.LessThan }; if (!operationChars.Contains(firstChar)) { @@ -102,20 +98,20 @@ private static (string, char, string) GetCase(string expressionCase) if (firstChar == item) operation = item; } - return (pair.first.Substring(1), operation, pair.second); + return (pair.first?.Substring(1), operation, pair.second); } public bool TryResolveToken( - object token, - string expressionCaseValue, + object? token, + string? expressionCaseValue, char operation, - string expressionCaseResult, - out string resolvedValue + string? expressionCaseResult, + out string? resolvedValue ) { var resolved = false; resolvedValue = null; - if (token == null) + if (token is null) { return resolved; } @@ -147,12 +143,12 @@ out string resolvedValue return resolved; } - private bool TryResolveIntToken(int token, string expressionCaseValue, char operation) + private bool TryResolveIntToken(int token, string? expressionCaseValue, char operation) { return TryResolveDoubleToken(token, expressionCaseValue, operation); } - private static bool TryResolveDoubleToken(double token, string expressionCaseValue, char operation) + private static bool TryResolveDoubleToken(double token, string? expressionCaseValue, char operation) { var expressionCaseValueIsDouble = double.TryParse(expressionCaseValue, out double doubleExpressionCaseValue); if (expressionCaseValueIsDouble) @@ -172,7 +168,7 @@ private static bool TryResolveDoubleToken(double token, string expressionCaseVal return false; } - private static bool TryResolveBoolToken(bool token, string expressionCaseValue) + private static bool TryResolveBoolToken(bool token, string? expressionCaseValue) { var expressionCaseValueIsBool = bool.TryParse(expressionCaseValue, out bool boolExpressionCaseValue); if (expressionCaseValueIsBool && token == boolExpressionCaseValue) @@ -183,7 +179,7 @@ private static bool TryResolveBoolToken(bool token, string expressionCaseValue) return false; } - private static bool TryResolveStringToken(string token, string expressionCaseValue) + private static bool TryResolveStringToken(string? token, string? expressionCaseValue) { if (token == expressionCaseValue) { diff --git a/KenticoInspector.Core/Tokens/TokenExpressionAttribute.cs b/src/KInspector.Core/Tokens/TokenExpressionAttribute.cs similarity index 83% rename from KenticoInspector.Core/Tokens/TokenExpressionAttribute.cs rename to src/KInspector.Core/Tokens/TokenExpressionAttribute.cs index e0ca5281..75f6e829 100644 --- a/KenticoInspector.Core/Tokens/TokenExpressionAttribute.cs +++ b/src/KInspector.Core/Tokens/TokenExpressionAttribute.cs @@ -1,6 +1,4 @@ -using System; - -namespace KenticoInspector.Core.Tokens +namespace KInspector.Core.Tokens { [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class TokenExpressionAttribute : Attribute diff --git a/KenticoInspector.Core/Tokens/TokenExpressionResolver.cs b/src/KInspector.Core/Tokens/TokenExpressionResolver.cs similarity index 86% rename from KenticoInspector.Core/Tokens/TokenExpressionResolver.cs rename to src/KInspector.Core/Tokens/TokenExpressionResolver.cs index f2fa0502..b9054f0b 100644 --- a/KenticoInspector.Core/Tokens/TokenExpressionResolver.cs +++ b/src/KInspector.Core/Tokens/TokenExpressionResolver.cs @@ -1,15 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; +using System.Reflection; using System.Runtime.CompilerServices; using System.Text.RegularExpressions; -namespace KenticoInspector.Core.Tokens +namespace KInspector.Core.Tokens { public static class TokenExpressionResolver { - private static IEnumerable<(Type tokenExpressionType, string pattern)> TokenExpressionTypePatterns { get; set; } + private static IEnumerable<(Type tokenExpressionType, string pattern)> TokenExpressionTypePatterns { get; set; } = Enumerable.Empty<(Type tokenExpressionType, string pattern)>(); public static void RegisterTokenExpressions(Assembly assembly) { @@ -50,7 +47,7 @@ internal static string ResolveTokenExpressions(string term, object tokenValues) .Select(tokenExpressionTypePattern => tokenExpressionTypePattern.pattern) .Where(pattern => !string.IsNullOrEmpty(pattern)); - var joinedTokenExpressionPatterns = string.Join(Constants.Pipe, allTokenExpressionPatterns); + var joinedTokenExpressionPatterns = string.Join(Constants.Pipe, allTokenExpressionPatterns ?? Enumerable.Empty()); var tokenDictionary = GetValuesDictionary(tokenValues); var resolvedExpressions = Regex.Split(term, joinedTokenExpressionPatterns) .Select(tokenExpression => ResolveTokenExpression(tokenExpression, tokenDictionary)); @@ -58,9 +55,9 @@ internal static string ResolveTokenExpressions(string term, object tokenValues) return string.Join(string.Empty, resolvedExpressions); } - private static IDictionary GetValuesDictionary(object tokenValues) + private static IDictionary GetValuesDictionary(object tokenValues) { - if (tokenValues is IDictionary dictionary) + if (tokenValues is IDictionary dictionary) { return dictionary; } @@ -75,26 +72,26 @@ private static IDictionary GetValuesDictionary(object tokenValue private static bool PropertyIsNotIndexableAndHasGetter(PropertyInfo prop) { return prop.GetIndexParameters().Length == 0 - && prop.GetMethod != null; + && prop.GetMethod is not null; } - private static string ResolveTokenExpression(string tokenExpression, IDictionary tokenDictionary) + private static string ResolveTokenExpression(string tokenExpression, IDictionary tokenDictionary) { var (leadingChar, innerTokenExpression, trailingChar) = GetSplitExpression(tokenExpression); - string resolvedExpression = null; + string? resolvedExpression = null; foreach (var (tokenExpressionType, pattern) in TokenExpressionTypePatterns) { if (Regex.IsMatch(innerTokenExpression, pattern)) { var expressionObject = RuntimeHelpers.GetUninitializedObject(tokenExpressionType) as ITokenExpression; - resolvedExpression = expressionObject.Resolve(innerTokenExpression, tokenDictionary); + resolvedExpression = expressionObject?.Resolve(innerTokenExpression, tokenDictionary); break; } } - if (string.IsNullOrEmpty(resolvedExpression) && leadingChar != null && trailingChar != null) + if (string.IsNullOrEmpty(resolvedExpression) && leadingChar is not null && trailingChar is not null) { return Constants.Space.ToString(); } diff --git a/KenticoInspector.Infrastructure/InfrastructureModule.cs b/src/KInspector.Infrastructure/InfrastructureModule.cs similarity index 85% rename from KenticoInspector.Infrastructure/InfrastructureModule.cs rename to src/KInspector.Infrastructure/InfrastructureModule.cs index 6f029a46..6c7eb242 100644 --- a/KenticoInspector.Infrastructure/InfrastructureModule.cs +++ b/src/KInspector.Infrastructure/InfrastructureModule.cs @@ -2,10 +2,10 @@ using Autofac; -using KenticoInspector.Core.Repositories.Interfaces; -using KenticoInspector.Core.Services.Interfaces; +using KInspector.Core.Repositories.Interfaces; +using KInspector.Core.Services.Interfaces; -namespace KenticoInspector.Infrastructure +namespace KInspector.Infrastructure { public class InfrastructureModule : Autofac.Module { diff --git a/KenticoInspector.Infrastructure/KenticoInspector.Infrastructure.csproj b/src/KInspector.Infrastructure/KInspector.Infrastructure.csproj similarity index 63% rename from KenticoInspector.Infrastructure/KenticoInspector.Infrastructure.csproj rename to src/KInspector.Infrastructure/KInspector.Infrastructure.csproj index 7b512d7f..0e9ca6c2 100644 --- a/KenticoInspector.Infrastructure/KenticoInspector.Infrastructure.csproj +++ b/src/KInspector.Infrastructure/KInspector.Infrastructure.csproj @@ -2,12 +2,6 @@ net8.0 - 9.0 - - - - - @@ -20,8 +14,7 @@ - - + diff --git a/src/KInspector.Infrastructure/Repositories/ActionRepository.cs b/src/KInspector.Infrastructure/Repositories/ActionRepository.cs new file mode 100644 index 00000000..00afe090 --- /dev/null +++ b/src/KInspector.Infrastructure/Repositories/ActionRepository.cs @@ -0,0 +1,20 @@ +using KInspector.Core.Modules; +using KInspector.Core.Repositories.Interfaces; + +namespace KInspector.Infrastructure.Repositories +{ + public class ActionRepository : IActionRepository + { + private readonly IEnumerable actions; + + public ActionRepository(IEnumerable actions) + { + this.actions = actions; + } + + public IAction? GetAction(string codename) => + actions.FirstOrDefault(x => x.Codename.Equals(codename, StringComparison.InvariantCultureIgnoreCase)); + + public IEnumerable GetActions() => actions; + } +} \ No newline at end of file diff --git a/src/KInspector.Infrastructure/Repositories/ReportRepository.cs b/src/KInspector.Infrastructure/Repositories/ReportRepository.cs new file mode 100644 index 00000000..a0ba6729 --- /dev/null +++ b/src/KInspector.Infrastructure/Repositories/ReportRepository.cs @@ -0,0 +1,20 @@ +using KInspector.Core.Modules; +using KInspector.Core.Repositories.Interfaces; + +namespace KInspector.Infrastructure.Repositories +{ + public class ReportRepository : IReportRepository + { + private readonly IEnumerable reports; + + public ReportRepository(IEnumerable reports) + { + this.reports = reports; + } + + public IReport? GetReport(string codename) => + reports.FirstOrDefault(x => x.Codename.Equals(codename, StringComparison.InvariantCultureIgnoreCase)); + + public IEnumerable GetReports() => reports; + } +} \ No newline at end of file diff --git a/src/KInspector.Infrastructure/Services/CmsFileService.cs b/src/KInspector.Infrastructure/Services/CmsFileService.cs new file mode 100644 index 00000000..f9adfa2b --- /dev/null +++ b/src/KInspector.Infrastructure/Services/CmsFileService.cs @@ -0,0 +1,60 @@ +using KInspector.Core.Constants; +using KInspector.Core.Services.Interfaces; + +using System.Xml; + +namespace KInspector.Core.Helpers +{ + public class CmsFileService : ICmsFileService + { + public string? GetCMSConnectionString(string? instanceRoot, string relativeWebConfigFilePath = DefaultKenticoPaths.WebConfigFile) + { + var webConfig = GetXmlDocument(instanceRoot, relativeWebConfigFilePath); + if (webConfig is null) + { + return null; + } + + return webConfig.SelectSingleNode("/configuration/connectionStrings/add[@name='CMSConnectionString']")?.Attributes?["connectionString"]?.Value; + } + + public Dictionary GetResourceStringsFromResx(string? instanceRoot, string relativeResxFilePath = DefaultKenticoPaths.PrimaryResxFile) + { + var resourceXml = GetXmlDocument(instanceRoot, relativeResxFilePath); + var resourceStringNodes = resourceXml?.SelectNodes("/root/data"); + var results = new Dictionary(); + if (resourceStringNodes is null) + { + return results; + } + + foreach (XmlNode resourceStringNode in resourceStringNodes) + { + var key = resourceStringNode.Attributes?["name"]?.InnerText.ToLowerInvariant(); + var value = resourceStringNode.SelectSingleNode("./value")?.InnerText; + if (key is null || value is null) + { + continue; + } + + results.Add(key, value); + } + + return results; + } + + public XmlDocument? GetXmlDocument(string? instanceRoot, string relativeFilePath) + { + var xmlDocument = new XmlDocument(); + try + { + xmlDocument.Load(instanceRoot + relativeFilePath); + return xmlDocument; + } + catch + { + return null; + } + } + } +} \ No newline at end of file diff --git a/src/KInspector.Infrastructure/Services/ConfigService.cs b/src/KInspector.Infrastructure/Services/ConfigService.cs new file mode 100644 index 00000000..ca6493b8 --- /dev/null +++ b/src/KInspector.Infrastructure/Services/ConfigService.cs @@ -0,0 +1,84 @@ +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; + +using Newtonsoft.Json; + +namespace KInspector.Infrastructure.Services +{ + public class ConfigService : IConfigService + { + private readonly string _saveFileLocation = $"{Directory.GetCurrentDirectory()}\\KInspector.config"; + + public bool DeleteInstance(Guid? guid) + { + var config = GetConfig(); + var totalRemoved = config.Instances.RemoveAll(i => i.Guid.Equals(guid)); + SaveConfig(config); + + return totalRemoved > 0; + } + + public Instance? GetInstance(Guid guid) + { + var config = GetConfig(); + + return config.Instances.FirstOrDefault(i => i.Guid.Equals(guid)); + } + + public InspectorConfig GetConfig() + { + if (File.Exists(_saveFileLocation)) + { + var saveFileContents = File.ReadAllText(_saveFileLocation); + var config = JsonConvert.DeserializeObject(saveFileContents); + + return config ?? new InspectorConfig(); + } + + var newConfig = new InspectorConfig(); + SaveConfig(newConfig); + + return newConfig; + } + + public Instance? GetCurrentInstance() + { + var config = GetConfig(); + + return config.Instances.FirstOrDefault(i => i.Guid == config.CurrentInstance); + } + + public Instance? SetCurrentInstance(Guid? guid) + { + var config = GetConfig(); + var selectedInstance = config.Instances.FirstOrDefault(i => i.Guid.Equals(guid)); + config.CurrentInstance = guid; + SaveConfig(config); + + return selectedInstance; + } + + public void UpsertInstance(Instance instance) + { + instance.Guid = instance.Guid == Guid.Empty ? Guid.NewGuid() : instance.Guid; + var config = GetConfig(); + var existingSettingsIndex = config.Instances.FindIndex(x => x.Guid.Equals(instance.Guid)); + if (existingSettingsIndex == -1) + { + config.Instances.Add(instance); + } + else + { + config.Instances[existingSettingsIndex] = instance; + } + + SaveConfig(config); + } + + private void SaveConfig(InspectorConfig config) + { + var jsonText = JsonConvert.SerializeObject(config, Formatting.Indented); + File.WriteAllText(_saveFileLocation, jsonText); + } + } +} \ No newline at end of file diff --git a/src/KInspector.Infrastructure/Services/DatabaseService.cs b/src/KInspector.Infrastructure/Services/DatabaseService.cs new file mode 100644 index 00000000..cab9da85 --- /dev/null +++ b/src/KInspector.Infrastructure/Services/DatabaseService.cs @@ -0,0 +1,131 @@ +using System.Data; + +using Dapper; + +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; + +namespace KInspector.Infrastructure.Services +{ + public class DatabaseService : IDatabaseService + { + private IDbConnection? _connection; + + public void Configure(DatabaseSettings databaseSettings) + { + _connection = DatabaseHelper.GetSqlConnection(databaseSettings); + } + + public Task ExecuteNonQuery(string relativeFilePath, dynamic parameters) + { + var query = FileHelper.GetSqlQueryText(relativeFilePath); + if (parameters is null) + { + return _connection.ExecuteAsync(query); + } + else + { + return _connection.ExecuteAsync(query, (object)parameters); + } + } + + public Task> ExecuteSqlFromFile(string relativeFilePath) + { + return ExecuteSqlFromFile(relativeFilePath, null, null); + } + + public Task> ExecuteSqlFromFile(string relativeFilePath, dynamic parameters) + { + return ExecuteSqlFromFile(relativeFilePath, null, parameters); + } + + public Task> ExecuteSqlFromFile(string relativeFilePath, IDictionary literalReplacements) + { + return ExecuteSqlFromFile(relativeFilePath, literalReplacements, null); + } + + public Task> ExecuteSqlFromFile(string relativeFilePath, IDictionary? literalReplacements, dynamic? parameters) + { + var query = FileHelper.GetSqlQueryText(relativeFilePath, literalReplacements); + if (parameters is null) + { + return _connection.QueryAsync(query); + } + else + { + return _connection.QueryAsync(query, (object)parameters); + } + } + + public async Task ExecuteSqlFromFileAsDataTable(string relativeFilePath) + { + var query = FileHelper.GetSqlQueryText(relativeFilePath); + var result = new DataTable(); + var data = await _connection.ExecuteReaderAsync(query); + result.Load(data); + + return result; + } + + public Task>> ExecuteSqlFromFileGeneric(string relativeFilePath) + { + return ExecuteSqlFromFileGeneric(relativeFilePath, null, null); + } + + public Task>> ExecuteSqlFromFileGeneric(string relativeFilePath, dynamic parameters) + { + return ExecuteSqlFromFileGeneric(relativeFilePath, null, parameters); + } + + public Task>> ExecuteSqlFromFileGeneric(string relativeFilePath, IDictionary literalReplacements) + { + return ExecuteSqlFromFileGeneric(relativeFilePath, literalReplacements, null); + } + + public async Task>> ExecuteSqlFromFileGeneric(string relativeFilePath, IDictionary? literalReplacements, dynamic? parameters) + { + var query = FileHelper.GetSqlQueryText(relativeFilePath, literalReplacements); + IEnumerable results; + if (parameters is null) + { + results = await _connection.QueryAsync(query); + } + else + { + results = await _connection.QueryAsync(query, (object)parameters); + } + + + return results.Select(x => (IDictionary)x); + } + + public Task ExecuteSqlFromFileScalar(string relativeFilePath) + { + return ExecuteSqlFromFileScalar(relativeFilePath, null, null); + } + + public Task ExecuteSqlFromFileScalar(string relativeFilePath, dynamic parameters) + { + return ExecuteSqlFromFileScalar(relativeFilePath, null, parameters); + } + + public Task ExecuteSqlFromFileScalar(string relativeFilePath, IDictionary literalReplacements) + { + return ExecuteSqlFromFileScalar(relativeFilePath, literalReplacements, null); + } + + public Task ExecuteSqlFromFileScalar(string relativeFilePath, IDictionary? literalReplacements, dynamic? parameters) + { + var query = FileHelper.GetSqlQueryText(relativeFilePath, literalReplacements); + if (parameters is null) + { + return _connection.QueryFirstAsync(query); + } + else + { + return _connection.QueryFirstAsync(query, (object)parameters); + } + } + } +} \ No newline at end of file diff --git a/src/KInspector.Infrastructure/Services/InstanceService.cs b/src/KInspector.Infrastructure/Services/InstanceService.cs new file mode 100644 index 00000000..ef40a2bf --- /dev/null +++ b/src/KInspector.Infrastructure/Services/InstanceService.cs @@ -0,0 +1,67 @@ +using Dapper; + +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; + +namespace KInspector.Infrastructure.Services +{ + public class InstanceService : IInstanceService + { + private readonly IConfigService _configService; + private readonly IVersionService _versionService; + + public InstanceService( + IConfigService configService, + IVersionService versionService) + { + _configService = configService; + _versionService = versionService; + } + + public InstanceDetails GetInstanceDetails(Guid instanceGuid) + { + var instance = _configService.GetInstance(instanceGuid) ?? throw new InvalidOperationException($"No instance with GUID '{instanceGuid}.'"); + + return GetInstanceDetails(instance); + } + + public InstanceDetails GetInstanceDetails(Instance? instance) + { + ArgumentNullException.ThrowIfNull(instance); + var instanceDetails = new InstanceDetails + { + AdministrationVersion = _versionService.GetKenticoAdministrationVersion(instance), + AdministrationDatabaseVersion = _versionService.GetKenticoDatabaseVersion(instance.DatabaseSettings), + Sites = GetSites(instance.DatabaseSettings) + }; + + return instanceDetails; + } + + private static IList GetSites(DatabaseSettings databaseSettings) + { + try + { + var query = @" + SELECT + SiteId as Id, + SiteName as Name, + SiteGUID as Guid, + SiteDomainName as DomainName, + SitePresentationURL as PresentationUrl, + SiteStatus as Status + FROM CMS_Site"; + + var connection = DatabaseHelper.GetSqlConnection(databaseSettings); + var sites = connection.Query(query).ToList(); + + return sites; + } + catch + { + return Array.Empty(); + } + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/Services/ModuleMetadataService.cs b/src/KInspector.Infrastructure/Services/ModuleMetadataService.cs similarity index 53% rename from KenticoInspector.Infrastructure/Services/ModuleMetadataService.cs rename to src/KInspector.Infrastructure/Services/ModuleMetadataService.cs index 03fc79b5..5b2b8c24 100644 --- a/KenticoInspector.Infrastructure/Services/ModuleMetadataService.cs +++ b/src/KInspector.Infrastructure/Services/ModuleMetadataService.cs @@ -1,37 +1,84 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Threading; - -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; -namespace KenticoInspector.Core.Helpers +namespace KInspector.Core.Helpers { public class ModuleMetadataService : IModuleMetadataService { private const string DEFAULT_CULTURE_NAME = "en-US"; - private readonly IInstanceService instanceService; + private readonly IConfigService configService; + private readonly IInstanceService instanceService; public string DefaultCultureName => DEFAULT_CULTURE_NAME; public string CurrentCultureName => Thread.CurrentThread.CurrentCulture.Name; - public ModuleMetadataService(IInstanceService instanceService) + public ModuleMetadataService(IConfigService configService, IInstanceService instanceService) { + this.configService = configService; this.instanceService = instanceService; } + public ModuleDetails GetModuleDetails(string moduleCodename) + { + var metadataDirectory = GetMetadataDirectory(moduleCodename); + var currentMetadata = DeserializeMetadataFromYamlFile( + metadataDirectory, + CurrentCultureName, + false + ); + var currentDetails = new ModuleDetails + { + Name = currentMetadata["details"]["name"], + ShortDescription = currentMetadata["details"]["shortDescription"], + LongDescription = currentMetadata["details"]["longDescription"], + }; + + var currentCultureIsDefaultCulture = CurrentCultureName == DEFAULT_CULTURE_NAME; + var mergedDetails = new ModuleDetails(); + if (!currentCultureIsDefaultCulture) + { + var defaultMetadata = DeserializeMetadataFromYamlFile( + metadataDirectory, + DefaultCultureName, + true + ); + + mergedDetails.Name = currentDetails.Name ?? defaultMetadata["details"]["name"]; + mergedDetails.ShortDescription = currentDetails.ShortDescription ?? defaultMetadata["details"]["shortDescription"]; + mergedDetails.LongDescription = currentDetails.LongDescription ?? defaultMetadata["details"]["longDescription"]; + } + + var details = currentCultureIsDefaultCulture ? currentDetails : mergedDetails; + var currentInstance = configService.GetCurrentInstance(); + var instanceDetails = instanceService.GetInstanceDetails(currentInstance); + var commonData = new + { + instanceUrl = currentInstance?.AdministrationUrl, + administrationVersion = instanceDetails.AdministrationVersion, + databaseVersion = instanceDetails.AdministrationDatabaseVersion + }; + + Term? name = details.Name; + details.Name = name.With(commonData); + + Term? shortDescription = details.ShortDescription; + details.ShortDescription = shortDescription.With(commonData); + + Term? longDescription = details.LongDescription; + details.LongDescription = longDescription.With(commonData); + + return details; + } + public ModuleMetadata GetModuleMetadata(string moduleCodename) where T : new() { - var metadataDirectory = $"{DirectoryHelper.GetExecutingDirectory()}\\{moduleCodename}\\Metadata\\"; - + var metadataDirectory = GetMetadataDirectory(moduleCodename); var currentMetadata = DeserializeMetadataFromYamlFile>( metadataDirectory, CurrentCultureName, @@ -39,9 +86,7 @@ public ModuleMetadata GetModuleMetadata(string moduleCodename) ); var currentCultureIsDefaultCulture = CurrentCultureName == DEFAULT_CULTURE_NAME; - var mergedMetadata = new ModuleMetadata(); - if (!currentCultureIsDefaultCulture) { var defaultMetadata = DeserializeMetadataFromYamlFile>( @@ -53,45 +98,43 @@ public ModuleMetadata GetModuleMetadata(string moduleCodename) mergedMetadata = GetMergedMetadata(defaultMetadata, currentMetadata); } - var ModuleMetadata = currentCultureIsDefaultCulture ? currentMetadata : mergedMetadata; - - var instanceDetails = instanceService.GetInstanceDetails(instanceService.CurrentInstance); - + var moduleMetadata = currentCultureIsDefaultCulture ? currentMetadata : mergedMetadata; + var currentInstance = configService.GetCurrentInstance(); + var instanceDetails = instanceService.GetInstanceDetails(currentInstance); var commonData = new { - instanceUrl = instanceService.CurrentInstance.AdminUrl, + instanceUrl = currentInstance?.AdministrationUrl, administrationVersion = instanceDetails.AdministrationVersion, - databaseVersion = instanceDetails.DatabaseVersion + databaseVersion = instanceDetails.AdministrationDatabaseVersion }; - Term name = ModuleMetadata.Details.Name; + Term? name = moduleMetadata.Details.Name; + moduleMetadata.Details.Name = name.With(commonData); - ModuleMetadata.Details.Name = name.With(commonData); + Term? shortDescription = moduleMetadata.Details.ShortDescription; + moduleMetadata.Details.ShortDescription = shortDescription.With(commonData); - Term shortDescription = ModuleMetadata.Details.ShortDescription; + Term? longDescription = moduleMetadata.Details.LongDescription; + moduleMetadata.Details.LongDescription = longDescription.With(commonData); - ModuleMetadata.Details.ShortDescription = shortDescription.With(commonData); - - Term longDescription = ModuleMetadata.Details.LongDescription; - - ModuleMetadata.Details.LongDescription = longDescription.With(commonData); - - return ModuleMetadata; + return moduleMetadata; } + private static string GetMetadataDirectory(string moduleCodename) => $"{DirectoryHelper.GetExecutingDirectory()}\\{moduleCodename}\\Metadata\\"; + private static T DeserializeMetadataFromYamlFile( string metadataDirectory, string cultureName, bool ignoreUnmatchedProperties) where T : new() { - var ModuleMetadataPath = new List { cultureName, DEFAULT_CULTURE_NAME } + var moduleMetadataPath = new List { cultureName, DEFAULT_CULTURE_NAME } .Select(culture => $"{metadataDirectory}{culture}.yaml") .FirstOrDefault(path => File.Exists(path)); - if (!String.IsNullOrEmpty(ModuleMetadataPath)) + if (!String.IsNullOrEmpty(moduleMetadataPath)) { - var fileText = File.ReadAllText(ModuleMetadataPath); + var fileText = File.ReadAllText(moduleMetadataPath); return DeserializeYaml(fileText, ignoreUnmatchedProperties); } @@ -124,10 +167,8 @@ private static ModuleMetadata GetMergedMetadata( var mergedMetadata = new ModuleMetadata(); mergedMetadata.Details.Name = overrideMetadata.Details.Name ?? defaultMetadata.Details.Name; - mergedMetadata.Details.ShortDescription = - overrideMetadata.Details.ShortDescription ?? defaultMetadata.Details.ShortDescription; - mergedMetadata.Details.LongDescription = - overrideMetadata.Details.LongDescription ?? defaultMetadata.Details.LongDescription; + mergedMetadata.Details.ShortDescription = overrideMetadata.Details.ShortDescription ?? defaultMetadata.Details.ShortDescription; + mergedMetadata.Details.LongDescription = overrideMetadata.Details.LongDescription ?? defaultMetadata.Details.LongDescription; RecursivelySetPropertyValues( typeof(T), @@ -152,7 +193,7 @@ private static void RecursivelySetPropertyValues( var defaultObjectPropertyValue = objectTypeProperty.GetValue(defaultObject); - object overrideObjectPropertyValue = overrideObject != null + object overrideObjectPropertyValue = overrideObject is not null ? objectTypeProperty.GetValue(overrideObject) : defaultObjectPropertyValue; diff --git a/src/KInspector.Infrastructure/Services/ModuleService.cs b/src/KInspector.Infrastructure/Services/ModuleService.cs new file mode 100644 index 00000000..ceba5b04 --- /dev/null +++ b/src/KInspector.Infrastructure/Services/ModuleService.cs @@ -0,0 +1,144 @@ +using KInspector.Core.Constants; +using KInspector.Core.Models; +using KInspector.Core.Modules; +using KInspector.Core.Repositories.Interfaces; +using KInspector.Core.Services.Interfaces; + +namespace KInspector.Infrastructure.Services +{ + public class ModuleService : IModuleService + { + private readonly IDatabaseService databaseService; + private readonly IConfigService configService; + private readonly IReportRepository reportRepository; + private readonly IActionRepository actionRepository; + private readonly IInstanceService instanceService; + private readonly IModuleMetadataService moduleMetadataService; + + public ModuleService( + IReportRepository reportRepository, + IActionRepository actionRepository, + IConfigService configService, + IDatabaseService databaseService, + IInstanceService instanceService, + IModuleMetadataService moduleMetadataService) + { + this.reportRepository = reportRepository; + this.actionRepository = actionRepository; + this.configService = configService; + this.databaseService = databaseService; + this.instanceService = instanceService; + this.moduleMetadataService = moduleMetadataService; + } + + public async Task ExecuteAction(IAction action, string optionsJson, Action callback) + { + var instance = configService.GetCurrentInstance() ?? throw new InvalidOperationException($"An instance must be connected.'"); + databaseService.Configure(instance.DatabaseSettings); + + var results = await action.Execute(optionsJson); + callback(results); + } + + public IAction? GetAction(string codename) => actionRepository.GetAction(codename); + + public IEnumerable GetActions(bool getUntested = false, bool getIncompatible = false, string? tag = null, string? name = null) + { + var instance = configService.GetCurrentInstance() ?? throw new InvalidOperationException("An instance must be connected."); + var instanceDetails = instanceService.GetInstanceDetails(instance); + var dbMajorVersion = instanceDetails?.AdministrationDatabaseVersion?.Major ?? 0; + var actions = actionRepository.GetActions(); + var filtered = actions.Where(r => r.CompatibleVersions.Select(v => v.Major).Contains(dbMajorVersion)); + if (getUntested) + { + filtered = filtered.Union(actions.Where(r => + !r.CompatibleVersions.Select(v => v.Major).Contains(dbMajorVersion) && + !r.IncompatibleVersions.Select(v => v.Major).Contains(dbMajorVersion) + )); + } + + if (getIncompatible) + { + filtered = filtered.Union(actions.Where(r => r.IncompatibleVersions.Select(v => v.Major).Contains(dbMajorVersion))); + } + + if (!string.IsNullOrEmpty(tag)) + { + filtered = filtered.Where(r => r.Tags.Contains(tag)); + } + + if (!string.IsNullOrEmpty(name)) + { + filtered = filtered.Where(r => + { + var details = moduleMetadataService.GetModuleDetails(r.Codename); + + return details.Name?.Contains(name, StringComparison.InvariantCultureIgnoreCase) ?? true; + }); + } + + return filtered.OrderBy(r => r.Codename); + } + + public IReport? GetReport(string codename) => reportRepository.GetReport(codename); + + public async Task GetReportResults(IReport report, Action callback) + { + var instance = configService.GetCurrentInstance() ?? throw new InvalidOperationException($"An instance must be connected.'"); + databaseService.Configure(instance.DatabaseSettings); + + try + { + var results = await report.GetResults(); + callback(results); + } + catch (Exception ex) + { + callback(new ModuleResults + { + Status = ResultsStatus.Error, + Summary = ex.Message, + Type = ResultsType.NoResults + }); + } + } + + public IEnumerable GetReports(bool getUntested = false, bool getIncompatible = false, string? tag = null, string? name = null) + { + var instance = configService.GetCurrentInstance() ?? throw new InvalidOperationException("An instance must be connected."); + var instanceDetails = instanceService.GetInstanceDetails(instance); + var dbMajorVersion = instanceDetails?.AdministrationDatabaseVersion?.Major ?? 0; + var reports = reportRepository.GetReports(); + var filtered = reports.Where(r => r.CompatibleVersions.Select(v => v.Major).Contains(dbMajorVersion)); + if (getUntested) + { + filtered = filtered.Union(reports.Where(r => + !r.CompatibleVersions.Select(v => v.Major).Contains(dbMajorVersion) && + !r.IncompatibleVersions.Select(v => v.Major).Contains(dbMajorVersion) + )); + } + + if (getIncompatible) + { + filtered = filtered.Union(reports.Where(r => r.IncompatibleVersions.Select(v => v.Major).Contains(dbMajorVersion))); + } + + if (!string.IsNullOrEmpty(tag)) + { + filtered = filtered.Where(r => r.Tags.Contains(tag)); + } + + if (!string.IsNullOrEmpty(name)) + { + filtered = filtered.Where(r => + { + var details = moduleMetadataService.GetModuleDetails(r.Codename); + + return details.Name?.Contains(name, StringComparison.InvariantCultureIgnoreCase) ?? true; + }); + } + + return filtered.OrderBy(r => r.Codename); + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Infrastructure/Repositories/VersionRepository.cs b/src/KInspector.Infrastructure/Services/VersionService.cs similarity index 64% rename from KenticoInspector.Infrastructure/Repositories/VersionRepository.cs rename to src/KInspector.Infrastructure/Services/VersionService.cs index 95c8a415..834c9eea 100644 --- a/KenticoInspector.Infrastructure/Repositories/VersionRepository.cs +++ b/src/KInspector.Infrastructure/Services/VersionService.cs @@ -1,15 +1,11 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; +using System.Diagnostics; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Repositories.Interfaces; -using KenticoInspector.Core.Services.Interfaces; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; -namespace KenticoInspector.Infrastructure.Services +namespace KInspector.Infrastructure.Services { - public class VersionRepository : IVersionRepository + public class VersionService : IVersionService { private readonly IDatabaseService databaseService; @@ -20,17 +16,17 @@ public class VersionRepository : IVersionRepository private const string _relativeHotfixFileFolderPath = "App_Data\\Install"; private const string _hotfixFile = "Hotfix.txt"; - public VersionRepository(IDatabaseService databaseService) + public VersionService(IDatabaseService databaseService) { this.databaseService = databaseService; } - public Version GetKenticoAdministrationVersion(Instance instance) + public Version? GetKenticoAdministrationVersion(Instance instance) { - return GetKenticoAdministrationVersion(instance.AdminPath); + return string.IsNullOrEmpty(instance.AdministrationPath) ? null : GetKenticoAdministrationVersion(instance.AdministrationPath); } - public Version GetKenticoAdministrationVersion(string rootPath) + public Version? GetKenticoAdministrationVersion(string rootPath) { if (!Directory.Exists(rootPath)) { @@ -67,18 +63,17 @@ public Version GetKenticoAdministrationVersion(string rootPath) return new Version(version); } - public Version GetKenticoDatabaseVersion(Instance instance) + public Version? GetKenticoDatabaseVersion(DatabaseSettings databaseSettings) { - return GetKenticoDatabaseVersion(instance.DatabaseSettings); - } - - public Version GetKenticoDatabaseVersion(DatabaseSettings databaseSettings) - { - var settingsKeys = databaseService.ExecuteSqlFromFile(getCmsSettingsPath) - .ToList(); + databaseService.Configure(databaseSettings); + var settingsKeys = databaseService.ExecuteSqlFromFile(getCmsSettingsPath).ConfigureAwait(false).GetAwaiter().GetResult(); + var settingsList = settingsKeys.ToList(); + var version = settingsList[0]; + var hotfix = settingsList[1]; - var version = settingsKeys[0]; - var hotfix = settingsKeys[1]; + if (version is null || hotfix is null) { + return null; + } return new Version($"{version}.{hotfix}"); } diff --git a/KenticoInspector.Reports/ApplicationRestartAnalysis/Metadata/en-US.yaml b/src/KInspector.Reports/ApplicationRestartAnalysis/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/ApplicationRestartAnalysis/Metadata/en-US.yaml rename to src/KInspector.Reports/ApplicationRestartAnalysis/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/ApplicationRestartAnalysis/Models/Data/CmsEventLog.cs b/src/KInspector.Reports/ApplicationRestartAnalysis/Models/Data/CmsEventLog.cs new file mode 100644 index 00000000..c0857b2c --- /dev/null +++ b/src/KInspector.Reports/ApplicationRestartAnalysis/Models/Data/CmsEventLog.cs @@ -0,0 +1,13 @@ +namespace KInspector.Reports.ApplicationRestartAnalysis.Models.Data +{ + public class CmsEventLog + { + public int EventID { get; set; } + + public string? EventCode { get; set; } + + public DateTime EventTime { get; set; } + + public string? EventMachineName { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/ApplicationRestartAnalysis/Models/Terms.cs b/src/KInspector.Reports/ApplicationRestartAnalysis/Models/Terms.cs new file mode 100644 index 00000000..e961a195 --- /dev/null +++ b/src/KInspector.Reports/ApplicationRestartAnalysis/Models/Terms.cs @@ -0,0 +1,23 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.ApplicationRestartAnalysis.Models +{ + public class Terms + { + public Summaries? Summaries { get; set; } + + public TableTitles? TableTitles { get; set; } + } + + public class Summaries + { + public Term? Good { get; set; } + + public Term? Information { get; set; } + } + + public class TableTitles + { + public Term? ApplicationRestartEvents { get; set; } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/ApplicationRestartAnalysis/Report.cs b/src/KInspector.Reports/ApplicationRestartAnalysis/Report.cs similarity index 56% rename from KenticoInspector.Reports/ApplicationRestartAnalysis/Report.cs rename to src/KInspector.Reports/ApplicationRestartAnalysis/Report.cs index b124878e..97885f17 100644 --- a/KenticoInspector.Reports/ApplicationRestartAnalysis/Report.cs +++ b/src/KInspector.Reports/ApplicationRestartAnalysis/Report.cs @@ -1,16 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.ApplicationRestartAnalysis.Models; +using KInspector.Reports.ApplicationRestartAnalysis.Models.Data; -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.ApplicationRestartAnalysis.Models; -using KenticoInspector.Reports.ApplicationRestartAnalysis.Models.Data; - -namespace KenticoInspector.Reports.ApplicationRestartAnalysis +namespace KInspector.Reports.ApplicationRestartAnalysis { public class Report : AbstractReport { @@ -20,8 +16,8 @@ public class Report : AbstractReport public override IList Tags => new List { - ReportTags.EventLog, - ReportTags.Health + ModuleTags.EventLog, + ModuleTags.Health }; public Report( @@ -32,21 +28,21 @@ IModuleMetadataService moduleMetadataService this.databaseService = databaseService; } - public override ReportResults GetResults() + public async override Task GetResults() { - var cmsEventLogs = databaseService.ExecuteSqlFromFile(Scripts.GetCmsEventLogsWithStartOrEndCode); + var cmsEventLogs = await databaseService.ExecuteSqlFromFile(Scripts.GetCmsEventLogsWithStartOrEndCode); return CompileResults(cmsEventLogs); } - private ReportResults CompileResults(IEnumerable cmsEventLogs) + private ModuleResults CompileResults(IEnumerable cmsEventLogs) { if (!cmsEventLogs.Any()) { - return new ReportResults + return new ModuleResults { Status = ResultsStatus.Good, - Summary = Metadata.Terms.Summaries.Good + Summary = Metadata.Terms.Summaries?.Good }; } @@ -61,7 +57,7 @@ private ReportResults CompileResults(IEnumerable cmsEventLogs) ? cmsEventLogs.Max(e => e.EventTime) : new DateTime(); - var summary = Metadata.Terms.Summaries.Information.With(new + var summary = Metadata.Terms.Summaries?.Information?.With(new { earliestTime, latestTime, @@ -70,19 +66,19 @@ private ReportResults CompileResults(IEnumerable cmsEventLogs) totalStartEvents }); - var data = new TableResult() - { - Name = Metadata.Terms.TableTitles.ApplicationRestartEvents, - Rows = cmsEventLogs - }; - - return new ReportResults + var results = new ModuleResults { - Data = data, - Status = ResultsStatus.Information, Summary = summary, - Type = ResultsType.Table + Type = ResultsType.TableList, + Status = ResultsStatus.Information }; + results.TableResults.Add(new TableResult() + { + Name = Metadata.Terms.TableTitles?.ApplicationRestartEvents, + Rows = cmsEventLogs + }); + + return results; } } } \ No newline at end of file diff --git a/KenticoInspector.Reports/ApplicationRestartAnalysis/Scripts.cs b/src/KInspector.Reports/ApplicationRestartAnalysis/Scripts.cs similarity index 80% rename from KenticoInspector.Reports/ApplicationRestartAnalysis/Scripts.cs rename to src/KInspector.Reports/ApplicationRestartAnalysis/Scripts.cs index 5e799dca..d804fe04 100644 --- a/KenticoInspector.Reports/ApplicationRestartAnalysis/Scripts.cs +++ b/src/KInspector.Reports/ApplicationRestartAnalysis/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.ApplicationRestartAnalysis +namespace KInspector.Reports.ApplicationRestartAnalysis { public static class Scripts { diff --git a/KenticoInspector.Reports/ApplicationRestartAnalysis/Scripts/GetCmsEventLogsWithStartOrEndCode.sql b/src/KInspector.Reports/ApplicationRestartAnalysis/Scripts/GetCmsEventLogsWithStartOrEndCode.sql similarity index 100% rename from KenticoInspector.Reports/ApplicationRestartAnalysis/Scripts/GetCmsEventLogsWithStartOrEndCode.sql rename to src/KInspector.Reports/ApplicationRestartAnalysis/Scripts/GetCmsEventLogsWithStartOrEndCode.sql diff --git a/KenticoInspector.Reports/ClassTableValidation/Metadata/en-US.yaml b/src/KInspector.Reports/ClassTableValidation/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/ClassTableValidation/Metadata/en-US.yaml rename to src/KInspector.Reports/ClassTableValidation/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/ClassTableValidation/Models/ClassWithNoTable.cs b/src/KInspector.Reports/ClassTableValidation/Models/ClassWithNoTable.cs new file mode 100644 index 00000000..846ef891 --- /dev/null +++ b/src/KInspector.Reports/ClassTableValidation/Models/ClassWithNoTable.cs @@ -0,0 +1,11 @@ +namespace KInspector.Reports.ClassTableValidation.Models +{ + public class ClassWithNoTable + { + public string? ClassDisplayName { get; set; } + + public string? ClassName { get; set; } + + public string? ClassTableName { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/ClassTableValidation/Models/TableWithNoClass.cs b/src/KInspector.Reports/ClassTableValidation/Models/TableWithNoClass.cs new file mode 100644 index 00000000..fb3e3f59 --- /dev/null +++ b/src/KInspector.Reports/ClassTableValidation/Models/TableWithNoClass.cs @@ -0,0 +1,7 @@ +namespace KInspector.Reports.ClassTableValidation.Models +{ + public class TableWithNoClass + { + public string? TableName { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/ClassTableValidation/Models/Terms.cs b/src/KInspector.Reports/ClassTableValidation/Models/Terms.cs new file mode 100644 index 00000000..a1273d51 --- /dev/null +++ b/src/KInspector.Reports/ClassTableValidation/Models/Terms.cs @@ -0,0 +1,12 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.ClassTableValidation.Models +{ + public class Terms + { + public Term? CountIssueFound { get; set; } + public Term? DatabaseTablesWithMissingKenticoClasses { get; set; } + public Term? KenticoClassesWithMissingDatabaseTables { get; set; } + public Term? NoIssuesFound { get; set; } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/ClassTableValidation/Report.cs b/src/KInspector.Reports/ClassTableValidation/Report.cs similarity index 55% rename from KenticoInspector.Reports/ClassTableValidation/Report.cs rename to src/KInspector.Reports/ClassTableValidation/Report.cs index c18aa5d5..d5bcc39e 100644 --- a/KenticoInspector.Reports/ClassTableValidation/Report.cs +++ b/src/KInspector.Reports/ClassTableValidation/Report.cs @@ -1,115 +1,104 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.ClassTableValidation.Models; - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace KenticoInspector.Reports.ClassTableValidation +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.ClassTableValidation.Models; + +namespace KInspector.Reports.ClassTableValidation { public class Report : AbstractReport { private readonly IDatabaseService databaseService; private readonly IInstanceService instanceService; + private readonly IConfigService configService; public Report( IDatabaseService databaseService, IInstanceService instanceService, - IModuleMetadataService moduleMetadataService + IModuleMetadataService moduleMetadataService, + IConfigService configService ) : base(moduleMetadataService) { this.databaseService = databaseService; this.instanceService = instanceService; + this.configService = configService; } public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); public override IList Tags => new List { - ReportTags.Health, + ModuleTags.Health, }; - public override ReportResults GetResults() + public async override Task GetResults() { - var instance = instanceService.CurrentInstance; - + var instance = configService.GetCurrentInstance(); var instanceDetails = instanceService.GetInstanceDetails(instance); - - var tablesWithMissingClass = GetResultsForTables(instanceDetails); - var classesWithMissingTable = GetResultsForClasses(); + var tablesWithMissingClass = await GetResultsForTables(instanceDetails); + var classesWithMissingTable = await GetResultsForClasses(); return CompileResults(tablesWithMissingClass, classesWithMissingTable); } - private ReportResults CompileResults(IEnumerable tablesWithMissingClass, IEnumerable classesWithMissingTable) + private ModuleResults CompileResults(IEnumerable tablesWithMissingClass, IEnumerable classesWithMissingTable) { var tableErrors = tablesWithMissingClass.Count(); - var tableResults = new TableResult() + var tableResults = new TableResult() { Name = Metadata.Terms.DatabaseTablesWithMissingKenticoClasses, Rows = tablesWithMissingClass }; var classErrors = classesWithMissingTable.Count(); - var classResults = new TableResult() + var classResults = new TableResult() { Name = Metadata.Terms.KenticoClassesWithMissingDatabaseTables, Rows = classesWithMissingTable }; var totalErrors = tableErrors + classErrors; - - var results = new ReportResults - { - Type = ResultsType.TableList - }; - - results.Data.TableResults = tableResults; - results.Data.ClassResults = classResults; - + var results = new ModuleResults(); switch (totalErrors) { case 0: results.Status = ResultsStatus.Good; results.Summary = Metadata.Terms.NoIssuesFound; + results.Type = ResultsType.NoResults; break; default: results.Status = ResultsStatus.Error; - results.Summary = Metadata.Terms.CountIssueFound.With(new { count = totalErrors }); + results.Summary = Metadata.Terms.CountIssueFound?.With(new { count = totalErrors }); + results.Type = ResultsType.TableList; + results.TableResults.Add(tableResults); + results.TableResults.Add(classResults); break; } return results; } - private IEnumerable GetResultsForClasses() - { - var classesWithMissingTable = databaseService.ExecuteSqlFromFile(Scripts.ClassesWithNoTable); - return classesWithMissingTable; - } + private Task> GetResultsForClasses() => databaseService.ExecuteSqlFromFile(Scripts.ClassesWithNoTable); - private IEnumerable GetResultsForTables(InstanceDetails instanceDetails) + private async Task> GetResultsForTables(InstanceDetails instanceDetails) { - var tablesWithMissingClass = databaseService.ExecuteSqlFromFile(Scripts.TablesWithNoClass); + var tablesWithMissingClass = await databaseService.ExecuteSqlFromFile(Scripts.TablesWithNoClass); - var tableWhitelist = GetTableWhitelist(instanceDetails.DatabaseVersion); + var tableWhitelist = GetTableWhitelist(instanceDetails.AdministrationDatabaseVersion); if (tableWhitelist.Count > 0) { - tablesWithMissingClass = tablesWithMissingClass.Where(t => !tableWhitelist.Contains(t.TableName)).ToList(); + tablesWithMissingClass = tablesWithMissingClass.Where(t => !tableWhitelist.Contains(t.TableName ?? string.Empty)).ToList(); } return tablesWithMissingClass; } - private List GetTableWhitelist(Version version) + private static List GetTableWhitelist(Version? version) { var whitelist = new List(); - if (version.Major >= 10) + if (version?.Major >= 10) { whitelist.Add("CI_Migration"); } diff --git a/KenticoInspector.Reports/ClassTableValidation/Scripts.cs b/src/KInspector.Reports/ClassTableValidation/Scripts.cs similarity index 85% rename from KenticoInspector.Reports/ClassTableValidation/Scripts.cs rename to src/KInspector.Reports/ClassTableValidation/Scripts.cs index b8b73abc..485066b0 100644 --- a/KenticoInspector.Reports/ClassTableValidation/Scripts.cs +++ b/src/KInspector.Reports/ClassTableValidation/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.ClassTableValidation +namespace KInspector.Reports.ClassTableValidation { public static class Scripts { diff --git a/KenticoInspector.Reports/ClassTableValidation/Scripts/ClassesWithNoTable.sql b/src/KInspector.Reports/ClassTableValidation/Scripts/ClassesWithNoTable.sql similarity index 100% rename from KenticoInspector.Reports/ClassTableValidation/Scripts/ClassesWithNoTable.sql rename to src/KInspector.Reports/ClassTableValidation/Scripts/ClassesWithNoTable.sql diff --git a/KenticoInspector.Reports/ClassTableValidation/Scripts/TablesWithNoClass.sql b/src/KInspector.Reports/ClassTableValidation/Scripts/TablesWithNoClass.sql similarity index 100% rename from KenticoInspector.Reports/ClassTableValidation/Scripts/TablesWithNoClass.sql rename to src/KInspector.Reports/ClassTableValidation/Scripts/TablesWithNoClass.sql diff --git a/KenticoInspector.Reports/ColumnFieldValidation/Metadata/en-US.yaml b/src/KInspector.Reports/ColumnFieldValidation/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/ColumnFieldValidation/Metadata/en-US.yaml rename to src/KInspector.Reports/ColumnFieldValidation/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/ColumnFieldValidation/Models/Data/CmsClass.cs b/src/KInspector.Reports/ColumnFieldValidation/Models/Data/CmsClass.cs new file mode 100644 index 00000000..ad1ea7d2 --- /dev/null +++ b/src/KInspector.Reports/ColumnFieldValidation/Models/Data/CmsClass.cs @@ -0,0 +1,17 @@ +using System.Xml.Linq; + +namespace KInspector.Reports.ColumnFieldValidation.Models.Data +{ + public class CmsClass + { + public int ClassID { get; set; } + + public string? ClassName { get; set; } + + public string? ClassDisplayName { get; set; } + + public string? ClassTableName { get; set; } + + public XDocument? ClassXmlSchema { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/ColumnFieldValidation/Models/Data/TableColumn.cs b/src/KInspector.Reports/ColumnFieldValidation/Models/Data/TableColumn.cs new file mode 100644 index 00000000..6ca623ef --- /dev/null +++ b/src/KInspector.Reports/ColumnFieldValidation/Models/Data/TableColumn.cs @@ -0,0 +1,11 @@ +namespace KInspector.Reports.ColumnFieldValidation.Models.Data +{ + public class TableColumn + { + public string? Table_Name { get; set; } + + public string? Column_Name { get; set; } + + public string? Data_Type { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/ColumnFieldValidation/Models/Results/CmsClassResult.cs b/src/KInspector.Reports/ColumnFieldValidation/Models/Results/CmsClassResult.cs new file mode 100644 index 00000000..bfca1438 --- /dev/null +++ b/src/KInspector.Reports/ColumnFieldValidation/Models/Results/CmsClassResult.cs @@ -0,0 +1,15 @@ +namespace KInspector.Reports.ColumnFieldValidation.Models.Results +{ + public class CmsClassResult + { + public int ClassID { get; set; } + + public string? ClassName { get; set; } + + public string? ClassDisplayName { get; set; } + + public string? ClassTableName { get; set; } + + public string? ClassFieldsNotInTable { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/ColumnFieldValidation/Models/Results/TableValidationResult.cs b/src/KInspector.Reports/ColumnFieldValidation/Models/Results/TableValidationResult.cs new file mode 100644 index 00000000..65d9523a --- /dev/null +++ b/src/KInspector.Reports/ColumnFieldValidation/Models/Results/TableValidationResult.cs @@ -0,0 +1,9 @@ +namespace KInspector.Reports.ColumnFieldValidation.Models.Results +{ + public class TableValidationResult + { + public string? TableName { get; set; } + + public string? TableColumnsNotInClass { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/ColumnFieldValidation/Models/Terms.cs b/src/KInspector.Reports/ColumnFieldValidation/Models/Terms.cs new file mode 100644 index 00000000..3faf45b0 --- /dev/null +++ b/src/KInspector.Reports/ColumnFieldValidation/Models/Terms.cs @@ -0,0 +1,25 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.ColumnFieldValidation.Models +{ + public class Terms + { + public Summaries? Summaries { get; set; } + + public TableTitles? TableTitles { get; set; } + } + + public class Summaries + { + public Term? Error { get; set; } + + public Term? Good { get; set; } + } + + public class TableTitles + { + public Term? ClassesWithAddedFields { get; set; } + + public Term? TablesWithAddedColumns { get; set; } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/ColumnFieldValidation/Report.cs b/src/KInspector.Reports/ColumnFieldValidation/Report.cs similarity index 63% rename from KenticoInspector.Reports/ColumnFieldValidation/Report.cs rename to src/KInspector.Reports/ColumnFieldValidation/Report.cs index 3225b156..7cc7d75a 100644 --- a/KenticoInspector.Reports/ColumnFieldValidation/Report.cs +++ b/src/KInspector.Reports/ColumnFieldValidation/Report.cs @@ -1,18 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml.Linq; - -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.ColumnFieldValidation.Models; -using KenticoInspector.Reports.ColumnFieldValidation.Models.Data; -using KenticoInspector.Reports.ColumnFieldValidation.Models.Results; - -namespace KenticoInspector.Reports.ColumnFieldValidation +using System.Xml.Linq; + +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.ColumnFieldValidation.Models; +using KInspector.Reports.ColumnFieldValidation.Models.Data; +using KInspector.Reports.ColumnFieldValidation.Models.Results; + +namespace KInspector.Reports.ColumnFieldValidation { public class Report : AbstractReport { @@ -30,21 +27,19 @@ IModuleMetadataService moduleMetadataService public override IList Tags => new List { - ReportTags.Consistency, - ReportTags.Health + ModuleTags.Consistency, + ModuleTags.Health }; - public override ReportResults GetResults() + public async override Task GetResults() { - var cmsClasses = databaseService.ExecuteSqlFromFile(Scripts.GetCmsClasses); + var cmsClasses = await databaseService.ExecuteSqlFromFile(Scripts.GetCmsClasses); - var classTableNames = cmsClasses - .Select(cmsClass => cmsClass.ClassTableName); - - var tableColumns = databaseService.ExecuteSqlFromFile( + var classTableNames = cmsClasses.Select(cmsClass => cmsClass.ClassTableName); + var tableColumns = await databaseService.ExecuteSqlFromFile( Scripts.GetTableColumns, new { classTableNames } - ); + ); var cmsClassesWithAddedFields = GetCmsClassesWithAddedFields(cmsClasses, tableColumns); var tablesWithAddedColumns = GetTablesWithAddedColumns(tableColumns, cmsClasses); @@ -59,23 +54,24 @@ IEnumerable tableColumns { foreach (var cmsClass in cmsClasses) { - var classFieldNameTypes = cmsClass.ClassXmlSchema + var classFieldNameTypes = cmsClass.ClassXmlSchema? .Descendants() .Where(element => element.Name.LocalName == "element") - .Where(element => element.Attribute("name").Value != "NewDataSet") - .Where(element => element.Attribute("name").Value != cmsClass.ClassTableName) + .Where(element => element.Attribute("name")?.Value != "NewDataSet") + .Where(element => element.Attribute("name")?.Value != cmsClass.ClassTableName) .Select(GetClassFieldNameType); var tableColumnNameTypes = tableColumns - .Where(tableColumn => tableColumn.Table_Name.Equals( + .Where(tableColumn => tableColumn.Table_Name?.Equals( cmsClass.ClassTableName, StringComparison.InvariantCultureIgnoreCase - )); + ) ?? false); - var addedFields = classFieldNameTypes + var addedFields = classFieldNameTypes? .Where(classFieldNameType => !tableColumnNameTypes .Any(tableColumnNameType => classFieldNameType.Name == tableColumnNameType.Column_Name - && classFieldNameType.Type.StartsWith(tableColumnNameType.Data_Type))); + && (classFieldNameType.Type?.StartsWith(tableColumnNameType.Data_Type) ?? false))) + ?? Enumerable.Empty<(string? Name, string? Type)>(); if (addedFields.Any()) { @@ -91,7 +87,7 @@ IEnumerable tableColumns } } - private IEnumerable GetTablesWithAddedColumns( + private IEnumerable GetTablesWithAddedColumns( IEnumerable tableColumns, IEnumerable cmsClasses ) @@ -102,27 +98,27 @@ IEnumerable cmsClasses foreach (var tableColumnNameTypes in tableColumnGroups) { var matchingCmsClass = cmsClasses - .First(cmsClass => cmsClass.ClassTableName.Equals( + .First(cmsClass => cmsClass.ClassTableName?.Equals( tableColumnNameTypes.Key, StringComparison.InvariantCultureIgnoreCase - )); + ) ?? false); - var classFieldNameTypes = matchingCmsClass.ClassXmlSchema + var classFieldNameTypes = matchingCmsClass.ClassXmlSchema? .Descendants() .Where(element => element.Name.LocalName == "element") - .Where(element => element.Attribute("name").Value != "NewDataSet") - .Where(element => element.Attribute("name").Value != matchingCmsClass.ClassTableName) - .Select(GetClassFieldNameType); + .Where(element => element.Attribute("name")?.Value != "NewDataSet") + .Where(element => element.Attribute("name")?.Value != matchingCmsClass.ClassTableName) + .Select(GetClassFieldNameType) ?? Enumerable.Empty<(string? Name, string? Type)>(); var addedColumns = tableColumnNameTypes .Where(tableColumnNameType => !classFieldNameTypes - .Any(classFieldNameType => classFieldNameType.Name == tableColumnNameType.Column_Name - && classFieldNameType.Type.StartsWith(tableColumnNameType.Data_Type))) + .Any(classFieldNameType => (classFieldNameType.Name?.Equals(tableColumnNameType.Column_Name) ?? false) + && (classFieldNameType.Type?.StartsWith(tableColumnNameType.Data_Type) ?? false))) .Select(column => (column.Column_Name, column.Data_Type)); if (addedColumns.Any()) { - yield return new TableResult() + yield return new TableValidationResult() { TableColumnsNotInClass = string.Join(", ", addedColumns), TableName = tableColumnNameTypes.Key @@ -131,21 +127,21 @@ IEnumerable cmsClasses } } - private (string Name, string Type) GetClassFieldNameType(XElement element) + private (string? Name, string? Type) GetClassFieldNameType(XElement element) { - string name = element.Attribute("name").Value; - string type = string.Empty; + string? name = element.Attribute("name")?.Value; + string? type = string.Empty; - if (element.Attribute("type") != null) + if (element.Attribute("type") is not null) { - type = element.Attribute("type").Value; + type = element.Attribute("type")?.Value; } var attributeDataType = element .Attributes() .FirstOrDefault(attribute => attribute.Name.LocalName == "DataType"); - if (attributeDataType != null) + if (attributeDataType is not null) { type = attributeDataType.Value; } @@ -154,9 +150,9 @@ IEnumerable cmsClasses .Descendants() .FirstOrDefault(childElement => childElement.Name.LocalName == "restriction"); - if (childElementWithType?.Attribute("base") != null) + if (childElementWithType?.Attribute("base") is not null) { - type = childElementWithType.Attribute("base").Value; + type = childElementWithType.Attribute("base")?.Value; } switch (type) @@ -201,60 +197,57 @@ IEnumerable cmsClasses return (name, type); } - private ReportResults CompileResults( + private ModuleResults CompileResults( IEnumerable cmsClassesWithAddedFields, - IEnumerable tablesWithAddedColumns + IEnumerable tablesWithAddedColumns ) { if (!cmsClassesWithAddedFields.Any() && !tablesWithAddedColumns.Any()) { - return new ReportResults() + return new ModuleResults() { Status = ResultsStatus.Good, - Summary = Metadata.Terms.Summaries.Good + Summary = Metadata.Terms.Summaries?.Good, + Type = ResultsType.NoResults }; } - var errorReportResults = new ReportResults + var errorModuleResults = new ModuleResults { Type = ResultsType.TableList, Status = ResultsStatus.Error }; var cmsClassesResultCount = IfAnyAddTableResult( - errorReportResults.Data, + errorModuleResults.TableResults, cmsClassesWithAddedFields, - Metadata.Terms.TableTitles.ClassesWithAddedFields + Metadata.Terms.TableTitles?.ClassesWithAddedFields ); var tablesResultCount = IfAnyAddTableResult( - errorReportResults.Data, + errorModuleResults.TableResults, tablesWithAddedColumns, - Metadata.Terms.TableTitles.TablesWithAddedColumns + Metadata.Terms.TableTitles?.TablesWithAddedColumns ); - errorReportResults.Summary = Metadata.Terms.Summaries.Error.With(new + errorModuleResults.Summary = Metadata.Terms.Summaries?.Error?.With(new { cmsClassesResultCount, tablesResultCount }); - return errorReportResults; + return errorModuleResults; } - private static int IfAnyAddTableResult(dynamic data, IEnumerable results, Term tableNameTerm) + private static int IfAnyAddTableResult(IList tables, IEnumerable results, Term? tableNameTerm) { if (results.Any()) { - var tableResult = new TableResult + tables.Add(new TableResult { Name = tableNameTerm, Rows = results - }; - - IDictionary dictionaryData = data; - - dictionaryData.Add(tableNameTerm, tableResult); + }); } return results.Count(); diff --git a/KenticoInspector.Reports/ColumnFieldValidation/Scripts.cs b/src/KInspector.Reports/ColumnFieldValidation/Scripts.cs similarity index 84% rename from KenticoInspector.Reports/ColumnFieldValidation/Scripts.cs rename to src/KInspector.Reports/ColumnFieldValidation/Scripts.cs index de416f25..50296edf 100644 --- a/KenticoInspector.Reports/ColumnFieldValidation/Scripts.cs +++ b/src/KInspector.Reports/ColumnFieldValidation/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.ColumnFieldValidation +namespace KInspector.Reports.ColumnFieldValidation { public static class Scripts { diff --git a/KenticoInspector.Reports/ColumnFieldValidation/Scripts/GetCmsClasses.sql b/src/KInspector.Reports/ColumnFieldValidation/Scripts/GetCmsClasses.sql similarity index 100% rename from KenticoInspector.Reports/ColumnFieldValidation/Scripts/GetCmsClasses.sql rename to src/KInspector.Reports/ColumnFieldValidation/Scripts/GetCmsClasses.sql diff --git a/KenticoInspector.Reports/ColumnFieldValidation/Scripts/GetTableColumns.sql b/src/KInspector.Reports/ColumnFieldValidation/Scripts/GetTableColumns.sql similarity index 100% rename from KenticoInspector.Reports/ColumnFieldValidation/Scripts/GetTableColumns.sql rename to src/KInspector.Reports/ColumnFieldValidation/Scripts/GetTableColumns.sql diff --git a/src/KInspector.Reports/ContentTreeConsistencyAnalysis/CoupledDataScriptReplacements.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/CoupledDataScriptReplacements.cs new file mode 100644 index 00000000..8a695db1 --- /dev/null +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/CoupledDataScriptReplacements.cs @@ -0,0 +1,16 @@ +namespace KInspector.Reports.ContentTreeConsistencyAnalysis +{ + public class CoupledDataScriptReplacements + { + public Dictionary Dictionary { get; set; } + + public CoupledDataScriptReplacements(string tableName, string idColumnName) + { + Dictionary = new Dictionary + { + { "TableName", tableName }, + { "IdColumnName", idColumnName } + }; + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/FieldTypes.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/FieldTypes.cs similarity index 74% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/FieldTypes.cs rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/FieldTypes.cs index 5ec24ede..f461c759 100644 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/FieldTypes.cs +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/FieldTypes.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis +namespace KInspector.Reports.ContentTreeConsistencyAnalysis { public static class FieldTypes { diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Metadata/en-US.yaml b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Metadata/en-US.yaml rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassField.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassField.cs new file mode 100644 index 00000000..81f65bac --- /dev/null +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassField.cs @@ -0,0 +1,15 @@ +namespace KInspector.Reports.ContentTreeConsistencyAnalysis.Models +{ + public class CmsClassField + { + public string? Caption { get; set; } + + public string? Column { get; set; } + + public string? ColumnType { get; set; } + + public string? DefaultValue { get; set; } + + public bool IsIdColumn { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassItem.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassItem.cs new file mode 100644 index 00000000..5bfb2e9d --- /dev/null +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsClassItem.cs @@ -0,0 +1,73 @@ +using System.Xml; + +namespace KInspector.Reports.ContentTreeConsistencyAnalysis.Models +{ + public class CmsClassItem + { + private string? _classIdColumn = null; + private List? _classFields = null; + + public string? ClassDisplayName { get; set; } + + public XmlDocument? ClassFormDefinitionXml { get; set; } + + public int ClassID { get; set; } + + public string? ClassName { get; set; } + + public string? ClassTableName { get; set; } + + public List? ClassFields + { + get + { + if (_classFields is null && ClassFormDefinitionXml is not null) + { + _classFields = GetFieldsFromXml(); + } + + return _classFields; + } + } + + public string? ClassIDColumn + { + get + { + if (_classIdColumn is null && ClassFormDefinitionXml is not null) + { + _classIdColumn = ClassFields?.Where(x => x.IsIdColumn).Select(x => x.Column).FirstOrDefault(); + } + + return _classIdColumn; + } + } + + private List GetFieldsFromXml() + { + var fields = new List(); + var fieldsXml = ClassFormDefinitionXml?.SelectNodes("/form/field"); + if (fieldsXml is null) + { + return fields; + } + + foreach (XmlNode field in fieldsXml) + { + var isIdColumnRaw = field.Attributes?["isPK"]?.Value; + var isIdColumn = !string.IsNullOrWhiteSpace(isIdColumnRaw) ? bool.Parse(isIdColumnRaw) : false; + + fields.Add(new CmsClassField + { + Caption = field.SelectSingleNode("properties/fieldcaption")?.InnerText, + Column = field.Attributes?["column"]?.Value, + ColumnType = field.Attributes?["columntype"]?.Value, + DefaultValue = field.SelectSingleNode("properties/defaultvalue")?.InnerText, + IsIdColumn = isIdColumn + }); + } + + return fields; + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsDocumentNode.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsDocumentNode.cs similarity index 61% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsDocumentNode.cs rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsDocumentNode.cs index c0550564..32db9224 100644 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsDocumentNode.cs +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsDocumentNode.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis.Models +namespace KInspector.Reports.ContentTreeConsistencyAnalysis.Models { public class CmsDocumentNode { @@ -6,7 +6,7 @@ public class CmsDocumentNode public int DocumentID { get; set; } - public string DocumentName { get; set; } + public string? DocumentName { get; set; } public int DocumentNodeID { get; set; } } diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsTreeNode.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsTreeNode.cs similarity index 50% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsTreeNode.cs rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsTreeNode.cs index 4f95327d..552059ca 100644 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsTreeNode.cs +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsTreeNode.cs @@ -1,12 +1,12 @@ -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis.Models +namespace KInspector.Reports.ContentTreeConsistencyAnalysis.Models { public class CmsTreeNode { - public string ClassDisplayName { get; set; } + public string? ClassDisplayName { get; set; } - public string ClassName { get; set; } + public string? ClassName { get; set; } - public string NodeAliasPath { get; set; } + public string? NodeAliasPath { get; set; } public int NodeClassID { get; set; } @@ -14,7 +14,7 @@ public class CmsTreeNode public int NodeLevel { get; set; } - public string NodeName { get; set; } + public string? NodeName { get; set; } public int? NodeParentID { get; set; } diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsVersionHistoryItem.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsVersionHistoryItem.cs similarity index 68% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsVersionHistoryItem.cs rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsVersionHistoryItem.cs index 1f13d36b..e18aa42b 100644 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsVersionHistoryItem.cs +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/CmsVersionHistoryItem.cs @@ -1,7 +1,6 @@ -using System; -using System.Xml; +using System.Xml; -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis.Models +namespace KInspector.Reports.ContentTreeConsistencyAnalysis.Models { public class CmsVersionHistoryItem { @@ -11,7 +10,7 @@ public class CmsVersionHistoryItem public int DocumentID { get; set; } - public XmlDocument NodeXml { get; set; } + public XmlDocument? NodeXml { get; set; } public int VersionClassID { get; set; } @@ -21,7 +20,7 @@ public int CoupledDataID { get { - if (_coupledDataId == -1 && NodeXml != null) + if (_coupledDataId == -1 && NodeXml is not null) { _coupledDataId = GetCoupledDataId(); } @@ -32,7 +31,7 @@ public int CoupledDataID private int GetCoupledDataId() { - var foreignKeyRaw = NodeXml.SelectSingleNode("//DocumentForeignKeyValue")?.InnerText; + var foreignKeyRaw = NodeXml?.SelectSingleNode("//DocumentForeignKeyValue")?.InnerText; int foreignKey; return int.TryParse(foreignKeyRaw, out foreignKey) ? foreignKey : -1; diff --git a/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/GetDetailsParameters.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/GetDetailsParameters.cs new file mode 100644 index 00000000..f7e1ad9e --- /dev/null +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/GetDetailsParameters.cs @@ -0,0 +1,7 @@ +namespace KInspector.Reports.ContentTreeConsistencyAnalysis.Models +{ + public class GetDetailsParameters + { + public int[]? IDs { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/Terms.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/Terms.cs new file mode 100644 index 00000000..04ddf593 --- /dev/null +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/Terms.cs @@ -0,0 +1,19 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.ContentTreeConsistencyAnalysis.Models +{ + public class Terms + { + public Term? DocumentNodesWithNoTreeNode { get; set; } + public Term? NameFound { get; set; } + public Term? NoContentTreeConsistencyIssuesFound { get; set; } + public Term? TreeNodesWithABadParentNode { get; set; } + public Term? TreeNodesWithABadParentSite { get; set; } + public Term? TreeNodesWithDuplicatedAliasPath { get; set; } + public Term? TreeNodesWithLevelInconsistencyAliasPath { get; set; } + public Term? TreeNodesWithLevelInconsistencyParent { get; set; } + public Term? TreeNodesWithNoDocumentNode { get; set; } + public Term? TreeNodesWithPageTypeNotAssignedToSite { get; set; } + public Term? WorkflowInconsistencies { get; set; } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/VersionHistoryMismatchResult.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/VersionHistoryMismatchResult.cs similarity index 74% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/VersionHistoryMismatchResult.cs rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/VersionHistoryMismatchResult.cs index 857d67f3..96aec8d8 100644 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Models/VersionHistoryMismatchResult.cs +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Models/VersionHistoryMismatchResult.cs @@ -1,20 +1,19 @@ using Newtonsoft.Json; -using System; using System.Globalization; using System.Text; -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis.Models +namespace KInspector.Reports.ContentTreeConsistencyAnalysis.Models { public class VersionHistoryMismatchResult { public int DocumentNodeId { get; set; } - public string FieldName { get; set; } + public string? FieldName { get; set; } - public string DocumentValue { get; set; } + public string? DocumentValue { get; set; } - public string VersionHistoryValue { get; set; } + public string? VersionHistoryValue { get; set; } [JsonIgnore] public bool FieldValuesMatch @@ -25,16 +24,16 @@ public bool FieldValuesMatch } } - public VersionHistoryMismatchResult(int documentID, string fieldName, string fieldType, string versionHistoryXmlValue, object coupledDataColumnValue) + public VersionHistoryMismatchResult(int documentID, string? fieldName, string? fieldType, string? versionHistoryXmlValue, object coupledDataColumnValue) { DocumentNodeId = documentID; FieldName = fieldName; ProcessItemValues(fieldType, versionHistoryXmlValue, coupledDataColumnValue); } - private void ProcessItemValues(string fieldType, string versionHistoryXmlValue, object coupledDataColumnValue) + private void ProcessItemValues(string? fieldType, string? versionHistoryXmlValue, object coupledDataColumnValue) { - var hasAtLeastOneNullValue = versionHistoryXmlValue == null || coupledDataColumnValue == null; + var hasAtLeastOneNullValue = versionHistoryXmlValue is null || coupledDataColumnValue is null; if (hasAtLeastOneNullValue) { DocumentValue = coupledDataColumnValue?.ToString(); @@ -57,14 +56,14 @@ private void ProcessItemValues(string fieldType, string versionHistoryXmlValue, break; default: - DocumentValue = coupledDataColumnValue.ToString(); + DocumentValue = coupledDataColumnValue?.ToString() ?? string.Empty; VersionHistoryValue = versionHistoryXmlValue; break; } } } - private void ProcessDecimalValues(string versionHistoryXmlValue, object coupledDataColumnValue) + private void ProcessDecimalValues(string? versionHistoryXmlValue, object? coupledDataColumnValue) { var documentValue = (decimal)coupledDataColumnValue; DocumentValue = documentValue.ToString(); @@ -73,7 +72,7 @@ private void ProcessDecimalValues(string versionHistoryXmlValue, object coupledD var position = DocumentValue.IndexOf(decimalSeparator); var precision = (position == -1) ? 0 : DocumentValue.Length - position - 1; - var versionHistoryValue = decimal.Parse(versionHistoryXmlValue); + var versionHistoryValue = decimal.Parse(versionHistoryXmlValue ?? string.Empty); var formatting = new StringBuilder("0."); for (int i = 0; i < precision; i++) @@ -84,10 +83,10 @@ private void ProcessDecimalValues(string versionHistoryXmlValue, object coupledD VersionHistoryValue = versionHistoryValue.ToString(formatting.ToString()); } - private void ProcessDateTimeValues(string versionHistoryXmlValue, object coupledDataColumnValue) + private void ProcessDateTimeValues(string? versionHistoryXmlValue, object? coupledDataColumnValue) { DateTimeOffset versionHistoryValue; - DateTime coupledDataDateTime = DateTime.Parse(coupledDataColumnValue.ToString()); + DateTime coupledDataDateTime = DateTime.Parse(coupledDataColumnValue?.ToString() ?? string.Empty); if (DateTimeOffset.TryParse(versionHistoryXmlValue, out versionHistoryValue) && coupledDataDateTime.Year != 1) { var assumedOffset = versionHistoryValue.Offset; @@ -97,12 +96,12 @@ private void ProcessDateTimeValues(string versionHistoryXmlValue, object coupled } else { - DocumentValue = versionHistoryXmlValue.ToString(); - VersionHistoryValue = versionHistoryXmlValue.ToString(); + DocumentValue = versionHistoryXmlValue?.ToString(); + VersionHistoryValue = versionHistoryXmlValue?.ToString(); } } - private void ProcessBoolValues(string versionHistoryXmlValue, object coupledDataColumnValue) + private void ProcessBoolValues(string? versionHistoryXmlValue, object? coupledDataColumnValue) { var documentValue = (bool)coupledDataColumnValue; var versionHistoryValue = bool.Parse(versionHistoryXmlValue); diff --git a/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Report.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Report.cs new file mode 100644 index 00000000..dd7d3833 --- /dev/null +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Report.cs @@ -0,0 +1,212 @@ +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.ContentTreeConsistencyAnalysis.Models; + +using System.Text; + +namespace KInspector.Reports.ContentTreeConsistencyAnalysis +{ + public class Report : AbstractReport + { + private readonly IDatabaseService databaseService; + + public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); + + public override IList Tags => new List() + { + ModuleTags.Health, + ModuleTags.Consistency + }; + + public async override Task GetResults() + { + var treeNodeWithBadParentSiteResults = await GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithABadParentSite, Scripts.GetTreeNodeIdsWithBadParentSiteId); + var treeNodeWithBadParentNodeResults = await GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithABadParentNode, Scripts.GetTreeNodeIdsWithBadParentNodeId); + var treeNodeWithLevelInconsistencyAliasatPathTestResults = await GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithLevelInconsistencyAliasPath, Scripts.GetTreeNodeIdsWithLevelMismatchByAliasPathTest); + var treeNodeWithLevelInconsistencyParentChildLevelTestResults = await GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithLevelInconsistencyParent, Scripts.GetTreeNodeIdsWithLevelMismatchByNodeLevelTest); + var treeNodeWithMissingDocumentResults = await GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithNoDocumentNode, Scripts.GetTreeNodeIdsWithMissingDocument); + var treeNodeWithDuplicateAliasPathResults = await GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithDuplicatedAliasPath, Scripts.GetTreeNodeIdsWithDuplicatedAliasPath); + var treeNodeWithPageTypeNotAssignedToSiteResults = await GetTreeNodeTestResult(Metadata.Terms.TreeNodesWithPageTypeNotAssignedToSite, Scripts.GetTreeNodeIdsWithPageTypeNotAssignedToSite); + var documentNodesWithMissingTreeNodeResults = await GetDocumentNodeTestResult(Metadata.Terms.DocumentNodesWithNoTreeNode, Scripts.GetDocumentIdsWithMissingTreeNode); + var workflowInconsistenciesResults = await GetWorkflowInconsistencyResult(); + + return CompileResults( + treeNodeWithBadParentSiteResults, + treeNodeWithBadParentNodeResults, + treeNodeWithLevelInconsistencyAliasatPathTestResults, + treeNodeWithLevelInconsistencyParentChildLevelTestResults, + treeNodeWithMissingDocumentResults, + treeNodeWithDuplicateAliasPathResults, + treeNodeWithPageTypeNotAssignedToSiteResults, + documentNodesWithMissingTreeNodeResults, + workflowInconsistenciesResults + ); + } + + private static List CompareVersionHistoryItemsWithPublishedItems( + IEnumerable versionHistoryItems, + IEnumerable> coupledData, + IEnumerable cmsClassFields) + { + var issues = new List(); + var idColumnName = cmsClassFields.FirstOrDefault(x => x.IsIdColumn)?.Column ?? string.Empty; + + foreach (var versionHistoryItem in versionHistoryItems) + { + var coupledDataItem = coupledData.FirstOrDefault(x => (int)x[idColumnName] == versionHistoryItem.CoupledDataID); + + if (coupledDataItem is not null) + { + foreach (var cmsClassField in cmsClassFields) + { + var historyVersionValueRaw = versionHistoryItem.NodeXml?.SelectSingleNode($"//{cmsClassField.Column}")?.InnerText ?? cmsClassField.DefaultValue; + var coupledDataItemValue = coupledDataItem[cmsClassField.Column ?? string.Empty]; + var columnName = cmsClassField.Caption ?? cmsClassField.Column; + var versionHistoryMismatchResult = new VersionHistoryMismatchResult(versionHistoryItem.DocumentID, columnName, cmsClassField.ColumnType, historyVersionValueRaw, coupledDataItemValue); + + if (!versionHistoryMismatchResult.FieldValuesMatch) + { + issues.Add(versionHistoryMismatchResult); + } + } + } + } + + return issues; + } + + private ModuleResults CompileResults(params ModuleResults[] allModuleResults) + { + var combinedResults = new ModuleResults + { + Type = ResultsType.TableList, + Status = ResultsStatus.Good + }; + + var summaryBuilder = new StringBuilder(); + foreach (var ModuleResults in allModuleResults) + { + foreach (var table in ModuleResults.TableResults) + { + var name = table.Name; + combinedResults.TableResults.Add(new TableResult + { + Name = name, + Rows = table.Rows + }); + + if (ModuleResults.Status == ResultsStatus.Error) + { + summaryBuilder.Append(Metadata.Terms.NameFound?.With(new { name })); + combinedResults.Status = ResultsStatus.Error; + } + } + } + + combinedResults.Summary = summaryBuilder.ToString(); + if (combinedResults.Status == ResultsStatus.Good) + { + combinedResults.Summary = Metadata.Terms.NoContentTreeConsistencyIssuesFound; + combinedResults.Type = ResultsType.NoResults; + } + + return combinedResults; + } + + private Task> GetCmsClassItems(IEnumerable versionHistoryItems) + { + var cmsClassIds = versionHistoryItems.Select(vhi => vhi.VersionClassID); + + return databaseService.ExecuteSqlFromFile(Scripts.GetCmsClassItems, new { IDs = cmsClassIds.ToArray() }); + } + + private Task>> GetCoupledData(CmsClassItem cmsClassItem, IEnumerable Ids) + { + var replacements = new CoupledDataScriptReplacements(cmsClassItem.ClassTableName, cmsClassItem.ClassIDColumn); + + return databaseService.ExecuteSqlFromFileGeneric(Scripts.GetCmsDocumentCoupledDataItems, replacements.Dictionary, new { IDs = Ids.ToArray() }); + } + + private Task GetDocumentNodeTestResult(string name, string script) => GetTestResult(name, script, Scripts.GetDocumentNodeDetails); + + private async Task GetTestResult(string name, string script, string getDetailsScript) where T : class + { + var nodeIds = await databaseService.ExecuteSqlFromFile(script); + var details = await databaseService.ExecuteSqlFromFile(getDetailsScript, new { IDs = nodeIds.ToArray() }); + var results = new ModuleResults + { + Status = details.Any() ? ResultsStatus.Error : ResultsStatus.Good, + Summary = string.Empty, + Type = details.Any() ? ResultsType.TableList : ResultsType.NoResults, + }; + results.TableResults.Add(new TableResult + { + Name = name, + Rows = details + }); + + return results; + } + + private Task GetTreeNodeTestResult(string name, string script) => GetTestResult(name, script, Scripts.GetTreeNodeDetails); + + private async Task> GetVersionHistoryItems() + { + var latestVersionHistoryIds = await databaseService.ExecuteSqlFromFile(Scripts.GetLatestVersionHistoryIdForAllDocuments); + + return await databaseService.ExecuteSqlFromFile(Scripts.GetVersionHistoryDetails, new { IDs = latestVersionHistoryIds.ToArray() }); + } + + private async Task GetWorkflowInconsistencyResult() + { + var versionHistoryItems = await GetVersionHistoryItems(); + var cmsClassItems = await GetCmsClassItems(versionHistoryItems); + var comparisonResults = new List(); + foreach (var cmsClass in cmsClassItems) + { + var cmsClassVersionHistoryItems = versionHistoryItems.Where(vhi => vhi.VersionClassID == cmsClass.ClassID); + var coupledDataIds = cmsClassVersionHistoryItems.Select(x => x.CoupledDataID).Where(x => x > 0); + if (!coupledDataIds.Any()) + { + continue; + } + + var coupledData = await GetCoupledData(cmsClass, coupledDataIds); + var classComparisionResults = CompareVersionHistoryItemsWithPublishedItems(versionHistoryItems, coupledData, cmsClass.ClassFields); + comparisonResults.AddRange(classComparisionResults); + } + + if (comparisonResults.Any()) + { + var results = new ModuleResults + { + Summary = string.Empty, + Status = ResultsStatus.Error, + Type = ResultsType.TableList + }; + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.WorkflowInconsistencies, + Rows = comparisonResults + }); + + return results; + } + + return new ModuleResults + { + Summary = string.Empty, + Status = ResultsStatus.Good, + Type = ResultsType.NoResults + }; + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts.cs b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts.cs similarity index 96% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts.cs rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts.cs index 08b220d5..3ff92c39 100644 --- a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts.cs +++ b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.ContentTreeConsistencyAnalysis +namespace KInspector.Reports.ContentTreeConsistencyAnalysis { public static class Scripts { diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetCmsClassItems.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetCmsClassItems.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetCmsClassItems.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetCmsClassItems.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetCmsDocumentCoupledDataItems.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetCmsDocumentCoupledDataItems.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetCmsDocumentCoupledDataItems.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetCmsDocumentCoupledDataItems.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetDocumentIdsWithMissingTreeNode.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetDocumentIdsWithMissingTreeNode.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetDocumentIdsWithMissingTreeNode.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetDocumentIdsWithMissingTreeNode.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetDocumentNodeDetails.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetDocumentNodeDetails.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetDocumentNodeDetails.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetDocumentNodeDetails.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetLatestVersionHistoryIdForAllDocuments.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetLatestVersionHistoryIdForAllDocuments.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetLatestVersionHistoryIdForAllDocuments.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetLatestVersionHistoryIdForAllDocuments.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeDetails.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeDetails.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeDetails.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeDetails.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithBadParentNodeId.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithBadParentNodeId.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithBadParentNodeId.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithBadParentNodeId.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithBadParentSiteId.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithBadParentSiteId.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithBadParentSiteId.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithBadParentSiteId.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithDuplicatedAliasPath.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithDuplicatedAliasPath.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithDuplicatedAliasPath.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithDuplicatedAliasPath.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithLevelMismatchByAliasPathTest.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithLevelMismatchByAliasPathTest.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithLevelMismatchByAliasPathTest.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithLevelMismatchByAliasPathTest.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithLevelMismatchByNodeLevelTest.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithLevelMismatchByNodeLevelTest.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithLevelMismatchByNodeLevelTest.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithLevelMismatchByNodeLevelTest.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithMissingDocument.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithMissingDocument.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithMissingDocument.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithMissingDocument.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithPageTypeNotAssignedToSite.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithPageTypeNotAssignedToSite.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithPageTypeNotAssignedToSite.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetTreeNodeIdsWithPageTypeNotAssignedToSite.sql diff --git a/KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetVersionHistoryDetails.sql b/src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetVersionHistoryDetails.sql similarity index 100% rename from KenticoInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetVersionHistoryDetails.sql rename to src/KInspector.Reports/ContentTreeConsistencyAnalysis/Scripts/GetVersionHistoryDetails.sql diff --git a/KenticoInspector.Reports/DatabaseConsistencyCheck/Metadata/en-US.yaml b/src/KInspector.Reports/DatabaseConsistencyCheck/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/DatabaseConsistencyCheck/Metadata/en-US.yaml rename to src/KInspector.Reports/DatabaseConsistencyCheck/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/DatabaseConsistencyCheck/Models/Terms.cs b/src/KInspector.Reports/DatabaseConsistencyCheck/Models/Terms.cs new file mode 100644 index 00000000..2d18547e --- /dev/null +++ b/src/KInspector.Reports/DatabaseConsistencyCheck/Models/Terms.cs @@ -0,0 +1,11 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.DatabaseConsistencyCheck.Models +{ + public class Terms + { + public Term? CheckResultsTableForAnyIssues { get; set; } + + public Term? NoIssuesFound { get; set; } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/DatabaseConsistencyCheck/Report.cs b/src/KInspector.Reports/DatabaseConsistencyCheck/Report.cs similarity index 52% rename from KenticoInspector.Reports/DatabaseConsistencyCheck/Report.cs rename to src/KInspector.Reports/DatabaseConsistencyCheck/Report.cs index 369935e3..5a09ab55 100644 --- a/KenticoInspector.Reports/DatabaseConsistencyCheck/Report.cs +++ b/src/KInspector.Reports/DatabaseConsistencyCheck/Report.cs @@ -1,15 +1,13 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.DatabaseConsistencyCheck.Models; +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.DatabaseConsistencyCheck.Models; -using System; -using System.Collections.Generic; using System.Data; -namespace KenticoInspector.Reports.DatabaseConsistencyCheck +namespace KInspector.Reports.DatabaseConsistencyCheck { public class Report : AbstractReport { @@ -23,40 +21,45 @@ public Report(IDatabaseService databaseService, IModuleMetadataService moduleMet public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); public override IList Tags => new List { - ReportTags.Health + ModuleTags.Health }; - public override ReportResults GetResults() + public async override Task GetResults() { #pragma warning disable 0618 // This is a special exemption as the results of CheckDB are unknown - var checkDbResults = databaseService.ExecuteSqlFromFileAsDataTable(Scripts.GetCheckDbResults); + var checkDbResults = await databaseService.ExecuteSqlFromFileAsDataTable(Scripts.GetCheckDbResults); #pragma warning restore 0618 return CompileResults(checkDbResults); } - private ReportResults CompileResults(DataTable checkDbResults) + private ModuleResults CompileResults(DataTable checkDbResults) { var hasIssues = checkDbResults.Rows.Count > 0; if (hasIssues) { - return new ReportResults + var result = new ModuleResults { - Type = ResultsType.Table, + Type = ResultsType.TableList, Status = ResultsStatus.Error, - Summary = Metadata.Terms.CheckResultsTableForAnyIssues, - Data = checkDbResults + Summary = Metadata.Terms.CheckResultsTableForAnyIssues }; + result.TableResults.Add(new TableResult + { + Name = "CHECKDB results", + Rows = checkDbResults.Rows.OfType() + }); + + return result; } else { - return new ReportResults + return new ModuleResults { - Type = ResultsType.String, + Type = ResultsType.NoResults, Status = ResultsStatus.Good, - Summary = Metadata.Terms.NoIssuesFound, - Data = string.Empty + Summary = Metadata.Terms.NoIssuesFound }; } } diff --git a/KenticoInspector.Reports/DatabaseConsistencyCheck/Scripts.cs b/src/KInspector.Reports/DatabaseConsistencyCheck/Scripts.cs similarity index 79% rename from KenticoInspector.Reports/DatabaseConsistencyCheck/Scripts.cs rename to src/KInspector.Reports/DatabaseConsistencyCheck/Scripts.cs index 8f7f6a7c..9a1e9fd1 100644 --- a/KenticoInspector.Reports/DatabaseConsistencyCheck/Scripts.cs +++ b/src/KInspector.Reports/DatabaseConsistencyCheck/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.DatabaseConsistencyCheck +namespace KInspector.Reports.DatabaseConsistencyCheck { public static class Scripts { diff --git a/KenticoInspector.Reports/DatabaseConsistencyCheck/Scripts/GetCheckDbResults.sql b/src/KInspector.Reports/DatabaseConsistencyCheck/Scripts/GetCheckDbResults.sql similarity index 100% rename from KenticoInspector.Reports/DatabaseConsistencyCheck/Scripts/GetCheckDbResults.sql rename to src/KInspector.Reports/DatabaseConsistencyCheck/Scripts/GetCheckDbResults.sql diff --git a/KenticoInspector.Reports/DatabaseTableSizeAnalysis/DatabaseTableSizeResult.cs b/src/KInspector.Reports/DatabaseTableSizeAnalysis/DatabaseTableSizeResult.cs similarity index 62% rename from KenticoInspector.Reports/DatabaseTableSizeAnalysis/DatabaseTableSizeResult.cs rename to src/KInspector.Reports/DatabaseTableSizeAnalysis/DatabaseTableSizeResult.cs index bcc6f37b..daa80dcb 100644 --- a/KenticoInspector.Reports/DatabaseTableSizeAnalysis/DatabaseTableSizeResult.cs +++ b/src/KInspector.Reports/DatabaseTableSizeAnalysis/DatabaseTableSizeResult.cs @@ -1,8 +1,8 @@ -namespace KenticoInspector.Reports.DatabaseTableSizeAnalysis +namespace KInspector.Reports.DatabaseTableSizeAnalysis { public class DatabaseTableSizeResult { - public string TableName { get; set; } + public string? TableName { get; set; } public int Rows { get; set; } diff --git a/KenticoInspector.Reports/DatabaseTableSizeAnalysis/Metadata/en-US.yaml b/src/KInspector.Reports/DatabaseTableSizeAnalysis/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/DatabaseTableSizeAnalysis/Metadata/en-US.yaml rename to src/KInspector.Reports/DatabaseTableSizeAnalysis/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/DatabaseTableSizeAnalysis/Models/Terms.cs b/src/KInspector.Reports/DatabaseTableSizeAnalysis/Models/Terms.cs new file mode 100644 index 00000000..a18355fc --- /dev/null +++ b/src/KInspector.Reports/DatabaseTableSizeAnalysis/Models/Terms.cs @@ -0,0 +1,11 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.DatabaseTableSizeAnalysis.Models +{ + public class Terms + { + public Term? CheckResultsTableForAnyIssues { get; set; } + + public Term? Top25Results { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/DatabaseTableSizeAnalysis/Report.cs b/src/KInspector.Reports/DatabaseTableSizeAnalysis/Report.cs new file mode 100644 index 00000000..91703af4 --- /dev/null +++ b/src/KInspector.Reports/DatabaseTableSizeAnalysis/Report.cs @@ -0,0 +1,50 @@ +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.DatabaseTableSizeAnalysis.Models; + +namespace KInspector.Reports.DatabaseTableSizeAnalysis +{ + public class Report : AbstractReport + { + private readonly IDatabaseService databaseService; + + public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); + + public override IList Tags => new List { + ModuleTags.Health + }; + + public async override Task GetResults() + { + var top25LargestTables = await databaseService.ExecuteSqlFromFile(Scripts.GetTop25LargestTables); + var results = new ModuleResults + { + Status = ResultsStatus.Information, + Summary = Metadata.Terms.CheckResultsTableForAnyIssues + }; + if (top25LargestTables.Any()) + { + results.Type = ResultsType.TableList; + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.Top25Results, + Rows = top25LargestTables + }); + } + else + { + results.Type = ResultsType.NoResults; + } + + return results; + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/DatabaseTableSizeAnalysis/Scripts.cs b/src/KInspector.Reports/DatabaseTableSizeAnalysis/Scripts.cs similarity index 79% rename from KenticoInspector.Reports/DatabaseTableSizeAnalysis/Scripts.cs rename to src/KInspector.Reports/DatabaseTableSizeAnalysis/Scripts.cs index e58ba740..1e98f6be 100644 --- a/KenticoInspector.Reports/DatabaseTableSizeAnalysis/Scripts.cs +++ b/src/KInspector.Reports/DatabaseTableSizeAnalysis/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.DatabaseTableSizeAnalysis +namespace KInspector.Reports.DatabaseTableSizeAnalysis { public static class Scripts { diff --git a/KenticoInspector.Reports/DatabaseTableSizeAnalysis/Scripts/GetTop25LargestTables.sql b/src/KInspector.Reports/DatabaseTableSizeAnalysis/Scripts/GetTop25LargestTables.sql similarity index 100% rename from KenticoInspector.Reports/DatabaseTableSizeAnalysis/Scripts/GetTop25LargestTables.sql rename to src/KInspector.Reports/DatabaseTableSizeAnalysis/Scripts/GetTop25LargestTables.sql diff --git a/KenticoInspector.Reports/DebugConfigurationAnalysis/Metadata/en-US.yaml b/src/KInspector.Reports/DebugConfigurationAnalysis/Metadata/en-US.yaml similarity index 87% rename from KenticoInspector.Reports/DebugConfigurationAnalysis/Metadata/en-US.yaml rename to src/KInspector.Reports/DebugConfigurationAnalysis/Metadata/en-US.yaml index 21a07ac1..1a1335c0 100644 --- a/KenticoInspector.Reports/DebugConfigurationAnalysis/Metadata/en-US.yaml +++ b/src/KInspector.Reports/DebugConfigurationAnalysis/Metadata/en-US.yaml @@ -3,11 +3,7 @@ details: shortDescription: Shows status of debug settings in the database and web.config file. longDescription: | This report analyzes debug settings in the database that match the following criteria: - * `KeyName` is **CMSDisableDebug** - - OR - - * `KeyType` is **boolean** *(Only the on/off settings, not log length)* + * `KeyName` is **CMSDisableDebug** or `KeyType` is **boolean** *(Only the on/off settings, not log length)* * `KeyName` is like **CMSDebug%** *(Only debug settings)* * `KeyName` is not like **%all%** *(Ignore the settings for enabling debug in the admin)* * `KeyName` is not like **%live%** *(Ignore the settings for enabling showing debug on the live site)* @@ -21,7 +17,7 @@ terms: overviewTableHeader: Database settings overview summary: database explicitly enabled webConfig: - debugKeyDisplayName: Compilation Debug, + debugKeyDisplayName: Compilation Debug overviewTableHeader: Web.config settings overview summary: enabled in web.config traceKeyDisplayName: Application Tracing diff --git a/KenticoInspector.Reports/DebugConfigurationAnalysis/Models/SettingsKey.cs b/src/KInspector.Reports/DebugConfigurationAnalysis/Models/SettingsKey.cs similarity index 73% rename from KenticoInspector.Reports/DebugConfigurationAnalysis/Models/SettingsKey.cs rename to src/KInspector.Reports/DebugConfigurationAnalysis/Models/SettingsKey.cs index b9e45483..16afb1ef 100644 --- a/KenticoInspector.Reports/DebugConfigurationAnalysis/Models/SettingsKey.cs +++ b/src/KInspector.Reports/DebugConfigurationAnalysis/Models/SettingsKey.cs @@ -1,10 +1,10 @@ -namespace KenticoInspector.Reports.DebugConfigurationAnalysis.Models +namespace KInspector.Reports.DebugConfigurationAnalysis.Models { public class SettingsKey { - public string KeyName { get; set; } + public string? KeyName { get; set; } - public string KeyDisplayName { get; set; } + public string? KeyDisplayName { get; set; } public bool KeyValue { get; set; } diff --git a/src/KInspector.Reports/DebugConfigurationAnalysis/Models/Terms.cs b/src/KInspector.Reports/DebugConfigurationAnalysis/Models/Terms.cs new file mode 100644 index 00000000..d1023893 --- /dev/null +++ b/src/KInspector.Reports/DebugConfigurationAnalysis/Models/Terms.cs @@ -0,0 +1,33 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.DebugConfigurationAnalysis.Models +{ + public class DatabaseTerms + { + public Term? ExplicitlyEnabledSettingsTableHeader { get; set; } + + public Term? OverviewTableHeader { get; set; } + + public Term? Summary { get; set; } + } + + public class Terms + { + public DatabaseTerms? Database { get; set; } + + public WebConfigTerms? WebConfig { get; set; } + + public Term? CheckResultsTableForAnyIssues { get; set; } + } + + public class WebConfigTerms + { + public Term? DebugKeyDisplayName { get; set; } + + public Term? OverviewTableHeader { get; set; } + + public Term? Summary { get; set; } + + public Term? TraceKeyDisplayName { get; set; } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/DebugConfigurationAnalysis/Report.cs b/src/KInspector.Reports/DebugConfigurationAnalysis/Report.cs similarity index 61% rename from KenticoInspector.Reports/DebugConfigurationAnalysis/Report.cs rename to src/KInspector.Reports/DebugConfigurationAnalysis/Report.cs index 22edf282..3a65e0af 100644 --- a/KenticoInspector.Reports/DebugConfigurationAnalysis/Report.cs +++ b/src/KInspector.Reports/DebugConfigurationAnalysis/Report.cs @@ -1,47 +1,44 @@ -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.DebugConfigurationAnalysis.Models; - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace KenticoInspector.Reports.DebugConfigurationAnalysis +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.DebugConfigurationAnalysis.Models; + + +namespace KInspector.Reports.DebugConfigurationAnalysis { public class Report : AbstractReport { private readonly IDatabaseService _databaseService; - private readonly IInstanceService _instanceService; private readonly ICmsFileService _cmsFileService; + private readonly IConfigService _configService; public Report( IDatabaseService databaseService, - IInstanceService instanceService, ICmsFileService cmsFileService, - IModuleMetadataService moduleMetadataService + IModuleMetadataService moduleMetadataService, + IConfigService configService ) : base(moduleMetadataService) { _databaseService = databaseService; - _instanceService = instanceService; _cmsFileService = cmsFileService; + _configService = configService; } public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); public override IList Tags => new List { - ReportTags.Health + ModuleTags.Health }; - public override ReportResults GetResults() + public async override Task GetResults() { - var instance = _instanceService.CurrentInstance; - var databaseSettingsValues = _databaseService.ExecuteSqlFromFile(Scripts.GetDebugSettingsValues); + var instance = _configService.GetCurrentInstance() ?? throw new InvalidOperationException("Current instance not found."); + var databaseSettingsValues = await _databaseService.ExecuteSqlFromFile(Scripts.GetDebugSettingsValues); ResolveSettingsDisplayNames(instance, databaseSettingsValues); - var webConfig = _cmsFileService.GetXmlDocument(instance.AdminPath, DefaultKenticoPaths.WebConfigFile); + var webConfig = _cmsFileService.GetXmlDocument(instance.AdministrationPath, DefaultKenticoPaths.WebConfigFile) ?? throw new InvalidOperationException("Unable to load instance web.config."); var isCompilationDebugEnabled = GetBooleanValueofSectionAttribute(webConfig, "/configuration/system.web/compilation", "debug"); var isTraceEnabled = GetBooleanValueofSectionAttribute(webConfig, "/configuration/system.web/trace", "enabled"); @@ -52,7 +49,7 @@ private static bool GetBooleanValueofSectionAttribute(System.Xml.XmlDocument web { var valueRaw = webConfig .SelectSingleNode(xpath)? - .Attributes[attributeName]? + .Attributes?[attributeName]? .InnerText; var value = false; bool.TryParse(valueRaw, out value); @@ -62,25 +59,24 @@ private static bool GetBooleanValueofSectionAttribute(System.Xml.XmlDocument web private void ResolveSettingsDisplayNames(Instance instance, IEnumerable databaseSettingsValues) { - var resxValues = _cmsFileService.GetResourceStringsFromResx(instance.AdminPath); - + var resxValues = _cmsFileService.GetResourceStringsFromResx(instance.AdministrationPath); foreach (var databaseSettingsValue in databaseSettingsValues) { - var key = databaseSettingsValue.KeyDisplayName + var key = databaseSettingsValue.KeyDisplayName? .Replace("{$", string.Empty) .Replace("$}", string.Empty) .ToLowerInvariant(); - if (resxValues.ContainsKey(key)) + if (key is not null && resxValues.ContainsKey(key)) { databaseSettingsValue.KeyDisplayName = resxValues[key]; } } } - private ReportResults CompileResults(IEnumerable databaseSettingsKeys, bool isCompilationDebugEnabled, bool isTraceEnabled) + private ModuleResults CompileResults(IEnumerable databaseSettingsKeys, bool isCompilationDebugEnabled, bool isTraceEnabled) { - var results = new ReportResults() + var results = new ModuleResults() { Status = ResultsStatus.Information, Summary = Metadata.Terms.CheckResultsTableForAnyIssues, @@ -93,7 +89,7 @@ private ReportResults CompileResults(IEnumerable databaseSettingsKe return results; } - private void AnalyzeWebConfigSettings(ReportResults results, bool isCompilationDebugEnabled, bool isTraceEnabled) + private void AnalyzeWebConfigSettings(ModuleResults results, bool isCompilationDebugEnabled, bool isTraceEnabled) { var isDebugOrTraceEnabledInWebConfig = isCompilationDebugEnabled || isTraceEnabled; if (isDebugOrTraceEnabledInWebConfig) @@ -103,21 +99,23 @@ private void AnalyzeWebConfigSettings(ReportResults results, bool isCompilationD var enabledSettingsText = isCompilationDebugEnabled ? "`Debug`" : string.Empty; enabledSettingsText += isCompilationDebugEnabled && isTraceEnabled ? " & " : string.Empty; enabledSettingsText += isTraceEnabled ? "`Trace`" : string.Empty; - results.Summary += Metadata.Terms.WebConfig.Summary.With(new { enabledSettingsText }); + results.Summary += Metadata.Terms.WebConfig?.Summary?.With(new { enabledSettingsText }); } - var webconfigSettingsValues = new List(); - webconfigSettingsValues.Add(new SettingsKey("Debug", Metadata.Terms.WebConfig.DebugKeyDisplayName, isCompilationDebugEnabled, false)); - webconfigSettingsValues.Add(new SettingsKey("Trace", Metadata.Terms.WebConfig.TraceKeyDisplayName, isTraceEnabled, false)); + var webconfigSettingsValues = new List + { + new("Debug", Metadata.Terms.WebConfig?.DebugKeyDisplayName, isCompilationDebugEnabled, false), + new("Trace", Metadata.Terms.WebConfig?.TraceKeyDisplayName, isTraceEnabled, false) + }; - results.Data.WebConfigSettingsResults = new TableResult() + results.TableResults.Add(new TableResult { - Name = Metadata.Terms.WebConfig.OverviewTableHeader, + Name = Metadata.Terms.WebConfig?.OverviewTableHeader, Rows = webconfigSettingsValues - }; + }); } - private void AnalyzeDatabaseSettingsResults(ReportResults results, IEnumerable databaseSettingsKeys) + private void AnalyzeDatabaseSettingsResults(ModuleResults results, IEnumerable databaseSettingsKeys) { var explicitlyEnabledSettings = databaseSettingsKeys.Where(x => x.KeyValue && !x.KeyDefaultValue); var explicitlyEnabledSettingsCount = explicitlyEnabledSettings.Count(); @@ -128,20 +126,20 @@ private void AnalyzeDatabaseSettingsResults(ReportResults results, IEnumerable() + results.TableResults.Add(new TableResult { - Name = Metadata.Terms.Database.ExplicitlyEnabledSettingsTableHeader, + Name = Metadata.Terms.Database?.ExplicitlyEnabledSettingsTableHeader, Rows = explicitlyEnabledSettings - }; + }); } - results.Data.AllDatabaseSettings = new TableResult() + results.TableResults.Add(new TableResult { - Name = Metadata.Terms.Database.OverviewTableHeader, + Name = Metadata.Terms.Database?.OverviewTableHeader, Rows = databaseSettingsKeys - }; + }); } } } \ No newline at end of file diff --git a/KenticoInspector.Reports/DebugConfigurationAnalysis/Scripts.cs b/src/KInspector.Reports/DebugConfigurationAnalysis/Scripts.cs similarity index 79% rename from KenticoInspector.Reports/DebugConfigurationAnalysis/Scripts.cs rename to src/KInspector.Reports/DebugConfigurationAnalysis/Scripts.cs index d5ab78a6..f3e66192 100644 --- a/KenticoInspector.Reports/DebugConfigurationAnalysis/Scripts.cs +++ b/src/KInspector.Reports/DebugConfigurationAnalysis/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.DebugConfigurationAnalysis +namespace KInspector.Reports.DebugConfigurationAnalysis { public static class Scripts { diff --git a/KenticoInspector.Reports/DebugConfigurationAnalysis/Scripts/GetDebugSettingsValues.sql b/src/KInspector.Reports/DebugConfigurationAnalysis/Scripts/GetDebugSettingsValues.sql similarity index 100% rename from KenticoInspector.Reports/DebugConfigurationAnalysis/Scripts/GetDebugSettingsValues.sql rename to src/KInspector.Reports/DebugConfigurationAnalysis/Scripts/GetDebugSettingsValues.sql diff --git a/KenticoInspector.Reports/KenticoInspector.Reports.csproj b/src/KInspector.Reports/KInspector.Reports.csproj similarity index 97% rename from KenticoInspector.Reports/KenticoInspector.Reports.csproj rename to src/KInspector.Reports/KInspector.Reports.csproj index a05c2b57..595a2db2 100644 --- a/KenticoInspector.Reports/KenticoInspector.Reports.csproj +++ b/src/KInspector.Reports/KInspector.Reports.csproj @@ -1,13 +1,8 @@  + KInspector.Reports net8.0 - 9.0 - - - - - @@ -15,7 +10,7 @@ - + diff --git a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Metadata/en-US.yaml b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Metadata/en-US.yaml rename to src/KInspector.Reports/OnlineMarketingMacroAnalysis/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/AutomationTriggerResult.cs b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/AutomationTriggerResult.cs new file mode 100644 index 00000000..e8beefec --- /dev/null +++ b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/AutomationTriggerResult.cs @@ -0,0 +1,11 @@ +namespace KInspector.Reports.OnlineMarketingMacroAnalysis.Models +{ + public class AutomationTriggerResult + { + public string? ProcessName { get; set; } + + public string? TriggerName { get; set; } + + public string? Macro { get; set; } + } +} diff --git a/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ContactGroupResult.cs b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ContactGroupResult.cs new file mode 100644 index 00000000..e71a1855 --- /dev/null +++ b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ContactGroupResult.cs @@ -0,0 +1,9 @@ +namespace KInspector.Reports.OnlineMarketingMacroAnalysis.Models +{ + public class ContactGroupResult + { + public string? ContactGroup { get; set; } + + public string? Macro { get; set; } + } +} diff --git a/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ScoreRuleResult.cs b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ScoreRuleResult.cs new file mode 100644 index 00000000..a02c83ce --- /dev/null +++ b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Results/ScoreRuleResult.cs @@ -0,0 +1,11 @@ +namespace KInspector.Reports.OnlineMarketingMacroAnalysis.Models +{ + public class ScoreRuleResult + { + public string? ScoreName { get; set; } + + public string? RuleName { get; set; } + + public string? Macro { get; set; } + } +} diff --git a/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Terms.cs b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Terms.cs new file mode 100644 index 00000000..de9496cc --- /dev/null +++ b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Models/Terms.cs @@ -0,0 +1,17 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.OnlineMarketingMacroAnalysis.Models +{ + public class Terms + { + public Term? Good { get; set; } + + public Term? IssuesFound { get; set; } + + public Term? ContactGroupTable { get; set; } + + public Term? AutomationTriggerTable { get; set; } + + public Term? ScoreRuleTable { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Report.cs b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Report.cs new file mode 100644 index 00000000..1d642c10 --- /dev/null +++ b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Report.cs @@ -0,0 +1,72 @@ +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.OnlineMarketingMacroAnalysis.Models; + +namespace KInspector.Reports.OnlineMarketingMacroAnalysis +{ + public class Report : AbstractReport + { + private readonly IDatabaseService databaseService; + + public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); + + public override IList Tags => new List { + ModuleTags.Performance, + ModuleTags.OnlineMarketing + }; + + public async override Task GetResults() + { + var contactGroups = await databaseService.ExecuteSqlFromFile(Scripts.GetManualContactGroupMacroConditions); + var automationTriggers = await databaseService.ExecuteSqlFromFile(Scripts.GetManualTimeBasedTriggerMacroConditions); + var scoreRules = await databaseService.ExecuteSqlFromFile(Scripts.GetManualScoreRuleMacroConditions); + if (!contactGroups.Any() && !automationTriggers.Any() && !scoreRules.Any()) + { + return new ModuleResults + { + Status = ResultsStatus.Good, + Summary = Metadata.Terms.Good, + Type = ResultsType.NoResults + }; + } + + var totalIssues = contactGroups.Count() + automationTriggers.Count() + scoreRules.Count(); + var results = new ModuleResults + { + Type = ResultsType.TableList, + Status = ResultsStatus.Warning, + Summary = Metadata.Terms.IssuesFound?.With(new + { + totalIssues + }) + }; + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.ContactGroupTable, + Rows = contactGroups + }); + + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.AutomationTriggerTable, + Rows = automationTriggers + }); + + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.ScoreRuleTable, + Rows = scoreRules + }); + + return results; + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Scripts.cs b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Scripts.cs similarity index 89% rename from KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Scripts.cs rename to src/KInspector.Reports/OnlineMarketingMacroAnalysis/Scripts.cs index 0f2b25ab..6ca169bb 100644 --- a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Scripts.cs +++ b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.OnlineMarketingMacroAnalysis +namespace KInspector.Reports.OnlineMarketingMacroAnalysis { public static class Scripts { diff --git a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualContactGroupMacroConditions.sql b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualContactGroupMacroConditions.sql similarity index 100% rename from KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualContactGroupMacroConditions.sql rename to src/KInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualContactGroupMacroConditions.sql diff --git a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualScoreRuleMacroConditions.sql b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualScoreRuleMacroConditions.sql similarity index 100% rename from KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualScoreRuleMacroConditions.sql rename to src/KInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualScoreRuleMacroConditions.sql diff --git a/KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualTimeBasedTriggerMacroConditions.sql b/src/KInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualTimeBasedTriggerMacroConditions.sql similarity index 100% rename from KenticoInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualTimeBasedTriggerMacroConditions.sql rename to src/KInspector.Reports/OnlineMarketingMacroAnalysis/Scripts/GetManualTimeBasedTriggerMacroConditions.sql diff --git a/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Metadata/en-US.yaml b/src/KInspector.Reports/PageTypeAssignmentAnalysis/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/PageTypeAssignmentAnalysis/Metadata/en-US.yaml rename to src/KInspector.Reports/PageTypeAssignmentAnalysis/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/PageTypeAssignmentAnalysis/Models/PageType.cs b/src/KInspector.Reports/PageTypeAssignmentAnalysis/Models/PageType.cs new file mode 100644 index 00000000..7fc19de2 --- /dev/null +++ b/src/KInspector.Reports/PageTypeAssignmentAnalysis/Models/PageType.cs @@ -0,0 +1,13 @@ +namespace KInspector.Reports.PageTypeAssignmentAnalysis.Models +{ + public class PageType + { + public string? ClassDisplayName { get; set; } + + public string? ClassName { get; set; } + + public int NodeClassID { get; set; } + + public int NodeSiteID { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/PageTypeAssignmentAnalysis/Models/Terms.cs b/src/KInspector.Reports/PageTypeAssignmentAnalysis/Models/Terms.cs new file mode 100644 index 00000000..e8c2a45d --- /dev/null +++ b/src/KInspector.Reports/PageTypeAssignmentAnalysis/Models/Terms.cs @@ -0,0 +1,13 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.PageTypeAssignmentAnalysis.Models +{ + public class Terms + { + public Term? WarningSummary { get; set; } + + public Term? UnassignedPageTypesTableHeader { get; set; } + + public Term? NoIssuesFound { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/PageTypeAssignmentAnalysis/Report.cs b/src/KInspector.Reports/PageTypeAssignmentAnalysis/Report.cs new file mode 100644 index 00000000..bffc0fca --- /dev/null +++ b/src/KInspector.Reports/PageTypeAssignmentAnalysis/Report.cs @@ -0,0 +1,62 @@ +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.PageTypeAssignmentAnalysis.Models; + +namespace KInspector.Reports.PageTypeAssignmentAnalysis +{ + public class Report : AbstractReport + { + private readonly IDatabaseService databaseService; + + public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); + + public override IList Tags => new List + { + ModuleTags.Health, + ModuleTags.Consistency + }; + + public async override Task GetResults() + { + var unassignedPageTypes = await databaseService.ExecuteSqlFromFile(Scripts.GetPageTypesNotAssignedToSite); + + return CompileResults(unassignedPageTypes); + } + + private ModuleResults CompileResults(IEnumerable unassignedPageTypes) + { + var unassignedPageTypeCount = unassignedPageTypes.Count(); + if (unassignedPageTypeCount > 0) + { + var results = new ModuleResults + { + Status = ResultsStatus.Warning, + Type = ResultsType.TableList, + Summary = Metadata.Terms.WarningSummary?.With(new { unassignedPageTypeCount }) + }; + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.UnassignedPageTypesTableHeader, + Rows = unassignedPageTypes + }); + + return results; + } + + return new ModuleResults + { + Status = ResultsStatus.Good, + Summary = Metadata.Terms.NoIssuesFound, + Type = ResultsType.NoResults, + }; + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Scripts.cs b/src/KInspector.Reports/PageTypeAssignmentAnalysis/Scripts.cs similarity index 80% rename from KenticoInspector.Reports/PageTypeAssignmentAnalysis/Scripts.cs rename to src/KInspector.Reports/PageTypeAssignmentAnalysis/Scripts.cs index 77076096..438975e3 100644 --- a/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Scripts.cs +++ b/src/KInspector.Reports/PageTypeAssignmentAnalysis/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.PageTypeAssignmentAnalysis +namespace KInspector.Reports.PageTypeAssignmentAnalysis { public static class Scripts { diff --git a/KenticoInspector.Reports/PageTypeAssignmentAnalysis/Scripts/GetPageTypesNotAssignedToSite.sql b/src/KInspector.Reports/PageTypeAssignmentAnalysis/Scripts/GetPageTypesNotAssignedToSite.sql similarity index 100% rename from KenticoInspector.Reports/PageTypeAssignmentAnalysis/Scripts/GetPageTypesNotAssignedToSite.sql rename to src/KInspector.Reports/PageTypeAssignmentAnalysis/Scripts/GetPageTypesNotAssignedToSite.sql diff --git a/KenticoInspector.Reports/PageTypeFieldAnalysis/Metadata/en-US.yaml b/src/KInspector.Reports/PageTypeFieldAnalysis/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/PageTypeFieldAnalysis/Metadata/en-US.yaml rename to src/KInspector.Reports/PageTypeFieldAnalysis/Metadata/en-US.yaml diff --git a/KenticoInspector.Reports/PageTypeFieldAnalysis/Models/Data/CmsPageTypeField.cs b/src/KInspector.Reports/PageTypeFieldAnalysis/Models/Data/CmsPageTypeField.cs similarity index 62% rename from KenticoInspector.Reports/PageTypeFieldAnalysis/Models/Data/CmsPageTypeField.cs rename to src/KInspector.Reports/PageTypeFieldAnalysis/Models/Data/CmsPageTypeField.cs index 8631b4d3..9ed347f2 100644 --- a/KenticoInspector.Reports/PageTypeFieldAnalysis/Models/Data/CmsPageTypeField.cs +++ b/src/KInspector.Reports/PageTypeFieldAnalysis/Models/Data/CmsPageTypeField.cs @@ -1,17 +1,17 @@ -namespace KenticoInspector.Reports.PageTypeFieldAnalysis.Models +namespace KInspector.Reports.PageTypeFieldAnalysis.Models { public class CmsPageTypeField { - public string PageTypeCodeName { get; set; } + public string? PageTypeCodeName { get; set; } - public string FieldName { get; set; } + public string? FieldName { get; set; } - public string FieldDataType { get; set; } + public string? FieldDataType { get; set; } - public override bool Equals(object obj) + public override bool Equals(object? obj) { var comparingField = obj as CmsPageTypeField; - if (comparingField == null) + if (comparingField is null) { return base.Equals(obj); } diff --git a/src/KInspector.Reports/PageTypeFieldAnalysis/Models/Terms.cs b/src/KInspector.Reports/PageTypeFieldAnalysis/Models/Terms.cs new file mode 100644 index 00000000..2b31b1cd --- /dev/null +++ b/src/KInspector.Reports/PageTypeFieldAnalysis/Models/Terms.cs @@ -0,0 +1,23 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.PageTypeFieldAnalysis.Models +{ + public class Terms + { + public Summaries? Summaries { get; set; } + + public TableTitles? TableTitles { get; set; } + } + + public class Summaries + { + public Term? Information { get; set; } + + public Term? Good { get; set; } + } + + public class TableTitles + { + public Term? MatchingPageTypeFieldsWithDifferentDataTypes { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/PageTypeFieldAnalysis/Report.cs b/src/KInspector.Reports/PageTypeFieldAnalysis/Report.cs new file mode 100644 index 00000000..872172c2 --- /dev/null +++ b/src/KInspector.Reports/PageTypeFieldAnalysis/Report.cs @@ -0,0 +1,73 @@ +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.PageTypeFieldAnalysis.Models; + +namespace KInspector.Reports.PageTypeFieldAnalysis +{ + public class Report : AbstractReport + { + private readonly IDatabaseService databaseService; + + public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) + : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); + + public override IList Tags => new List + { + ModuleTags.Information, + ModuleTags.Health + }; + + public async override Task GetResults() + { + var pagetypeFields = await databaseService.ExecuteSqlFromFile(Scripts.GetCmsPageTypeFields); + var fieldsWithMismatchedTypes = CheckForMismatchedTypes(pagetypeFields); + + return CompileResults(fieldsWithMismatchedTypes); + } + + private ModuleResults CompileResults(IEnumerable fieldsWithMismatchedTypes) + { + if (!fieldsWithMismatchedTypes.Any()) + { + return new ModuleResults + { + Status = ResultsStatus.Good, + Summary = Metadata.Terms.Summaries?.Good, + Type = ResultsType.NoResults + }; + } + + var fieldResultCount = fieldsWithMismatchedTypes.Count(); + var results = new ModuleResults + { + Type = ResultsType.TableList, + Status = ResultsStatus.Information, + Summary = Metadata.Terms.Summaries?.Information?.With(new { fieldResultCount }) + }; + + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.TableTitles?.MatchingPageTypeFieldsWithDifferentDataTypes, + Rows = fieldsWithMismatchedTypes + }); + + return results; + } + + private static IEnumerable CheckForMismatchedTypes(IEnumerable pagetypeFields) => + pagetypeFields + .Distinct() + .GroupBy(x => x.FieldName) + .Where(g => g.Count() > 1) + .SelectMany(g => g) + .OrderBy(i => i.FieldName); + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/PageTypeFieldAnalysis/Scripts.cs b/src/KInspector.Reports/PageTypeFieldAnalysis/Scripts.cs similarity index 80% rename from KenticoInspector.Reports/PageTypeFieldAnalysis/Scripts.cs rename to src/KInspector.Reports/PageTypeFieldAnalysis/Scripts.cs index 8e13b969..6dafdc7d 100644 --- a/KenticoInspector.Reports/PageTypeFieldAnalysis/Scripts.cs +++ b/src/KInspector.Reports/PageTypeFieldAnalysis/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.PageTypeFieldAnalysis +namespace KInspector.Reports.PageTypeFieldAnalysis { public static class Scripts { diff --git a/KenticoInspector.Reports/PageTypeFieldAnalysis/Scripts/GetCmsPageTypeFields.sql b/src/KInspector.Reports/PageTypeFieldAnalysis/Scripts/GetCmsPageTypeFields.sql similarity index 100% rename from KenticoInspector.Reports/PageTypeFieldAnalysis/Scripts/GetCmsPageTypeFields.sql rename to src/KInspector.Reports/PageTypeFieldAnalysis/Scripts/GetCmsPageTypeFields.sql diff --git a/KenticoInspector.Reports/ReportsModule.cs b/src/KInspector.Reports/ReportsModule.cs similarity index 88% rename from KenticoInspector.Reports/ReportsModule.cs rename to src/KInspector.Reports/ReportsModule.cs index f943b9ed..86628e57 100644 --- a/KenticoInspector.Reports/ReportsModule.cs +++ b/src/KInspector.Reports/ReportsModule.cs @@ -1,10 +1,10 @@ using Autofac; -using KenticoInspector.Core.Modules; +using KInspector.Core.Modules; using System.Reflection; -namespace KenticoInspector.Reports +namespace KInspector.Reports { public class ReportsModule : Autofac.Module { diff --git a/KenticoInspector.Reports/RobotsTxtConfigurationSummary/Constants.cs b/src/KInspector.Reports/RobotsTxtConfigurationSummary/Constants.cs similarity index 62% rename from KenticoInspector.Reports/RobotsTxtConfigurationSummary/Constants.cs rename to src/KInspector.Reports/RobotsTxtConfigurationSummary/Constants.cs index 913f29cb..332481df 100644 --- a/KenticoInspector.Reports/RobotsTxtConfigurationSummary/Constants.cs +++ b/src/KInspector.Reports/RobotsTxtConfigurationSummary/Constants.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.RobotsTxtConfigurationSummary +namespace KInspector.Reports.RobotsTxtConfigurationSummary { public static class Constants { diff --git a/KenticoInspector.Reports/RobotsTxtConfigurationSummary/Metadata/en-US.yaml b/src/KInspector.Reports/RobotsTxtConfigurationSummary/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/RobotsTxtConfigurationSummary/Metadata/en-US.yaml rename to src/KInspector.Reports/RobotsTxtConfigurationSummary/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/RobotsTxtConfigurationSummary/Models/Terms.cs b/src/KInspector.Reports/RobotsTxtConfigurationSummary/Models/Terms.cs new file mode 100644 index 00000000..21ffe39c --- /dev/null +++ b/src/KInspector.Reports/RobotsTxtConfigurationSummary/Models/Terms.cs @@ -0,0 +1,11 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.RobotsTxtConfigurationSummary.Models +{ + public class Terms + { + public Term? RobotsTxtFound { get; set; } + + public Term? RobotsTxtNotFound { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/RobotsTxtConfigurationSummary/Report.cs b/src/KInspector.Reports/RobotsTxtConfigurationSummary/Report.cs new file mode 100644 index 00000000..ae2d9e8f --- /dev/null +++ b/src/KInspector.Reports/RobotsTxtConfigurationSummary/Report.cs @@ -0,0 +1,89 @@ +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.RobotsTxtConfigurationSummary.Models; + +using System.Net; +using System.Net.Security; + +namespace KInspector.Reports.RobotsTxtConfigurationSummary +{ + public class Report : AbstractReport + { + private readonly IConfigService configService; + private readonly HttpClient _httpClient = new(); + + public Report( + IConfigService configService, + IModuleMetadataService moduleMetadataService, + HttpClient? httpClient = null + ) : base(moduleMetadataService) + + { + this.configService = configService; + + if (httpClient is not null) + { + _httpClient = httpClient; + } + } + + public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12"); + + public override IList IncompatibleVersions => VersionHelper.GetVersionList("13"); + + public override IList Tags => new List + { + ModuleTags.Information, + ModuleTags.SEO, + }; + + public override Task GetResults() + { + var adminUrl = configService.GetCurrentInstance()?.AdministrationUrl; + if (adminUrl is null) + { + return Task.FromResult(new ModuleResults + { + Status = ResultsStatus.Warning, + Summary = Metadata.Terms.RobotsTxtNotFound, + Type = ResultsType.NoResults + }); + } + + var instanceUri = new Uri(adminUrl); + var testUri = new Uri(instanceUri, Constants.RobotsTxtRelativePath); + + return GetUriResults(testUri); + } + + private async Task GetUriResults(Uri testUri) + { + try + { + // Ignore invalid certificates + ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((a, b, c, d) => { return true; }); + HttpResponseMessage response = await _httpClient.GetAsync(testUri); + var found = response.StatusCode == HttpStatusCode.OK; + + return new ModuleResults + { + Status = found ? ResultsStatus.Good : ResultsStatus.Warning, + Summary = found ? Metadata.Terms.RobotsTxtFound : Metadata.Terms.RobotsTxtNotFound, + Type = ResultsType.NoResults + }; + } + catch (Exception ex) + { + return new ModuleResults + { + Status = ResultsStatus.Error, + Summary = ex.Message, + Type = ResultsType.NoResults + }; + } + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/SampleReport/Metadata/en-US.yaml b/src/KInspector.Reports/SampleReport/Metadata/en-US.yaml similarity index 93% rename from KenticoInspector.Reports/SampleReport/Metadata/en-US.yaml rename to src/KInspector.Reports/SampleReport/Metadata/en-US.yaml index 6d1e9455..ba817f99 100644 --- a/KenticoInspector.Reports/SampleReport/Metadata/en-US.yaml +++ b/src/KInspector.Reports/SampleReport/Metadata/en-US.yaml @@ -9,5 +9,5 @@ Some reference materials: * [YAML/Markdown Cheatsheet](https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/) terms: - detailedResult: reported ``. + detailedResult: reported . summary: found. diff --git a/src/KInspector.Reports/SampleReport/Models/Terms.cs b/src/KInspector.Reports/SampleReport/Models/Terms.cs new file mode 100644 index 00000000..ee443109 --- /dev/null +++ b/src/KInspector.Reports/SampleReport/Models/Terms.cs @@ -0,0 +1,11 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.SampleReport.Models +{ + public class Terms + { + public Term? DetailedResult { get; set; } + + public Term? Summary { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/SampleReport/Report.cs b/src/KInspector.Reports/SampleReport/Report.cs new file mode 100644 index 00000000..e84f3407 --- /dev/null +++ b/src/KInspector.Reports/SampleReport/Report.cs @@ -0,0 +1,58 @@ +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.SampleReport.Models; + +using System.Text; + +namespace KInspector.Reports.SampleReport +{ + public class Report : AbstractReport + { + public Report(IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + } + + // Hide sample report in UI + public override IList CompatibleVersions => Array.Empty(); + + public override IList Tags => new List { + ModuleTags.Consistency + }; + + public override Task GetResults() + { + var random = new Random(); + var issueCount = random.Next(0, 3); + var results = new ModuleResults() + { + Type = ResultsType.StringList, + Status = ResultsStatus.Information, + Summary = Metadata.Terms.Summary?.With(new { issueCount }) + }; + for (int i = 0; i < issueCount; i++) + { + var name = $"test-{i}"; + var problem = GetRandomString(10); + results.StringResults.Add(Metadata.Terms.DetailedResult?.With(new { name, problem })); + } + + return Task.FromResult(results); + } + + private static string GetRandomString(int size) + { + var builder = new StringBuilder(); + var random = new Random(); + char ch; + for (int i = 0; i < size; i++) + { + ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); + builder.Append(ch); + } + + return builder.ToString(); + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/AbstractAnalyzers.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/AbstractAnalyzers.cs similarity index 60% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/AbstractAnalyzers.cs rename to src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/AbstractAnalyzers.cs index b4534c8c..c1295062 100644 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/AbstractAnalyzers.cs +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/AbstractAnalyzers.cs @@ -1,30 +1,28 @@ -using System; -using System.Collections.Generic; -using System.Linq.Expressions; +using System.Linq.Expressions; -using KenticoInspector.Core.Models; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models; +using KInspector.Core.Models; +using KInspector.Reports.SecuritySettingsAnalysis.Models; -namespace KenticoInspector.Reports.SecuritySettingsAnalysis.Analyzers +namespace KInspector.Reports.SecuritySettingsAnalysis.Analyzers { - public abstract class AbstractAnalyzers where TResult : class + public abstract class AbstractAnalyzers where TResult : class? { - protected Terms ReportTerms { get; } + protected Terms? ReportTerms { get; } public abstract IEnumerable>> Analyzers { get; } - protected AbstractAnalyzers(Terms reportTerms) + protected AbstractAnalyzers(Terms? reportTerms) { ReportTerms = reportTerms; } - public TResult GetAnalysis( + public TResult? GetAnalysis( Expression> analyzer, IEnumerable settings, - Func getSettingName + Func getSettingName ) { - TResult result = null; + TResult? result = null; foreach (var setting in settings) { var expectedSettingName = analyzer.Parameters[0].Name; @@ -37,9 +35,9 @@ Func getSettingName return result; } - protected virtual bool Match(string analyzerName, string name) + protected virtual bool Match(string? analyzerName, string? name) { - return analyzerName.Equals(name, StringComparison.InvariantCulture); + return analyzerName?.Equals(name, StringComparison.InvariantCulture) ?? false; } protected virtual TResult AnalyzeUsingExpression( @@ -54,12 +52,12 @@ Term recommendationReason protected static bool IsNullOrEquals(string value, string equals) { - return value == null || Equals(value, equals); + return value is null || Equals(value, equals); } protected static bool Equals(string value, string equals) { - return value != null && value.Equals(equals, StringComparison.InvariantCultureIgnoreCase); + return value is not null && value.Equals(equals, StringComparison.InvariantCultureIgnoreCase); } } } \ No newline at end of file diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/AppSettingAnalyzers.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/AppSettingAnalyzers.cs similarity index 70% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/AppSettingAnalyzers.cs rename to src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/AppSettingAnalyzers.cs index 4447f22b..3ddfda12 100644 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/AppSettingAnalyzers.cs +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/AppSettingAnalyzers.cs @@ -1,18 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq.Expressions; +using System.Linq.Expressions; using System.Xml.Linq; -using KenticoInspector.Core.Models; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Results; +using KInspector.Core.Models; +using KInspector.Reports.SecuritySettingsAnalysis.Models; +using KInspector.Reports.SecuritySettingsAnalysis.Models.Results; -namespace KenticoInspector.Reports.SecuritySettingsAnalysis.Analyzers +namespace KInspector.Reports.SecuritySettingsAnalysis.Analyzers { - public class AppSettingAnalyzers : AbstractAnalyzers + public class AppSettingAnalyzers : AbstractAnalyzers { - public override IEnumerable>> Analyzers - => new List>> + public override IEnumerable>> Analyzers + => new List>> { CMSEnableCsrfProtection => AnalyzeUsingExpression( CMSEnableCsrfProtection, @@ -44,21 +42,25 @@ public AppSettingAnalyzers(Terms reportTerms) : base(reportTerms) { } - protected override WebConfigSettingResult AnalyzeUsingExpression( + protected override WebConfigSettingResult? AnalyzeUsingExpression( XElement appSetting, Expression> valueIsRecommended, string recommendedValue, Term recommendationReason ) { - string attributeName = valueIsRecommended.Parameters[0].Name; - string keyValue = appSetting.Attribute(attributeName)?.Value; - if (valueIsRecommended.Compile()(keyValue)) + string? attributeName = valueIsRecommended.Parameters[0].Name; + string? keyValue = appSetting.Attribute(attributeName ?? string.Empty)?.Value; + if (keyValue is null || valueIsRecommended.Compile()(keyValue)) { return null; } - string keyName = appSetting.Attribute("key").Value; + string? keyName = appSetting.Attribute("key")?.Value; + if (keyName is null) + { + return null; + } return new WebConfigSettingResult(appSetting, keyName, keyValue, recommendedValue, recommendationReason); } diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/ConnectionStringAnalyzers.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/ConnectionStringAnalyzers.cs similarity index 58% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/ConnectionStringAnalyzers.cs rename to src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/ConnectionStringAnalyzers.cs index 8e27eec0..0397a32e 100644 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/ConnectionStringAnalyzers.cs +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/ConnectionStringAnalyzers.cs @@ -1,18 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq.Expressions; +using System.Linq.Expressions; using System.Xml.Linq; -using KenticoInspector.Core.Models; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Results; +using KInspector.Core.Models; +using KInspector.Reports.SecuritySettingsAnalysis.Models; +using KInspector.Reports.SecuritySettingsAnalysis.Models.Results; -namespace KenticoInspector.Reports.SecuritySettingsAnalysis.Analyzers +namespace KInspector.Reports.SecuritySettingsAnalysis.Analyzers { - public class ConnectionStringAnalyzers : AbstractAnalyzers + public class ConnectionStringAnalyzers : AbstractAnalyzers { - public override IEnumerable>> Analyzers - => new List>> + public override IEnumerable>> Analyzers + => new List>> { CMSConnectionString => AnalyzeUsingExpression( CMSConnectionString, @@ -27,21 +25,25 @@ public ConnectionStringAnalyzers(Terms reportTerms) : base(reportTerms) { } - protected override WebConfigSettingResult AnalyzeUsingExpression( + protected override WebConfigSettingResult? AnalyzeUsingExpression( XElement connectionString, Expression> valueIsRecommended, string recommendedValue, Term recommendationReason ) { - string attributeName = valueIsRecommended.Parameters[0].Name; - string keyValue = connectionString.Attribute(attributeName)?.Value; - if (valueIsRecommended.Compile()(keyValue)) + string? attributeName = valueIsRecommended.Parameters[0]?.Name; + string? keyValue = connectionString.Attribute(attributeName ?? string.Empty)?.Value; + if (keyValue is null || valueIsRecommended.Compile()(keyValue)) { return null; } - string keyName = connectionString.Attribute("name").Value; + string? keyName = connectionString.Attribute("name")?.Value; + if (keyName is null) + { + return null; + } return new WebConfigSettingResult(connectionString, keyName, keyValue, recommendedValue, recommendationReason); } diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/SettingsKeyAnalyzers.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/SettingsKeyAnalyzers.cs similarity index 88% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/SettingsKeyAnalyzers.cs rename to src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/SettingsKeyAnalyzers.cs index 86c0f8d0..5c55ea34 100644 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/SettingsKeyAnalyzers.cs +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/SettingsKeyAnalyzers.cs @@ -1,21 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; +using System.Linq.Expressions; -using KenticoInspector.Core.Models; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Data; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Results; +using KInspector.Core.Models; +using KInspector.Reports.SecuritySettingsAnalysis.Models; +using KInspector.Reports.SecuritySettingsAnalysis.Models.Data; +using KInspector.Reports.SecuritySettingsAnalysis.Models.Results; -namespace KenticoInspector.Reports.SecuritySettingsAnalysis.Analyzers +namespace KInspector.Reports.SecuritySettingsAnalysis.Analyzers { - public class SettingsKeyAnalyzers : AbstractAnalyzers + public class SettingsKeyAnalyzers : AbstractAnalyzers { private readonly IEnumerable dangerousExtensions = new[] { "exe", "src", "cs", "dll", "aspx", "ascx", "msi", "bat" }; - public override IEnumerable>> Analyzers - => new List>> + public override IEnumerable>> Analyzers + => new List>> { CMSAutocompleteEnableForLogin => AnalyzeUsingExpression( CMSAutocompleteEnableForLogin, @@ -130,19 +127,19 @@ public override IEnumerable> valueIsRecommended, - string recommendedValue, - Term recommendationReason + string? recommendedValue, + Term? recommendationReason ) { - string keyValue = cmsSettingsKey.KeyValue; - if (valueIsRecommended.Compile()(keyValue)) + string? keyValue = cmsSettingsKey.KeyValue; + if (keyValue is null || recommendedValue is null || recommendationReason is null || valueIsRecommended.Compile()(keyValue)) { return null; } diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/SystemWebSettingAnalyzers.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/SystemWebSettingAnalyzers.cs similarity index 76% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/SystemWebSettingAnalyzers.cs rename to src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/SystemWebSettingAnalyzers.cs index d3f756f0..b9f2494c 100644 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Analyzers/SystemWebSettingAnalyzers.cs +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Analyzers/SystemWebSettingAnalyzers.cs @@ -1,18 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq.Expressions; +using System.Linq.Expressions; using System.Xml.Linq; -using KenticoInspector.Core.Models; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Results; +using KInspector.Core.Models; +using KInspector.Reports.SecuritySettingsAnalysis.Models; +using KInspector.Reports.SecuritySettingsAnalysis.Models.Results; -namespace KenticoInspector.Reports.SecuritySettingsAnalysis.Analyzers +namespace KInspector.Reports.SecuritySettingsAnalysis.Analyzers { - public class SystemWebSettingAnalyzers : AbstractAnalyzers + public class SystemWebSettingAnalyzers : AbstractAnalyzers { - public override IEnumerable>> Analyzers - => new List>> + public override IEnumerable>> Analyzers + => new List>> { Authentication => AnalyzeUsingExpression( Authentication.Element("forms"), @@ -62,22 +60,22 @@ public SystemWebSettingAnalyzers(Terms reportTerms) : base(reportTerms) { } - protected override bool Match(string analyzerName, string name) + protected override bool Match(string? analyzerName, string? name) { - return analyzerName.Equals(name, StringComparison.InvariantCultureIgnoreCase); + return analyzerName?.Equals(name, StringComparison.InvariantCultureIgnoreCase) ?? false; } - protected override WebConfigSettingResult AnalyzeUsingExpression( + protected override WebConfigSettingResult? AnalyzeUsingExpression( XElement systemWebSetting, Expression> valueIsRecommended, string recommendedValue, Term recommendationReason ) { - string attributeName = valueIsRecommended.Parameters[0].Name; - string keyValue = systemWebSetting.Attribute(attributeName)?.Value; + string? attributeName = valueIsRecommended.Parameters[0]?.Name; + string? keyValue = systemWebSetting.Attribute(attributeName ?? string.Empty)?.Value; - if (valueIsRecommended.Compile()(keyValue)) + if (keyValue is null || attributeName is null || valueIsRecommended.Compile()(keyValue)) { return null; } diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Metadata/en-US.yaml b/src/KInspector.Reports/SecuritySettingsAnalysis/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Metadata/en-US.yaml rename to src/KInspector.Reports/SecuritySettingsAnalysis/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsCategory.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsCategory.cs new file mode 100644 index 00000000..66711914 --- /dev/null +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsCategory.cs @@ -0,0 +1,9 @@ +namespace KInspector.Reports.SecuritySettingsAnalysis.Models.Data +{ + public class CmsSettingsCategory + { + public int CategoryID { get; set; } + + public string? CategoryDisplayName { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsKey.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsKey.cs new file mode 100644 index 00000000..3f1c482c --- /dev/null +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Data/CmsSettingsKey.cs @@ -0,0 +1,21 @@ +namespace KInspector.Reports.SecuritySettingsAnalysis.Models.Data +{ + public class CmsSettingsKey + { + public int SiteID { get; set; } + + public int KeyID { get; set; } + + public string? KeyName { get; set; } + + public string? KeyDisplayName { get; set; } + + public string? KeyValue { get; set; } + + public string? KeyDefaultValue { get; set; } + + public int KeyCategoryID { get; set; } + + public string? CategoryIDPath { get; set; } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Results/CmsSettingsKeyResult.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Results/CmsSettingsKeyResult.cs similarity index 74% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Results/CmsSettingsKeyResult.cs rename to src/KInspector.Reports/SecuritySettingsAnalysis/Models/Results/CmsSettingsKeyResult.cs index 2c97b637..95fe51bc 100644 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Results/CmsSettingsKeyResult.cs +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Results/CmsSettingsKeyResult.cs @@ -1,32 +1,28 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using KInspector.Core.Models; +using KInspector.Reports.SecuritySettingsAnalysis.Models.Data; -using KenticoInspector.Core.Models; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Data; - -namespace KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Results +namespace KInspector.Reports.SecuritySettingsAnalysis.Models.Results { public class CmsSettingsKeyResult { private readonly int siteID; - private readonly string categoryIDPath; + private readonly string? categoryIDPath; - public string SiteName { get; } + public string? SiteName { get; } public int KeyID { get; } - public string KeyPath { get; } + public string? KeyPath { get; } - public string KeyDisplayName { get; } + public string? KeyDisplayName { get; } - public string KeyDefaultValue { get; } + public string? KeyDefaultValue { get; } - public string KeyValue { get; } + public string? KeyValue { get; } - public string RecommendedValue { get; } + public string? RecommendedValue { get; } - public string RecommendationReason { get; } + public string? RecommendationReason { get; } public CmsSettingsKeyResult(CmsSettingsKey cmsSettingsKey, string recommendedValue, Term recommendationReason) { @@ -49,7 +45,7 @@ IDictionary resxValues ) { SiteName = sites - .FirstOrDefault(site => site.Id == cmsSettingsKeyResult.siteID) + .FirstOrDefault(site => site.Id == cmsSettingsKeyResult.siteID)? .Name; KeyID = cmsSettingsKeyResult.KeyID; @@ -78,19 +74,24 @@ IDictionary resxValues public IEnumerable GetCategoryIdsOnPath() { - return categoryIDPath + return categoryIDPath? .Split('/', StringSplitOptions.RemoveEmptyEntries) - .Select(pathSegment => pathSegment.TrimStart('0')); + .Select(pathSegment => pathSegment.TrimStart('0')) ?? Enumerable.Empty(); } - private static string TryReplaceDisplayName(IDictionary resxValues, string displayName) + private static string? TryReplaceDisplayName(IDictionary resxValues, string? displayName) { + if (displayName is null) + { + return null; + } + displayName = displayName .Replace("{$", string.Empty) .Replace("$}", string.Empty) .ToLowerInvariant(); - if (resxValues.TryGetValue(displayName, out string keyName)) + if (resxValues.TryGetValue(displayName, out string? keyName)) { displayName = keyName; } diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Results/WebConfigSettingResult.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Results/WebConfigSettingResult.cs similarity index 89% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Results/WebConfigSettingResult.cs rename to src/KInspector.Reports/SecuritySettingsAnalysis/Models/Results/WebConfigSettingResult.cs index 4be37357..e0dafdb9 100644 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Models/Results/WebConfigSettingResult.cs +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Results/WebConfigSettingResult.cs @@ -1,10 +1,9 @@ -using System.Linq; -using System.Web; +using System.Web; using System.Xml.Linq; -using KenticoInspector.Core.Models; +using KInspector.Core.Models; -namespace KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Results +namespace KInspector.Reports.SecuritySettingsAnalysis.Models.Results { public class WebConfigSettingResult { diff --git a/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Terms.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Terms.cs new file mode 100644 index 00000000..878b5835 --- /dev/null +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Models/Terms.cs @@ -0,0 +1,137 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.SecuritySettingsAnalysis.Models +{ + public class Terms + { + public Term? GlobalSiteName { get; set; } + + public RecommendationReasons? RecommendationReasons { get; set; } + + public RecommendedValues? RecommendedValues { get; set; } + + public Summaries? Summaries { get; set; } + + public TableTitles? TableTitles { get; set; } + } + + public class RecommendedValues + { + public Term? Empty { get; set; } + + public Term? InvalidLogonAttempts { get; set; } + + public Term? NoDangerousExtensions { get; set; } + + public Term? NotEmpty { get; set; } + + public Term? NotOn { get; set; } + + public Term? NotSaUser { get; set; } + + public Term? ResetPasswordInterval { get; set; } + + public Term? PasswordMinimalLength { get; set; } + + public Term? PasswordNumberOfNonAlphaNumChars { get; set; } + + public Term? ReCaptcha { get; set; } + } + + public class RecommendationReasons + { + public AppSettings? AppSettings { get; set; } + + public ConnectionStrings? ConnectionStrings { get; set; } + + public SettingsKeys? SettingsKeys { get; set; } + + public SystemWebSettings? SystemWebSettings { get; set; } + } + + public class AppSettings + { + public Term? CMSEnableCsrfProtection { get; set; } + + public Term? CMSHashStringSalt { get; set; } + + public Term? CMSRenewSessionAuthChange { get; set; } + + public Term? CMSXFrameOptionsExcluded { get; set; } + } + + public class ConnectionStrings + { + public Term? SaUser { get; set; } + } + + public class SettingsKeys + { + public Term? CMSAutocompleteEnableForLogin { get; set; } + + public Term? CMSCaptchaControl { get; set; } + + public Term? CMSChatEnableFloodProtection { get; set; } + + public Term? CMSFloodProtectionEnabled { get; set; } + + public Term? CMSForumAttachmentExtensions { get; set; } + + public Term? CMSMaximumInvalidLogonAttempts { get; set; } + + public Term? CMSMediaFileAllowedExtensions { get; set; } + + public Term? CMSPasswordExpiration { get; set; } + + public Term? CMSPasswordExpirationBehaviour { get; set; } + + public Term? CMSPasswordFormat { get; set; } + + public Term? CMSPolicyMinimalLength { get; set; } + + public Term? CMSPolicyNumberOfNonAlphaNumChars { get; set; } + + public Term? CMSRegistrationEmailConfirmation { get; set; } + + public Term? CMSResetPasswordInterval { get; set; } + + public Term? CMSRESTServiceEnabled { get; set; } + + public Term? CMSUploadExtensions { get; set; } + + public Term? CMSUsePasswordPolicy { get; set; } + + public Term? CMSUseSSLForAdministrationInterface { get; set; } + } + + public class SystemWebSettings + { + public Term? AuthenticationCookieless { get; set; } + + public Term? CompilationDebug { get; set; } + + public Term? CustomErrorsMode { get; set; } + + public Term? HttpCookiesHttpOnlyCookies { get; set; } + + public Term? PagesEnableViewState { get; set; } + + public Term? PagesEnableViewStateMac { get; set; } + + public Term? TraceEnabled { get; set; } + } + + public class Summaries + { + public Term? Warning { get; set; } + + public Term? Good { get; set; } + } + + public class TableTitles + { + public Term? AdminSecuritySettings { get; set; } + + public Term? WebConfigSecuritySettings { get; set; } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Report.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Report.cs similarity index 74% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Report.cs rename to src/KInspector.Reports/SecuritySettingsAnalysis/Report.cs index ee6c36c9..f4ee39ea 100644 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Report.cs +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Report.cs @@ -1,57 +1,57 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Xml; +using System.Xml; using System.Xml.Linq; -using KenticoInspector.Core; -using KenticoInspector.Core.Constants; -using KenticoInspector.Core.Helpers; -using KenticoInspector.Core.Models; -using KenticoInspector.Core.Services.Interfaces; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Analyzers; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Data; -using KenticoInspector.Reports.SecuritySettingsAnalysis.Models.Results; - -namespace KenticoInspector.Reports.SecuritySettingsAnalysis +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.SecuritySettingsAnalysis.Analyzers; +using KInspector.Reports.SecuritySettingsAnalysis.Models; +using KInspector.Reports.SecuritySettingsAnalysis.Models.Data; +using KInspector.Reports.SecuritySettingsAnalysis.Models.Results; + +namespace KInspector.Reports.SecuritySettingsAnalysis { public class Report : AbstractReport { private readonly IDatabaseService databaseService; private readonly IInstanceService instanceService; private readonly ICmsFileService cmsFileService; + private readonly IConfigService configService; public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); public override IList Tags => new List { - ReportTags.Security, - ReportTags.Configuration + ModuleTags.Security, + ModuleTags.Configuration }; public Report( IDatabaseService databaseService, IInstanceService instanceService, ICmsFileService cmsFileService, - IModuleMetadataService moduleMetadataService + IModuleMetadataService moduleMetadataService, + IConfigService configService ) : base(moduleMetadataService) { this.databaseService = databaseService; this.instanceService = instanceService; this.cmsFileService = cmsFileService; + this.configService = configService; } - public override ReportResults GetResults() + public async override Task GetResults() { var cmsSettingsKeysNames = new SettingsKeyAnalyzers(null) .Analyzers .Select(analyzer => analyzer.Parameters[0].Name); - var cmsSettingsKeys = databaseService.ExecuteSqlFromFile( + var cmsSettingsKeys = await databaseService.ExecuteSqlFromFile( Scripts.GetSecurityCmsSettings, new { cmsSettingsKeysNames } - ); + ); var cmsSettingsKeyResults = GetCmsSettingsKeyResults(cmsSettingsKeys); @@ -59,13 +59,14 @@ public override ReportResults GetResults() .SelectMany(cmsSettingsKeyResult => cmsSettingsKeyResult.GetCategoryIdsOnPath()) .Distinct(); - var cmsSettingsCategories = databaseService.ExecuteSqlFromFile( + var cmsSettingsCategories = await databaseService.ExecuteSqlFromFile( Scripts.GetCmsSettingsCategories, new { cmsSettingsCategoryIdsOnPaths } - ); + ); + var currentInstance = configService.GetCurrentInstance(); var sites = instanceService - .GetInstanceDetails(instanceService.CurrentInstance) + .GetInstanceDetails(currentInstance)? .Sites .Append(new Site() { @@ -73,20 +74,17 @@ public override ReportResults GetResults() Name = Metadata.Terms.GlobalSiteName }); - var instancePath = instanceService.CurrentInstance.AdminPath; - + var instancePath = currentInstance?.AdministrationPath; var resxValues = cmsFileService.GetResourceStringsFromResx(instancePath); - var localizedCmsSettingsKeyResults = cmsSettingsKeyResults .Select(cmsSettingsKeyResult => new CmsSettingsKeyResult( cmsSettingsKeyResult, cmsSettingsCategories, - sites, + sites ?? Enumerable.Empty(), resxValues - )); + )); var webConfigXml = cmsFileService.GetXmlDocument(instancePath, DefaultKenticoPaths.WebConfigFile); - var webConfigSettingsResults = GetWebConfigSettingsResults(webConfigXml); return CompileResults(localizedCmsSettingsKeyResults, webConfigSettingsResults); @@ -107,8 +105,13 @@ private IEnumerable GetCmsSettingsKeyResults(IEnumerable GetWebConfigSettingsResults(XmlDocument webConfigXml) + private IEnumerable GetWebConfigSettingsResults(XmlDocument? webConfigXml) { + if (webConfigXml is null) + { + return Enumerable.Empty(); + } + // This conversion is temporary pending standardization of XDocument usage var webConfig = ToXDocument(webConfigXml); @@ -186,60 +189,57 @@ private IEnumerable GetConnectionStringsResults(IEnumera } } - private ReportResults CompileResults( + private ModuleResults CompileResults( IEnumerable cmsSettingsKeyResults, IEnumerable webConfigSettingsResults ) { if (!cmsSettingsKeyResults.Any() && !webConfigSettingsResults.Any()) { - return new ReportResults + return new ModuleResults { Status = ResultsStatus.Good, - Summary = Metadata.Terms.Summaries.Good + Summary = Metadata.Terms.Summaries?.Good, + Type = ResultsType.NoResults }; } - var errorReportResults = new ReportResults + var errorModuleResults = new ModuleResults { Type = ResultsType.TableList, Status = ResultsStatus.Warning }; var cmsSettingsKeyResultsCount = IfAnyAddTableResult( - errorReportResults.Data, + errorModuleResults.TableResults, cmsSettingsKeyResults, - Metadata.Terms.TableTitles.AdminSecuritySettings - ); + Metadata.Terms.TableTitles?.AdminSecuritySettings + ); var webConfigSettingsResultsCount = IfAnyAddTableResult( - errorReportResults.Data, + errorModuleResults.TableResults, webConfigSettingsResults, - Metadata.Terms.TableTitles.WebConfigSecuritySettings - ); + Metadata.Terms.TableTitles?.WebConfigSecuritySettings + ); - errorReportResults.Summary = Metadata.Terms.Summaries.Warning.With(new + errorModuleResults.Summary = Metadata.Terms.Summaries?.Warning?.With(new { cmsSettingsKeyResultsCount, webConfigSettingsResultsCount }); - return errorReportResults; + return errorModuleResults; } - private static int IfAnyAddTableResult(dynamic data, IEnumerable results, Term tableNameTerm) + private static int IfAnyAddTableResult(IList tables, IEnumerable results, Term? tableNameTerm) { if (results.Any()) { - var tableResult = new TableResult + tables.Add(new TableResult { Name = tableNameTerm, Rows = results - }; - - IDictionary dictionaryData = data; - - dictionaryData.Add(tableNameTerm, tableResult); + }); } return results.Count(); @@ -247,10 +247,9 @@ private static int IfAnyAddTableResult(dynamic data, IEnumerable results, private static XDocument ToXDocument(XmlDocument document, LoadOptions options = LoadOptions.None) { - using (var reader = new XmlNodeReader(document)) - { - return XDocument.Load(reader, options); - } + using var reader = new XmlNodeReader(document); + + return XDocument.Load(reader, options); } } } \ No newline at end of file diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Scripts.cs b/src/KInspector.Reports/SecuritySettingsAnalysis/Scripts.cs similarity index 85% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Scripts.cs rename to src/KInspector.Reports/SecuritySettingsAnalysis/Scripts.cs index b7b63a72..66f09e0d 100644 --- a/KenticoInspector.Reports/SecuritySettingsAnalysis/Scripts.cs +++ b/src/KInspector.Reports/SecuritySettingsAnalysis/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.SecuritySettingsAnalysis +namespace KInspector.Reports.SecuritySettingsAnalysis { public static class Scripts { diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Scripts/GetCmsSettingsCategories.sql b/src/KInspector.Reports/SecuritySettingsAnalysis/Scripts/GetCmsSettingsCategories.sql similarity index 100% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Scripts/GetCmsSettingsCategories.sql rename to src/KInspector.Reports/SecuritySettingsAnalysis/Scripts/GetCmsSettingsCategories.sql diff --git a/KenticoInspector.Reports/SecuritySettingsAnalysis/Scripts/GetSecurityCmsSettings.sql b/src/KInspector.Reports/SecuritySettingsAnalysis/Scripts/GetSecurityCmsSettings.sql similarity index 100% rename from KenticoInspector.Reports/SecuritySettingsAnalysis/Scripts/GetSecurityCmsSettings.sql rename to src/KInspector.Reports/SecuritySettingsAnalysis/Scripts/GetSecurityCmsSettings.sql diff --git a/KenticoInspector.Reports/TaskProcessingAnalysis/Metadata/en-US.yaml b/src/KInspector.Reports/TaskProcessingAnalysis/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/TaskProcessingAnalysis/Metadata/en-US.yaml rename to src/KInspector.Reports/TaskProcessingAnalysis/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/TaskProcessingAnalysis/Models/Terms.cs b/src/KInspector.Reports/TaskProcessingAnalysis/Models/Terms.cs new file mode 100644 index 00000000..e0da4f39 --- /dev/null +++ b/src/KInspector.Reports/TaskProcessingAnalysis/Models/Terms.cs @@ -0,0 +1,19 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.TaskProcessingAnalysis.Models +{ + public class Terms + { + public Term? CountIntegrationBusTask { get; set; } + + public Term? CountScheduledTask { get; set; } + + public Term? CountSearchTask { get; set; } + + public Term? CountStagingTask { get; set; } + + public Term? CountUnprocessedTask { get; set; } + + public Term? CountWebFarmTask { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/TaskProcessingAnalysis/Report.cs b/src/KInspector.Reports/TaskProcessingAnalysis/Report.cs new file mode 100644 index 00000000..7ca627e2 --- /dev/null +++ b/src/KInspector.Reports/TaskProcessingAnalysis/Report.cs @@ -0,0 +1,94 @@ +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.TaskProcessingAnalysis.Models; + +namespace KInspector.Reports.TaskProcessingAnalysis +{ + public class Report : AbstractReport + { + private readonly IDatabaseService databaseService; + + public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); + + public override IList Tags => new List { + ModuleTags.Health + }; + + public async override Task GetResults() + { + var unprocessedIntegrationBusTasks = await databaseService.ExecuteSqlFromFileScalar(Scripts.GetCountOfUnprocessedIntegrationBusTasks); + var unprocessedScheduledTasks = await databaseService.ExecuteSqlFromFileScalar(Scripts.GetCountOfUnprocessedScheduledTasks); + var unprocessedSearchTasks = await databaseService.ExecuteSqlFromFileScalar(Scripts.GetCountOfUnprocessedSearchTasks); + var unprocessedStagingTasks = await databaseService.ExecuteSqlFromFileScalar(Scripts.GetCountOfUnprocessedStagingTasks); + var unprocessedWebFarmTasks = await databaseService.ExecuteSqlFromFileScalar(Scripts.GetCountOfUnprocessedWebFarmTasks); + + var rawResults = new Dictionary + { + { TaskType.IntegrationBusTask, unprocessedIntegrationBusTasks }, + { TaskType.ScheduledTask, unprocessedScheduledTasks }, + { TaskType.SearchTask, unprocessedSearchTasks }, + { TaskType.StagingTask, unprocessedStagingTasks }, + { TaskType.WebFarmTask, unprocessedWebFarmTasks } + }; + + return CompileResults(rawResults); + } + + private string AsTaskCountLabel(KeyValuePair taskTypeCount) + { + Term? label = string.Empty; + var count = taskTypeCount.Value; + + switch (taskTypeCount.Key) + { + case TaskType.IntegrationBusTask: + label = Metadata.Terms.CountIntegrationBusTask?.With(new { count }); + break; + + case TaskType.ScheduledTask: + label = Metadata.Terms.CountScheduledTask?.With(new { count }); + break; + + case TaskType.SearchTask: + label = Metadata.Terms.CountSearchTask?.With(new { count }); + break; + + case TaskType.StagingTask: + label = Metadata.Terms.CountStagingTask?.With(new { count }); + break; + + case TaskType.WebFarmTask: + label = Metadata.Terms.CountWebFarmTask?.With(new { count }); + break; + } + + return label?.With(new { count }); + } + + private ModuleResults CompileResults(Dictionary taskResults) + { + var totalUnprocessedTasks = taskResults.Sum(x => x.Value); + var results = new ModuleResults + { + Status = totalUnprocessedTasks > 0 ? ResultsStatus.Warning : ResultsStatus.Good, + Summary = Metadata.Terms.CountUnprocessedTask?.With(new { count = totalUnprocessedTasks }), + Type = totalUnprocessedTasks > 0 ? ResultsType.StringList : ResultsType.NoResults + }; + var taskSummaries = taskResults.Where(x => x.Value > 0).Select(AsTaskCountLabel); + foreach (var str in taskSummaries) + { + results.StringResults.Add(str); + } + + return results; + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/TaskProcessingAnalysis/Scripts.cs b/src/KInspector.Reports/TaskProcessingAnalysis/Scripts.cs similarity index 93% rename from KenticoInspector.Reports/TaskProcessingAnalysis/Scripts.cs rename to src/KInspector.Reports/TaskProcessingAnalysis/Scripts.cs index 615bc89d..cf770986 100644 --- a/KenticoInspector.Reports/TaskProcessingAnalysis/Scripts.cs +++ b/src/KInspector.Reports/TaskProcessingAnalysis/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.TaskProcessingAnalysis +namespace KInspector.Reports.TaskProcessingAnalysis { public static class Scripts { diff --git a/KenticoInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedIntegrationBusTasks.sql b/src/KInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedIntegrationBusTasks.sql similarity index 100% rename from KenticoInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedIntegrationBusTasks.sql rename to src/KInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedIntegrationBusTasks.sql diff --git a/KenticoInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedScheduledTasks.sql b/src/KInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedScheduledTasks.sql similarity index 100% rename from KenticoInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedScheduledTasks.sql rename to src/KInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedScheduledTasks.sql diff --git a/KenticoInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedSearchTasks.sql b/src/KInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedSearchTasks.sql similarity index 100% rename from KenticoInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedSearchTasks.sql rename to src/KInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedSearchTasks.sql diff --git a/KenticoInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedStagingTasks.sql b/src/KInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedStagingTasks.sql similarity index 100% rename from KenticoInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedStagingTasks.sql rename to src/KInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedStagingTasks.sql diff --git a/KenticoInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedWebFarmTasks.sql b/src/KInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedWebFarmTasks.sql similarity index 100% rename from KenticoInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedWebFarmTasks.sql rename to src/KInspector.Reports/TaskProcessingAnalysis/Scripts/GetCountOfUnprocessedWebFarmTasks.sql diff --git a/KenticoInspector.Reports/TaskProcessingAnalysis/TaskTypes.cs b/src/KInspector.Reports/TaskProcessingAnalysis/TaskTypes.cs similarity index 71% rename from KenticoInspector.Reports/TaskProcessingAnalysis/TaskTypes.cs rename to src/KInspector.Reports/TaskProcessingAnalysis/TaskTypes.cs index fa707794..5dea0ee5 100644 --- a/KenticoInspector.Reports/TaskProcessingAnalysis/TaskTypes.cs +++ b/src/KInspector.Reports/TaskProcessingAnalysis/TaskTypes.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.TaskProcessingAnalysis +namespace KInspector.Reports.TaskProcessingAnalysis { public enum TaskType { diff --git a/KenticoInspector.Reports/TemplateLayoutAnalysis/Metadata/en-US.yaml b/src/KInspector.Reports/TemplateLayoutAnalysis/Metadata/en-US.yaml similarity index 100% rename from KenticoInspector.Reports/TemplateLayoutAnalysis/Metadata/en-US.yaml rename to src/KInspector.Reports/TemplateLayoutAnalysis/Metadata/en-US.yaml diff --git a/src/KInspector.Reports/TemplateLayoutAnalysis/Models/IdenticalPageLayouts.cs b/src/KInspector.Reports/TemplateLayoutAnalysis/Models/IdenticalPageLayouts.cs new file mode 100644 index 00000000..60918c0e --- /dev/null +++ b/src/KInspector.Reports/TemplateLayoutAnalysis/Models/IdenticalPageLayouts.cs @@ -0,0 +1,9 @@ +namespace KInspector.Reports.TemplateLayoutAnalysis.Models +{ + public class IdenticalPageLayouts + { + public string? CodeNames { get; set; } + + public string? PageTemplateLayout { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/TemplateLayoutAnalysis/Models/Terms.cs b/src/KInspector.Reports/TemplateLayoutAnalysis/Models/Terms.cs new file mode 100644 index 00000000..d5f46db7 --- /dev/null +++ b/src/KInspector.Reports/TemplateLayoutAnalysis/Models/Terms.cs @@ -0,0 +1,13 @@ +using KInspector.Core.Models; + +namespace KInspector.Reports.TemplateLayoutAnalysis.Models +{ + public class Terms + { + public Term? CountIdenticalPageLayoutFound { get; set; } + + public Term? IdenticalPageLayouts { get; set; } + + public Term? NoIdenticalPageLayoutsFound { get; set; } + } +} \ No newline at end of file diff --git a/src/KInspector.Reports/TemplateLayoutAnalysis/Report.cs b/src/KInspector.Reports/TemplateLayoutAnalysis/Report.cs new file mode 100644 index 00000000..e22caad3 --- /dev/null +++ b/src/KInspector.Reports/TemplateLayoutAnalysis/Report.cs @@ -0,0 +1,62 @@ +using KInspector.Core; +using KInspector.Core.Constants; +using KInspector.Core.Helpers; +using KInspector.Core.Models; +using KInspector.Core.Services.Interfaces; +using KInspector.Reports.TemplateLayoutAnalysis.Models; + +namespace KInspector.Reports.TemplateLayoutAnalysis +{ + public class Report : AbstractReport + { + private readonly IDatabaseService databaseService; + + public Report(IDatabaseService databaseService, IModuleMetadataService moduleMetadataService) : base(moduleMetadataService) + { + this.databaseService = databaseService; + } + + public override IList CompatibleVersions => VersionHelper.GetVersionList("10", "11", "12", "13"); + + public override IList Tags => new List + { + ModuleTags.Information, + ModuleTags.PortalEngine + }; + + public async override Task GetResults() + { + var identicalLayouts = await databaseService.ExecuteSqlFromFile(Scripts.GetIdenticalLayouts); + + return CompileResults(identicalLayouts); + } + + private ModuleResults CompileResults(IEnumerable identicalPageLayouts) + { + var countIdenticalPageLayouts = identicalPageLayouts.Count(); + if (countIdenticalPageLayouts == 0) + { + return new ModuleResults + { + Type = ResultsType.NoResults, + Status = ResultsStatus.Information, + Summary = Metadata.Terms.NoIdenticalPageLayoutsFound + }; + } + + var results = new ModuleResults + { + Type = ResultsType.TableList, + Status = ResultsStatus.Information, + Summary = Metadata.Terms.CountIdenticalPageLayoutFound?.With(new { count = countIdenticalPageLayouts }) + }; + results.TableResults.Add(new TableResult + { + Name = Metadata.Terms.IdenticalPageLayouts, + Rows = identicalPageLayouts + }); + + return results; + } + } +} \ No newline at end of file diff --git a/KenticoInspector.Reports/TemplateLayoutAnalysis/Scripts.cs b/src/KInspector.Reports/TemplateLayoutAnalysis/Scripts.cs similarity index 80% rename from KenticoInspector.Reports/TemplateLayoutAnalysis/Scripts.cs rename to src/KInspector.Reports/TemplateLayoutAnalysis/Scripts.cs index c4882efd..db53eb96 100644 --- a/KenticoInspector.Reports/TemplateLayoutAnalysis/Scripts.cs +++ b/src/KInspector.Reports/TemplateLayoutAnalysis/Scripts.cs @@ -1,4 +1,4 @@ -namespace KenticoInspector.Reports.TemplateLayoutAnalysis +namespace KInspector.Reports.TemplateLayoutAnalysis { public static class Scripts { diff --git a/KenticoInspector.Reports/TemplateLayoutAnalysis/Scripts/GetIdenticalLayouts.sql b/src/KInspector.Reports/TemplateLayoutAnalysis/Scripts/GetIdenticalLayouts.sql similarity index 100% rename from KenticoInspector.Reports/TemplateLayoutAnalysis/Scripts/GetIdenticalLayouts.sql rename to src/KInspector.Reports/TemplateLayoutAnalysis/Scripts/GetIdenticalLayouts.sql diff --git a/KenticoInspector.Reports/TransformationSecurityAnalysis/IssueAnalyzers.cs b/src/KInspector.Reports/TransformationSecurityAnalysis/IssueAnalyzers.cs similarity index 70% rename from KenticoInspector.Reports/TransformationSecurityAnalysis/IssueAnalyzers.cs rename to src/KInspector.Reports/TransformationSecurityAnalysis/IssueAnalyzers.cs index a3428b52..4c84d86c 100644 --- a/KenticoInspector.Reports/TransformationSecurityAnalysis/IssueAnalyzers.cs +++ b/src/KInspector.Reports/TransformationSecurityAnalysis/IssueAnalyzers.cs @@ -1,12 +1,11 @@ -using System.Collections.Generic; -using System.Runtime.CompilerServices; +using System.Runtime.CompilerServices; using System.Text.RegularExpressions; -using KenticoInspector.Core.Models; -using KenticoInspector.Reports.TransformationSecurityAnalysis.Models; -using KenticoInspector.Reports.TransformationSecurityAnalysis.Models.Data; +using KInspector.Core.Models; +using KInspector.Reports.TransformationSecurityAnalysis.Models; +using KInspector.Reports.TransformationSecurityAnalysis.Models.Data; -namespace KenticoInspector.Reports.TransformationSecurityAnalysis +namespace KInspector.Reports.TransformationSecurityAnalysis { /// /// Contains instance methods returning that are called by the report to analyze a single . @@ -16,44 +15,49 @@ public class IssueAnalyzers { private Terms ReportTerms { get; } - public static IDictionary DetectedIssueTypes { get; set; } = new Dictionary(); + public static IDictionary DetectedIssueTypes { get; set; } = new Dictionary(); public IssueAnalyzers(Terms reportTerms) { ReportTerms = reportTerms; } - public void XssQueryHelper(Transformation transformation) => UseRegexAnalysis(transformation, "queryhelper\\.", ReportTerms.IssueDescriptions.XssQueryHelper); + public void XssQueryHelper(Transformation transformation) => UseRegexAnalysis(transformation, "queryhelper\\.", ReportTerms.IssueDescriptions?.XssQueryHelper); - public void XssQueryString(Transformation transformation) => UseRegexAnalysis(transformation, "[ (.]querystring", ReportTerms.IssueDescriptions.XssQueryString); + public void XssQueryString(Transformation transformation) => UseRegexAnalysis(transformation, "[ (.]querystring", ReportTerms.IssueDescriptions?.XssQueryString); - public void XssHttpContext(Transformation transformation) => UseRegexAnalysis(transformation, "[ (.]httpcontext\\.", ReportTerms.IssueDescriptions.XssHttpContext); + public void XssHttpContext(Transformation transformation) => UseRegexAnalysis(transformation, "[ (.]httpcontext\\.", ReportTerms.IssueDescriptions?.XssHttpContext); - public void XssServer(Transformation transformation) => UseRegexAnalysis(transformation, "[ (.]server\\.", ReportTerms.IssueDescriptions.XssServer); + public void XssServer(Transformation transformation) => UseRegexAnalysis(transformation, "[ (.]server\\.", ReportTerms.IssueDescriptions?.XssServer); - public void XssRequest(Transformation transformation) => UseRegexAnalysis(transformation, "[ (.]request\\.", ReportTerms.IssueDescriptions.XssRequest); + public void XssRequest(Transformation transformation) => UseRegexAnalysis(transformation, "[ (.]request\\.", ReportTerms.IssueDescriptions?.XssRequest); - public void XssDocument(Transformation transformation) => UseRegexAnalysis(transformation, "