├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── VRChatConfigurationEditor.sln ├── VRChatConfigurationEditor ├── App.config ├── App.xaml ├── App.xaml.cs ├── Bind.cs ├── MainWindow.xaml ├── MainWindow.xaml.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings ├── Utils.cs ├── VRChatConfigurationEditor.csproj ├── icon.ico ├── languages │ ├── en.xaml │ ├── ja.xaml │ ├── ko.xaml │ ├── zh-CN.xaml │ └── zh-TW.xaml └── packages.config ├── images └── jetbrains.svg └── web-ui ├── .gitignore ├── index.html ├── locales ├── en.yaml └── zh-CN.yaml ├── package.json ├── pnpm-lock.yaml ├── public └── favicon.png ├── src ├── App.vue ├── api.ts ├── components │ ├── Header.vue │ ├── HelpIcon.vue │ └── Locale.vue ├── i18n.ts ├── main.ts ├── shims-vue.d.ts ├── utils.ts ├── views │ └── Home.vue ├── vite-env.d.ts └── webview2.ts ├── tsconfig.json └── vite.config.ts /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Oo]ut/ 33 | [Ll]og/ 34 | [Ll]ogs/ 35 | 36 | # Visual Studio 2015/2017 cache/options directory 37 | .vs/ 38 | # Uncomment if you have tasks that create the project's static files in wwwroot 39 | #wwwroot/ 40 | 41 | # Visual Studio 2017 auto generated files 42 | Generated\ Files/ 43 | 44 | # MSTest test Results 45 | [Tt]est[Rr]esult*/ 46 | [Bb]uild[Ll]og.* 47 | 48 | # NUnit 49 | *.VisualState.xml 50 | TestResult.xml 51 | nunit-*.xml 52 | 53 | # Build Results of an ATL Project 54 | [Dd]ebugPS/ 55 | [Rr]eleasePS/ 56 | dlldata.c 57 | 58 | # Benchmark Results 59 | BenchmarkDotNet.Artifacts/ 60 | 61 | # .NET Core 62 | project.lock.json 63 | project.fragment.lock.json 64 | artifacts/ 65 | 66 | # ASP.NET Scaffolding 67 | ScaffoldingReadMe.txt 68 | 69 | # StyleCop 70 | StyleCopReport.xml 71 | 72 | # Files built by Visual Studio 73 | *_i.c 74 | *_p.c 75 | *_h.h 76 | *.ilk 77 | *.meta 78 | *.obj 79 | *.iobj 80 | *.pch 81 | *.pdb 82 | *.ipdb 83 | *.pgc 84 | *.pgd 85 | *.rsp 86 | *.sbr 87 | *.tlb 88 | *.tli 89 | *.tlh 90 | *.tmp 91 | *.tmp_proj 92 | *_wpftmp.csproj 93 | *.log 94 | *.vspscc 95 | *.vssscc 96 | .builds 97 | *.pidb 98 | *.svclog 99 | *.scc 100 | 101 | # Chutzpah Test files 102 | _Chutzpah* 103 | 104 | # Visual C++ cache files 105 | ipch/ 106 | *.aps 107 | *.ncb 108 | *.opendb 109 | *.opensdf 110 | *.sdf 111 | *.cachefile 112 | *.VC.db 113 | *.VC.VC.opendb 114 | 115 | # Visual Studio profiler 116 | *.psess 117 | *.vsp 118 | *.vspx 119 | *.sap 120 | 121 | # Visual Studio Trace Files 122 | *.e2e 123 | 124 | # TFS 2012 Local Workspace 125 | $tf/ 126 | 127 | # Guidance Automation Toolkit 128 | *.gpState 129 | 130 | # ReSharper is a .NET coding add-in 131 | _ReSharper*/ 132 | *.[Rr]e[Ss]harper 133 | *.DotSettings.user 134 | 135 | # TeamCity is a build add-in 136 | _TeamCity* 137 | 138 | # DotCover is a Code Coverage Tool 139 | *.dotCover 140 | 141 | # AxoCover is a Code Coverage Tool 142 | .axoCover/* 143 | !.axoCover/settings.json 144 | 145 | # Coverlet is a free, cross platform Code Coverage Tool 146 | coverage*.json 147 | coverage*.xml 148 | coverage*.info 149 | 150 | # Visual Studio code coverage results 151 | *.coverage 152 | *.coveragexml 153 | 154 | # NCrunch 155 | _NCrunch_* 156 | .*crunch*.local.xml 157 | nCrunchTemp_* 158 | 159 | # MightyMoose 160 | *.mm.* 161 | AutoTest.Net/ 162 | 163 | # Web workbench (sass) 164 | .sass-cache/ 165 | 166 | # Installshield output folder 167 | [Ee]xpress/ 168 | 169 | # DocProject is a documentation generator add-in 170 | DocProject/buildhelp/ 171 | DocProject/Help/*.HxT 172 | DocProject/Help/*.HxC 173 | DocProject/Help/*.hhc 174 | DocProject/Help/*.hhk 175 | DocProject/Help/*.hhp 176 | DocProject/Help/Html2 177 | DocProject/Help/html 178 | 179 | # Click-Once directory 180 | publish/ 181 | 182 | # Publish Web Output 183 | *.[Pp]ublish.xml 184 | *.azurePubxml 185 | # Note: Comment the next line if you want to checkin your web deploy settings, 186 | # but database connection strings (with potential passwords) will be unencrypted 187 | *.pubxml 188 | *.publishproj 189 | 190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 191 | # checkin your Azure Web App publish settings, but sensitive information contained 192 | # in these scripts will be unencrypted 193 | PublishScripts/ 194 | 195 | # NuGet Packages 196 | *.nupkg 197 | # NuGet Symbol Packages 198 | *.snupkg 199 | # The packages folder can be ignored because of Package Restore 200 | **/[Pp]ackages/* 201 | # except build/, which is used as an MSBuild target. 202 | !**/[Pp]ackages/build/ 203 | # Uncomment if necessary however generally it will be regenerated when needed 204 | #!**/[Pp]ackages/repositories.config 205 | # NuGet v3's project.json files produces more ignorable files 206 | *.nuget.props 207 | *.nuget.targets 208 | 209 | # Microsoft Azure Build Output 210 | csx/ 211 | *.build.csdef 212 | 213 | # Microsoft Azure Emulator 214 | ecf/ 215 | rcf/ 216 | 217 | # Windows Store app package directories and files 218 | AppPackages/ 219 | BundleArtifacts/ 220 | Package.StoreAssociation.xml 221 | _pkginfo.txt 222 | *.appx 223 | *.appxbundle 224 | *.appxupload 225 | 226 | # Visual Studio cache files 227 | # files ending in .cache can be ignored 228 | *.[Cc]ache 229 | # but keep track of directories ending in .cache 230 | !?*.[Cc]ache/ 231 | 232 | # Others 233 | ClientBin/ 234 | ~$* 235 | *~ 236 | *.dbmdl 237 | *.dbproj.schemaview 238 | *.jfm 239 | *.pfx 240 | *.publishsettings 241 | orleans.codegen.cs 242 | 243 | # Including strong name files can present a security risk 244 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 245 | #*.snk 246 | 247 | # Since there are multiple workflows, uncomment next line to ignore bower_components 248 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 249 | #bower_components/ 250 | 251 | # RIA/Silverlight projects 252 | Generated_Code/ 253 | 254 | # Backup & report files from converting an old project file 255 | # to a newer Visual Studio version. Backup files are not needed, 256 | # because we have git ;-) 257 | _UpgradeReport_Files/ 258 | Backup*/ 259 | UpgradeLog*.XML 260 | UpgradeLog*.htm 261 | ServiceFabricBackup/ 262 | *.rptproj.bak 263 | 264 | # SQL Server files 265 | *.mdf 266 | *.ldf 267 | *.ndf 268 | 269 | # Business Intelligence projects 270 | *.rdl.data 271 | *.bim.layout 272 | *.bim_*.settings 273 | *.rptproj.rsuser 274 | *- [Bb]ackup.rdl 275 | *- [Bb]ackup ([0-9]).rdl 276 | *- [Bb]ackup ([0-9][0-9]).rdl 277 | 278 | # Microsoft Fakes 279 | FakesAssemblies/ 280 | 281 | # GhostDoc plugin setting file 282 | *.GhostDoc.xml 283 | 284 | # Node.js Tools for Visual Studio 285 | .ntvs_analysis.dat 286 | node_modules/ 287 | 288 | # Visual Studio 6 build log 289 | *.plg 290 | 291 | # Visual Studio 6 workspace options file 292 | *.opt 293 | 294 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 295 | *.vbw 296 | 297 | # Visual Studio LightSwitch build output 298 | **/*.HTMLClient/GeneratedArtifacts 299 | **/*.DesktopClient/GeneratedArtifacts 300 | **/*.DesktopClient/ModelManifest.xml 301 | **/*.Server/GeneratedArtifacts 302 | **/*.Server/ModelManifest.xml 303 | _Pvt_Extensions 304 | 305 | # Paket dependency manager 306 | .paket/paket.exe 307 | paket-files/ 308 | 309 | # FAKE - F# Make 310 | .fake/ 311 | 312 | # CodeRush personal settings 313 | .cr/personal 314 | 315 | # Python Tools for Visual Studio (PTVS) 316 | __pycache__/ 317 | *.pyc 318 | 319 | # Cake - Uncomment if you are using it 320 | # tools/** 321 | # !tools/packages.config 322 | 323 | # Tabs Studio 324 | *.tss 325 | 326 | # Telerik's JustMock configuration file 327 | *.jmconfig 328 | 329 | # BizTalk build output 330 | *.btp.cs 331 | *.btm.cs 332 | *.odx.cs 333 | *.xsd.cs 334 | 335 | # OpenCover UI analysis results 336 | OpenCover/ 337 | 338 | # Azure Stream Analytics local run output 339 | ASALocalRun/ 340 | 341 | # MSBuild Binary and Structured Log 342 | *.binlog 343 | 344 | # NVidia Nsight GPU debugger configuration file 345 | *.nvuser 346 | 347 | # MFractors (Xamarin productivity tool) working folder 348 | .mfractor/ 349 | 350 | # Local History for Visual Studio 351 | .localhistory/ 352 | 353 | # BeatPulse healthcheck temp database 354 | healthchecksdb 355 | 356 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 357 | MigrationBackup/ 358 | 359 | # Ionide (cross platform F# VS Code tools) working folder 360 | .ionide/ 361 | 362 | # Fody - auto-generated XML schema 363 | FodyWeavers.xsd -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Gizmo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VRChat Configuration Editor 2 | 3 | [![Release](https://img.shields.io/github/v/release/project-vrcat/VRChatConfigurationEditor.svg?include_prereleases&style=flat-square)](https://github.com/project-vrcat/VRChatConfigurationEditor/releases/latest) 4 | [![License](https://img.shields.io/github/license/project-vrcat/VRChatConfigurationEditor?style=flat-square)](./LICENSE) 5 | 6 | ## Installation 7 | 8 | ### Install pre-built binary 9 | 10 | Pre-built binary are available here: 11 | [Release](https://github.com/project-vrcat/VRChatConfigurationEditor/releases/latest) 12 | 13 | Download the binary compatible with your platform, unpack and run. 14 | 15 | ## Thanks 16 | 17 | Thanks to [JetBrains](https://jb.gg/OpenSource) for the open source license(s). 18 | 19 | [![JetBrains Logo](./images/jetbrains.svg)](https://jb.gg/OpenSource) 20 | 21 | ## License 22 | 23 | Code is distributed under MIT license, feel free to use it in your proprietary projects as well. -------------------------------------------------------------------------------- /VRChatConfigurationEditor.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.31702.278 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VRChatConfigurationEditor", "VRChatConfigurationEditor\VRChatConfigurationEditor.csproj", "{519744D4-B729-4183-A276-6C5E409B0E68}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Debug|x64 = Debug|x64 12 | Release|Any CPU = Release|Any CPU 13 | Release|x64 = Release|x64 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {519744D4-B729-4183-A276-6C5E409B0E68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {519744D4-B729-4183-A276-6C5E409B0E68}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {519744D4-B729-4183-A276-6C5E409B0E68}.Debug|x64.ActiveCfg = Debug|x64 19 | {519744D4-B729-4183-A276-6C5E409B0E68}.Debug|x64.Build.0 = Debug|x64 20 | {519744D4-B729-4183-A276-6C5E409B0E68}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {519744D4-B729-4183-A276-6C5E409B0E68}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {519744D4-B729-4183-A276-6C5E409B0E68}.Release|x64.ActiveCfg = Release|x64 23 | {519744D4-B729-4183-A276-6C5E409B0E68}.Release|x64.Build.0 = Release|x64 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {CD068749-E31B-44A1-898F-A17352A4174A} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/App.xaml: -------------------------------------------------------------------------------- 1 |  6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | using System.Windows; 8 | 9 | namespace VRChatConfigurationEditor 10 | { 11 | /// 12 | /// App.xaml 的交互逻辑 13 | /// 14 | public partial class App : Application 15 | { 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/Bind.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Web.WebView2.Core; 2 | using Microsoft.Web.WebView2.Wpf; 3 | using Newtonsoft.Json; 4 | using Ookii.Dialogs.Wpf; 5 | using System; 6 | using System.Collections.Generic; 7 | using System.Diagnostics; 8 | using System.IO; 9 | using System.Runtime.InteropServices; 10 | 11 | namespace VRChatConfigurationEditor 12 | { 13 | class Message 14 | { 15 | public string Method { get; set; } 16 | public List Args { get; set; } 17 | } 18 | 19 | class Bind 20 | { 21 | private readonly WebView2 _webView; 22 | private readonly string _vrcPath; 23 | 24 | public Bind(WebView2 webView) 25 | { 26 | _webView = webView; 27 | 28 | string localLow = GetLocalLow(); 29 | if (localLow != "") _vrcPath = Path.Combine(localLow, @"VRChat\VRChat"); 30 | } 31 | 32 | public void MessageReceived(CoreWebView2WebMessageReceivedEventArgs args) 33 | { 34 | string jsonMessage = args.WebMessageAsJson; 35 | Message message = JsonConvert.DeserializeObject(jsonMessage); 36 | if (message == null) return; 37 | switch (message.Method) 38 | { 39 | case "openURL": 40 | if (message.Args == null || message.Args.Count < 1) break; 41 | OpenURL(message.Args[0]); 42 | break; 43 | case "selectDirectory": 44 | if (message.Args == null || message.Args.Count < 1) return; 45 | SelectDirectory(message.Args[0], message.Args.Count >= 2 ? message.Args[1] : ""); 46 | break; 47 | case "loadConfigFile": 48 | if (message.Args == null || message.Args.Count < 1) return; 49 | LoadConfigFile(message.Args[0]); 50 | break; 51 | case "saveConfigFile": 52 | if (message.Args == null || message.Args.Count < 1) return; 53 | SaveConfigFile(message.Args[0], message.Args[1]); 54 | break; 55 | } 56 | } 57 | 58 | private void OpenURL(string url) 59 | { 60 | Process.Start(new ProcessStartInfo(url)); 61 | } 62 | 63 | private void SelectDirectory(string key, string title) 64 | { 65 | VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog() 66 | { 67 | Description = title, 68 | UseDescriptionForTitle = true 69 | }; 70 | var ok = dialog.ShowDialog(); 71 | string path; 72 | if (!ok.HasValue || !(bool)ok) path = ""; 73 | else path = dialog.SelectedPath; 74 | string data = JsonConvert.SerializeObject(new Message() 75 | { 76 | Method = "selectDirectory", 77 | Args = new List() { key, path } 78 | }); 79 | _webView.CoreWebView2.PostWebMessageAsJson(data); 80 | } 81 | 82 | [DllImport("shell32.dll")] 83 | static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath); 84 | public string GetLocalLow() 85 | { 86 | // https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid#FOLDERID_LOCALAPPDATALOW 87 | Guid localLowId = new Guid("A520A1A4-1780-4FF6-BD18-167343C5AF16"); 88 | int hr = SHGetKnownFolderPath(localLowId, 0, IntPtr.Zero, out IntPtr pPath); 89 | return hr >= 0 ? Marshal.PtrToStringAuto(pPath) : ""; 90 | } 91 | 92 | public void LoadConfigFile(string key) 93 | { 94 | string configFile = Path.Combine(_vrcPath, "config.json"); 95 | string configData = "{}"; 96 | if (File.Exists(configFile)) configData = File.ReadAllText(configFile); 97 | string data = JsonConvert.SerializeObject(new Message() 98 | { 99 | Method = "loadConfigFile", 100 | Args = new List() { key, configData } 101 | }); 102 | _webView.CoreWebView2.PostWebMessageAsJson(data); 103 | } 104 | 105 | public void SaveConfigFile(string key, string data) 106 | { 107 | string configFile = Path.Combine(_vrcPath, "config.json"); 108 | Message message = new Message() 109 | { 110 | Method = "saveConfigFile", 111 | Args = new List() { key, "success" } 112 | }; 113 | try 114 | { 115 | File.WriteAllText(configFile, data); 116 | } 117 | catch (Exception e) 118 | { 119 | Debug.WriteLine(e); 120 | message.Args[1] = e.Message; 121 | } 122 | _webView.CoreWebView2.PostWebMessageAsJson(JsonConvert.SerializeObject(message)); 123 | } 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/MainWindow.xaml: -------------------------------------------------------------------------------- 1 |  9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/MainWindow.xaml.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Web.WebView2.Core; 2 | using Microsoft.Web.WebView2.Wpf; 3 | using System; 4 | using System.Diagnostics; 5 | using System.IO; 6 | using System.Reflection; 7 | using System.Windows; 8 | using System.Windows.Controls; 9 | 10 | namespace VRChatConfigurationEditor 11 | { 12 | /// 13 | /// MainWindow.xaml 的交互逻辑 14 | /// 15 | public partial class MainWindow : Window 16 | { 17 | private readonly WebView2 _webView = new WebView2(); 18 | private Bind _bind; 19 | private const string VirtualHost = "vrc.conf.editor.invalid"; 20 | public MainWindow() 21 | { 22 | InitializeComponent(); 23 | AppInit(); 24 | WebViewInit(); 25 | } 26 | 27 | private void AppInit() 28 | { 29 | string systemLanguage = System.Threading.Thread.CurrentThread.CurrentCulture.Name; 30 | ResourceDictionary lang = LoadLanguage(systemLanguage); 31 | if (lang == null && systemLanguage.Contains("-")) lang = LoadLanguage(systemLanguage.Split('-')[0]); 32 | if (lang == null) return; 33 | if (Resources.MergedDictionaries.Count > 0) Resources.MergedDictionaries.Clear(); 34 | Resources.MergedDictionaries.Add(lang); 35 | } 36 | 37 | private void WebViewInit() 38 | { 39 | if (GetWebView2Version() == "") return; 40 | 41 | _webView.CoreWebView2InitializationCompleted += _webView_CoreWebView2InitializationCompleted; 42 | _webView.Loaded += _webView_Loaded; 43 | 44 | DockPanel panel = new DockPanel(); 45 | panel.Children.Add(_webView); 46 | Content = panel; 47 | } 48 | 49 | private void _webView_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e) 50 | { 51 | if (!e.IsSuccess) return; 52 | CoreWebView2Settings settings = _webView.CoreWebView2.Settings; 53 | #if !DEBUG 54 | settings.AreDevToolsEnabled = false; 55 | #endif 56 | settings.IsPinchZoomEnabled = false; 57 | settings.IsZoomControlEnabled = false; 58 | settings.IsPasswordAutosaveEnabled = false; 59 | settings.IsStatusBarEnabled = false; 60 | } 61 | 62 | private void CoreWebView2_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs args) 63 | { 64 | _bind.MessageReceived(args); 65 | } 66 | 67 | private async void _webView_Loaded(object sender, RoutedEventArgs e) 68 | { 69 | AssemblyName name = Assembly.GetExecutingAssembly().GetName(); 70 | string cacheFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), name.Name); 71 | CoreWebView2Environment env = await CoreWebView2Environment. 72 | CreateAsync(null, cacheFolderPath).ConfigureAwait(true); 73 | 74 | await _webView.EnsureCoreWebView2Async(env); 75 | 76 | _webView.CoreWebView2.SetVirtualHostNameToFolderMapping( 77 | VirtualHost, @"public", CoreWebView2HostResourceAccessKind.DenyCors); 78 | 79 | _webView.Source = new Uri($"https://{VirtualHost}/index.html"); 80 | //_webView.Source = new Uri("http://localhost:3000/index.html"); 81 | _webView.CoreWebView2.WebMessageReceived += CoreWebView2_WebMessageReceived; 82 | 83 | _bind = new Bind(_webView); 84 | } 85 | 86 | private void RuntimeDownloadButton_OnClick(object sender, RoutedEventArgs e) 87 | { 88 | //string url = "https://go.microsoft.com/fwlink/p/?LinkId=2124703"; 89 | string url = "https://developer.microsoft.com/microsoft-edge/webview2/#download-section"; 90 | _ = Process.Start(new ProcessStartInfo(url)); 91 | } 92 | 93 | private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 94 | { 95 | Visibility = Visibility.Hidden; 96 | _webView.Dispose(); 97 | } 98 | 99 | private void Window_Initialized(object sender, EventArgs e) 100 | { 101 | Version version = Assembly.GetExecutingAssembly().GetName().Version; 102 | string buildDate = File.GetLastWriteTime(Assembly.GetExecutingAssembly().Location).ToString("yyyyMMdd"); 103 | Title = $"{Title} v{version.Major}.{version.Minor}.{version.Build} build-{buildDate}"; 104 | } 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Resources; 3 | using System.Runtime.CompilerServices; 4 | using System.Runtime.InteropServices; 5 | using System.Windows; 6 | 7 | // 有关程序集的一般信息由以下 8 | // 控制。更改这些特性值可修改 9 | // 与程序集关联的信息。 10 | [assembly: AssemblyTitle("VRChatConfigurationEditor")] 11 | [assembly: AssemblyDescription("")] 12 | [assembly: AssemblyConfiguration("")] 13 | [assembly: AssemblyCompany("")] 14 | [assembly: AssemblyProduct("VRChatConfigurationEditor")] 15 | [assembly: AssemblyCopyright("Copyright © Gizmo 2021")] 16 | [assembly: AssemblyTrademark("https://github.com/project-vrcat")] 17 | [assembly: AssemblyCulture("")] 18 | 19 | // 将 ComVisible 设置为 false 会使此程序集中的类型 20 | //对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 21 | //请将此类型的 ComVisible 特性设置为 true。 22 | [assembly: ComVisible(false)] 23 | 24 | //若要开始生成可本地化的应用程序,请设置 25 | //.csproj 文件中的 CultureYouAreCodingWith 26 | //例如,如果您在源文件中使用的是美国英语, 27 | //使用的是美国英语,请将 设置为 en-US。 然后取消 28 | //对以下 NeutralResourceLanguage 特性的注释。 更新 29 | //以下行中的“en-US”以匹配项目文件中的 UICulture 设置。 30 | 31 | //[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] 32 | 33 | 34 | [assembly: ThemeInfo( 35 | ResourceDictionaryLocation.None, //主题特定资源词典所处位置 36 | //(未在页面中找到资源时使用, 37 | //或应用程序资源字典中找到时使用) 38 | ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置 39 | //(未在页面中找到资源时使用, 40 | //、应用程序或任何主题专用资源字典中找到时使用) 41 | )] 42 | 43 | 44 | // 程序集的版本信息由下列四个值组成: 45 | // 46 | // 主版本 47 | // 次版本 48 | // 生成号 49 | // 修订号 50 | // 51 | //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 52 | //通过使用 "*",如下所示: 53 | // [assembly: AssemblyVersion("1.0.*")] 54 | [assembly: AssemblyVersion("1.1.0.0")] 55 | [assembly: AssemblyFileVersion("1.1.0.0")] 56 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // 此代码由工具生成。 4 | // 运行时版本:4.0.30319.42000 5 | // 6 | // 对此文件的更改可能会导致不正确的行为,并且如果 7 | // 重新生成代码,这些更改将会丢失。 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace VRChatConfigurationEditor.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// 一个强类型的资源类,用于查找本地化的字符串等。 17 | /// 18 | // 此类是由 StronglyTypedResourceBuilder 19 | // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 20 | // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen 21 | // (以 /str 作为命令选项),或重新生成 VS 项目。 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// 返回此类使用的缓存的 ResourceManager 实例。 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("VRChatConfigurationEditor.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// 重写当前线程的 CurrentUICulture 属性,对 51 | /// 使用此强类型资源类的所有资源查找执行重写。 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // 此代码由工具生成。 4 | // 运行时版本:4.0.30319.42000 5 | // 6 | // 对此文件的更改可能会导致不正确的行为,并且如果 7 | // 重新生成代码,这些更改将会丢失。 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace VRChatConfigurationEditor.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/Utils.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Web.WebView2.Core; 2 | using System; 3 | using System.Windows; 4 | 5 | namespace VRChatConfigurationEditor 6 | { 7 | public partial class MainWindow 8 | { 9 | public static string GetWebView2Version() 10 | { 11 | try { return CoreWebView2Environment.GetAvailableBrowserVersionString(); } 12 | catch (Exception) { return ""; } 13 | } 14 | 15 | public ResourceDictionary LoadLanguage(string name) 16 | { 17 | try 18 | { 19 | return Application.LoadComponent(new Uri($@"languages\{name}.xaml", UriKind.Relative)) as 20 | ResourceDictionary; 21 | } 22 | catch (Exception) { return null; } 23 | } 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/VRChatConfigurationEditor.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {519744D4-B729-4183-A276-6C5E409B0E68} 8 | WinExe 9 | VRChatConfigurationEditor 10 | VRChatConfigurationEditor 11 | v4.8 12 | 512 13 | {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} 14 | 4 15 | true 16 | true 17 | 18 | 19 | 20 | 21 | 22 | AnyCPU 23 | true 24 | full 25 | false 26 | bin\Debug\ 27 | DEBUG;TRACE 28 | prompt 29 | 4 30 | 31 | 32 | AnyCPU 33 | pdbonly 34 | true 35 | bin\Release\ 36 | TRACE 37 | prompt 38 | 4 39 | 40 | 41 | true 42 | bin\x64\Debug\ 43 | DEBUG;TRACE 44 | full 45 | x64 46 | 7.3 47 | prompt 48 | true 49 | 50 | 51 | bin\x64\Release\ 52 | TRACE 53 | true 54 | pdbonly 55 | x64 56 | 7.3 57 | prompt 58 | true 59 | 60 | 61 | icon.ico 62 | 63 | 64 | VRChatConfigurationEditor.App 65 | 66 | 67 | 68 | ..\packages\Microsoft.Web.WebView2.1.0.1020.30\lib\net45\Microsoft.Web.WebView2.Core.dll 69 | 70 | 71 | ..\packages\Microsoft.Web.WebView2.1.0.1020.30\lib\net45\Microsoft.Web.WebView2.Wpf.dll 72 | 73 | 74 | ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll 75 | 76 | 77 | ..\packages\Ookii.Dialogs.Wpf.4.0.0\lib\net45\Ookii.Dialogs.Wpf.dll 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 4.0 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | MSBuild:Compile 101 | Designer 102 | 103 | 104 | 105 | MSBuild:Compile 106 | Designer 107 | PreserveNewest 108 | 109 | 110 | MSBuild:Compile 111 | Designer 112 | PreserveNewest 113 | 114 | 115 | MSBuild:Compile 116 | Designer 117 | PreserveNewest 118 | 119 | 120 | MSBuild:Compile 121 | Designer 122 | PreserveNewest 123 | 124 | 125 | Designer 126 | MSBuild:Compile 127 | PreserveNewest 128 | 129 | 130 | MSBuild:Compile 131 | Designer 132 | 133 | 134 | App.xaml 135 | Code 136 | 137 | 138 | MainWindow.xaml 139 | Code 140 | 141 | 142 | 143 | 144 | 145 | Code 146 | 147 | 148 | True 149 | True 150 | Resources.resx 151 | 152 | 153 | True 154 | Settings.settings 155 | True 156 | 157 | 158 | ResXFileCodeGenerator 159 | Resources.Designer.cs 160 | 161 | 162 | 163 | SettingsSingleFileGenerator 164 | Settings.Designer.cs 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。 178 | 179 | 180 | 181 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-vrcat/VRChatConfigurationEditor/2f1dcbd4cac436bbd751be645122d322f80907ff/VRChatConfigurationEditor/icon.ico -------------------------------------------------------------------------------- /VRChatConfigurationEditor/languages/en.xaml: -------------------------------------------------------------------------------- 1 |  4 | Download the WebView2 Runtime 5 | WebView2 Runtime not installed. 6 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/languages/ja.xaml: -------------------------------------------------------------------------------- 1 |  4 | WebView2 ランタイムをダウンロード 5 | WebView2 Runtime not installed. 6 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/languages/ko.xaml: -------------------------------------------------------------------------------- 1 |  4 | WebView2 런타임 다운로드 5 | WebView2 Runtime not installed. 6 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/languages/zh-CN.xaml: -------------------------------------------------------------------------------- 1 |  4 | 下载 WebView2 运行时安装程序 5 | WebView2运行时未安装. 6 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/languages/zh-TW.xaml: -------------------------------------------------------------------------------- 1 |  4 | 下載 WebView2 執行階段 5 | WebView2執行階段未安裝. 6 | -------------------------------------------------------------------------------- /VRChatConfigurationEditor/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /images/jetbrains.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 31 | 32 | 33 | 34 | 35 | 36 | 39 | 40 | 41 | 42 | 43 | 45 | 47 | 48 | 51 | 54 | 56 | 57 | 59 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /web-ui/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | -------------------------------------------------------------------------------- /web-ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | VRChat Configuration Editor 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /web-ui/locales/en.yaml: -------------------------------------------------------------------------------- 1 | title: VRChat Configuration Editor 2 | cache-location: 3 | label: Custom Cache Directory Location 4 | placeholder: Default Location (%AppData%\..\LocalLow\VRChat\VRChat) 5 | button: Select 6 | tooltip: Defines the location where VRChat should store its cache data 7 | cache_size: 8 | label: Cache Size 9 | suffix: GB 10 | cache_expiry_delay: 11 | label: Cache Expiry Time 12 | suffix: Day 13 | rich-presence: 14 | label: Rich Presence 15 | tooltip: You can enable or disable Discord and Steam Rich Presence functions 16 | camera_and_screenshot: 17 | default: Default 18 | camera: 19 | label: Camera resolution 20 | screenshot: 21 | label: Screenshot resolution 22 | first_person_steadycam_fov: 23 | label: First-Person Steadycam FOV 24 | avatar_dynamic_bone_limits: 25 | label: Avatar Dynamic Bone Limits 26 | max_affected_transforms: Max Affected Transforms 27 | max_collision_checks: Max Collision Checks 28 | 29 | switch: 30 | enable: Enable 31 | disable: Disable 32 | button: 33 | confirm: Confirm 34 | cancel: Cancel 35 | reset: Reset 36 | save: Save 37 | -------------------------------------------------------------------------------- /web-ui/locales/zh-CN.yaml: -------------------------------------------------------------------------------- 1 | title: VRChat配置编辑器 2 | cache-location: 3 | label: 自定义缓存位置 4 | placeholder: 默认位置 (%AppData%\..\LocalLow\VRChat\VRChat) 5 | button: 选择位置 6 | tooltip: 定义VRChat缓存的储存位置 7 | cache_size: 8 | label: 缓存大小 9 | suffix: GB 10 | cache_expiry_delay: 11 | label: 缓存有效期 12 | suffix: 天 13 | rich-presence: 14 | label: 扩展信息集成 15 | tooltip: 是否开启Discord和Steam的扩展信息集成, 开启后将会在Discord和Steam中显示更多的游戏信息 16 | camera_and_screenshot: 17 | default: 默认 18 | camera: 19 | label: 相机分辨率 20 | screenshot: 21 | label: 截图分辨率 22 | first_person_steadycam_fov: 23 | label: First-Person Steadycam FOV 24 | avatar_dynamic_bone_limits: 25 | label: Avatar Dynamic Bone Limits 26 | max_affected_transforms: Max Affected Transforms 27 | max_collision_checks: Max Collision Checks 28 | 29 | switch: 30 | enable: 启用 31 | disable: 禁用 32 | button: 33 | confirm: 确认 34 | cancel: 取消 35 | reset: 重置 36 | save: 保存 37 | -------------------------------------------------------------------------------- /web-ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.0", 3 | "scripts": { 4 | "dev": "vite", 5 | "build": "vue-tsc --noEmit && vite build --emptyOutDir", 6 | "serve": "vite preview", 7 | "bundle": "goab-cli pack -o public.ab ./dist" 8 | }, 9 | "dependencies": { 10 | "vue": "^3.2.4", 11 | "vue-i18n": "^9.1.7" 12 | }, 13 | "devDependencies": { 14 | "@intlify/vite-plugin-vue-i18n": "^2.4.0", 15 | "@types/node": "^16.7.0", 16 | "@vicons/tabler": "^0.11.0", 17 | "@vitejs/plugin-vue": "^1.4.0", 18 | "@vue/compiler-sfc": "^3.2.4", 19 | "naive-ui": "^2.16.5", 20 | "sass": "^1.38.0", 21 | "typescript": "^4.3.5", 22 | "vfonts": "^0.1.0", 23 | "vite": "^2.5.0", 24 | "vue-tsc": "^0.0.24" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /web-ui/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@intlify/vite-plugin-vue-i18n': ^2.4.0 5 | '@types/node': ^16.7.0 6 | '@vicons/tabler': ^0.11.0 7 | '@vitejs/plugin-vue': ^1.4.0 8 | '@vue/compiler-sfc': ^3.2.4 9 | naive-ui: ^2.16.5 10 | sass: ^1.38.0 11 | typescript: ^4.3.5 12 | vfonts: ^0.1.0 13 | vite: ^2.5.0 14 | vue: ^3.2.4 15 | vue-i18n: ^9.1.7 16 | vue-tsc: ^0.0.24 17 | 18 | dependencies: 19 | vue: 3.2.4 20 | vue-i18n: 9.1.7_vue@3.2.4 21 | 22 | devDependencies: 23 | '@intlify/vite-plugin-vue-i18n': 2.4.0_vite@2.5.0+vue-i18n@9.1.7 24 | '@types/node': 16.7.1 25 | '@vicons/tabler': 0.11.0 26 | '@vitejs/plugin-vue': 1.4.0_@vue+compiler-sfc@3.2.4 27 | '@vue/compiler-sfc': 3.2.4 28 | naive-ui: 2.16.5_vue@3.2.4 29 | sass: 1.38.0 30 | typescript: 4.3.5 31 | vfonts: 0.1.0 32 | vite: 2.5.0 33 | vue-tsc: 0.0.24 34 | 35 | packages: 36 | 37 | /@babel/helper-validator-identifier/7.14.9: 38 | resolution: {integrity: sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==} 39 | engines: {node: '>=6.9.0'} 40 | 41 | /@babel/parser/7.15.3: 42 | resolution: {integrity: sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==} 43 | engines: {node: '>=6.0.0'} 44 | hasBin: true 45 | 46 | /@babel/types/7.15.0: 47 | resolution: {integrity: sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==} 48 | engines: {node: '>=6.9.0'} 49 | dependencies: 50 | '@babel/helper-validator-identifier': 7.14.9 51 | to-fast-properties: 2.0.0 52 | 53 | /@css-render/plugin-bem/0.15.5: 54 | resolution: {integrity: sha512-+vf68Tqj0rg9mieh463+nEolMbvpRRi60dK0OW10z3Vd6KH1ojaPnTzmTu4feE14f4ez5Ogb7IpC5CsT1+DEvA==} 55 | dependencies: 56 | css-render: 0.15.5 57 | dev: true 58 | 59 | /@css-render/vue3-ssr/0.15.5_vue@3.2.4: 60 | resolution: {integrity: sha512-1CFF12uJv6aMtUeKW7x3f/qdXiMe/jZ5xNZoDIbPyRIWmsFYI6kw/7+uyaGFUe6HhXFc8F/j42SvuaX9vlF4XQ==} 61 | peerDependencies: 62 | vue: ^3.0.11 63 | dependencies: 64 | vue: 3.2.4 65 | dev: true 66 | 67 | /@emotion/hash/0.8.0: 68 | resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} 69 | dev: true 70 | 71 | /@intlify/bundle-utils/0.2.0: 72 | resolution: {integrity: sha512-P6H+jNT9CqU7d5gMOeaklHYo2vO6sVD7dYFvU7/T5rRBubmEikem7mSFfqMvYnOdIPRxhQSqxGEh+Jj4Act5nQ==} 73 | engines: {node: '>= 12'} 74 | dependencies: 75 | '@intlify/core': 9.1.7 76 | '@intlify/message-compiler': 9.1.7 77 | '@intlify/shared': 9.1.7 78 | jsonc-eslint-parser: 1.2.0 79 | source-map: 0.6.1 80 | yaml-eslint-parser: 0.3.2 81 | transitivePeerDependencies: 82 | - eslint 83 | dev: true 84 | 85 | /@intlify/core-base/9.1.7: 86 | resolution: {integrity: sha512-q1W2j81xbHyfKrNcca/CeJyf0Bcx4u9UDu05l7AaiJbqOseTme2o2I3wp1hDDCtmC7k7HgX0sAygyHNJH9swuQ==} 87 | engines: {node: '>= 10'} 88 | dependencies: 89 | '@intlify/devtools-if': 9.1.7 90 | '@intlify/message-compiler': 9.1.7 91 | '@intlify/message-resolver': 9.1.7 92 | '@intlify/runtime': 9.1.7 93 | '@intlify/shared': 9.1.7 94 | '@intlify/vue-devtools': 9.1.7 95 | 96 | /@intlify/core/9.1.7: 97 | resolution: {integrity: sha512-iWlzl1CiG9iF0h+90ZkxLIgVkaznhmjcfR/bfXk/Usp/IqkeBV8z5QGxtuFdzS3iurOHfylUCopSaT87hPOGmw==} 98 | engines: {node: '>= 10'} 99 | dependencies: 100 | '@intlify/core-base': 9.1.7 101 | dev: true 102 | 103 | /@intlify/devtools-if/9.1.7: 104 | resolution: {integrity: sha512-/DcN5FUySSkQhDqx5y1RvxfuCXO3Ot/dUEIOs472qbM7Hyb2qif+eXCnwHBzlI4+wEfQVT6L0PiM1a7Er/ro9g==} 105 | engines: {node: '>= 10'} 106 | dependencies: 107 | '@intlify/shared': 9.1.7 108 | 109 | /@intlify/message-compiler/9.1.7: 110 | resolution: {integrity: sha512-JZNkAhr3O7tnbdbRBcpYfqr/Ai26WTzX0K/lV8Y1KVdOIj/dGiamaffdWUdFiDXUnbJRNbPiOaKxy7Pwip3KxQ==} 111 | engines: {node: '>= 10'} 112 | dependencies: 113 | '@intlify/message-resolver': 9.1.7 114 | '@intlify/shared': 9.1.7 115 | source-map: 0.6.1 116 | 117 | /@intlify/message-resolver/9.1.7: 118 | resolution: {integrity: sha512-WTK+OaXJYjyquLGhuCyDvU2WHkG+kXzXeHagmVFHn+s118Jf2143zzkLLUrapP5CtZ/csuyjmYg7b3xQRQAmvw==} 119 | engines: {node: '>= 10'} 120 | 121 | /@intlify/runtime/9.1.7: 122 | resolution: {integrity: sha512-QURPSlzhOVnRwS2XMGpCDsDkP42kfVBh94aAORxh/gVGzdgJip2vagrIFij/J69aEqdB476WJkMhVjP8VSHmiA==} 123 | engines: {node: '>= 10'} 124 | dependencies: 125 | '@intlify/message-compiler': 9.1.7 126 | '@intlify/message-resolver': 9.1.7 127 | '@intlify/shared': 9.1.7 128 | 129 | /@intlify/shared/9.1.7: 130 | resolution: {integrity: sha512-zt0zlUdalumvT9AjQNxPXA36UgOndUyvBMplh8uRZU0fhWHAwhnJTcf0NaG9Qvr8I1n3HPSs96+kLb/YdwTavQ==} 131 | engines: {node: '>= 10'} 132 | 133 | /@intlify/vite-plugin-vue-i18n/2.4.0_vite@2.5.0+vue-i18n@9.1.7: 134 | resolution: {integrity: sha512-DXBvl7JEEcChjrsCUHIBJUSqgAXJSUzbaZskzTuJy5K3FDCX/g9XfHVaw8lCUaW7jYF60BIsPr87sAP1QSGB0Q==} 135 | engines: {node: '>= 12'} 136 | peerDependencies: 137 | vite: ^2.3.6 138 | vue-i18n: ^9.1.6 139 | dependencies: 140 | '@intlify/bundle-utils': 0.2.0 141 | '@intlify/shared': 9.1.7 142 | '@rollup/pluginutils': 4.1.1 143 | debug: 4.3.2 144 | fast-glob: 3.2.7 145 | vite: 2.5.0 146 | vue-i18n: 9.1.7_vue@3.2.4 147 | transitivePeerDependencies: 148 | - eslint 149 | - supports-color 150 | dev: true 151 | 152 | /@intlify/vue-devtools/9.1.7: 153 | resolution: {integrity: sha512-DI5Wc0aOiohtBUGUkKAcryCWbbuaO4/PK4Pa/LaNCsFNxbtgR5qkIDmhBv9xVPYGTUhySXxaDDAMvOpBjhPJjw==} 154 | engines: {node: '>= 10'} 155 | dependencies: 156 | '@intlify/message-resolver': 9.1.7 157 | '@intlify/runtime': 9.1.7 158 | '@intlify/shared': 9.1.7 159 | 160 | /@jest/types/26.6.2: 161 | resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} 162 | engines: {node: '>= 10.14.2'} 163 | dependencies: 164 | '@types/istanbul-lib-coverage': 2.0.3 165 | '@types/istanbul-reports': 3.0.1 166 | '@types/node': 16.7.1 167 | '@types/yargs': 15.0.14 168 | chalk: 4.1.2 169 | dev: true 170 | 171 | /@nodelib/fs.scandir/2.1.5: 172 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 173 | engines: {node: '>= 8'} 174 | dependencies: 175 | '@nodelib/fs.stat': 2.0.5 176 | run-parallel: 1.2.0 177 | dev: true 178 | 179 | /@nodelib/fs.stat/2.0.5: 180 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 181 | engines: {node: '>= 8'} 182 | dev: true 183 | 184 | /@nodelib/fs.walk/1.2.8: 185 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 186 | engines: {node: '>= 8'} 187 | dependencies: 188 | '@nodelib/fs.scandir': 2.1.5 189 | fastq: 1.12.0 190 | dev: true 191 | 192 | /@rollup/pluginutils/4.1.1: 193 | resolution: {integrity: sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==} 194 | engines: {node: '>= 8.0.0'} 195 | dependencies: 196 | estree-walker: 2.0.2 197 | picomatch: 2.3.0 198 | dev: true 199 | 200 | /@types/estree/0.0.48: 201 | resolution: {integrity: sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew==} 202 | dev: true 203 | 204 | /@types/istanbul-lib-coverage/2.0.3: 205 | resolution: {integrity: sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==} 206 | dev: true 207 | 208 | /@types/istanbul-lib-report/3.0.0: 209 | resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} 210 | dependencies: 211 | '@types/istanbul-lib-coverage': 2.0.3 212 | dev: true 213 | 214 | /@types/istanbul-reports/3.0.1: 215 | resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} 216 | dependencies: 217 | '@types/istanbul-lib-report': 3.0.0 218 | dev: true 219 | 220 | /@types/jest/26.0.24: 221 | resolution: {integrity: sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==} 222 | dependencies: 223 | jest-diff: 26.6.2 224 | pretty-format: 26.6.2 225 | dev: true 226 | 227 | /@types/lodash-es/4.17.4: 228 | resolution: {integrity: sha512-BBz79DCJbD2CVYZH67MBeHZRX++HF+5p8Mo5MzjZi64Wac39S3diedJYHZtScbRVf4DjZyN6LzA0SB0zy+HSSQ==} 229 | dependencies: 230 | '@types/lodash': 4.14.172 231 | dev: true 232 | 233 | /@types/lodash/4.14.172: 234 | resolution: {integrity: sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw==} 235 | dev: true 236 | 237 | /@types/node/14.14.45: 238 | resolution: {integrity: sha512-DssMqTV9UnnoxDWu959sDLZzfvqCF0qDNRjaWeYSui9xkFe61kKo4l1TWNTQONpuXEm+gLMRvdlzvNHBamzmEw==} 239 | dev: true 240 | 241 | /@types/node/14.17.11: 242 | resolution: {integrity: sha512-n2OQ+0Bz6WEsUjrvcHD1xZ8K+Kgo4cn9/w94s1bJS690QMUWfJPW/m7CCb7gPkA1fcYwL2UpjXP/rq/Eo41m6w==} 243 | dev: true 244 | 245 | /@types/node/16.7.1: 246 | resolution: {integrity: sha512-ncRdc45SoYJ2H4eWU9ReDfp3vtFqDYhjOsKlFFUDEn8V1Bgr2RjYal8YT5byfadWIRluhPFU6JiDOl0H6Sl87A==} 247 | dev: true 248 | 249 | /@types/yargs-parser/20.2.1: 250 | resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} 251 | dev: true 252 | 253 | /@types/yargs/15.0.14: 254 | resolution: {integrity: sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==} 255 | dependencies: 256 | '@types/yargs-parser': 20.2.1 257 | dev: true 258 | 259 | /@vicons/tabler/0.11.0: 260 | resolution: {integrity: sha512-ijVUphdgqTde22/4+hlZ9j2AQutpxd3piOW4cWovcnS/ELlMc/4di2/0SDxsJ6282VdZoE9Xv0dI1iSr0XKPEg==} 261 | dev: true 262 | 263 | /@vitejs/plugin-vue/1.4.0_@vue+compiler-sfc@3.2.4: 264 | resolution: {integrity: sha512-RkqfJHz9wdLKBp5Yi+kQL8BAljdrvPoccQm2PTZc/UcL4EjD11xsv2PPCduYx2oV1a/bpSKA3sD5sxOHFhz+LA==} 265 | engines: {node: '>=12.0.0'} 266 | peerDependencies: 267 | '@vue/compiler-sfc': ^3.0.8 268 | dependencies: 269 | '@vue/compiler-sfc': 3.2.4 270 | dev: true 271 | 272 | /@vue/compiler-core/3.2.4: 273 | resolution: {integrity: sha512-c8NuQq7mUXXxA4iqD5VUKpyVeklK53+DMbojYMyZ0VPPrb0BUWrZWFiqSDT+MFDv0f6Hv3QuLiHWb1BWMXBbrw==} 274 | dependencies: 275 | '@babel/parser': 7.15.3 276 | '@babel/types': 7.15.0 277 | '@vue/shared': 3.2.4 278 | estree-walker: 2.0.2 279 | source-map: 0.6.1 280 | 281 | /@vue/compiler-dom/3.2.4: 282 | resolution: {integrity: sha512-uj1nwO4794fw2YsYas5QT+FU/YGrXbS0Qk+1c7Kp1kV7idhZIghWLTjyvYibpGoseFbYLPd+sW2/noJG5H04EQ==} 283 | dependencies: 284 | '@vue/compiler-core': 3.2.4 285 | '@vue/shared': 3.2.4 286 | 287 | /@vue/compiler-sfc/3.2.4: 288 | resolution: {integrity: sha512-GM+ouDdDzhqgkLmBH4bgq4kiZxJQArSppJiZHWHIx9XRaefHLmc1LBNPmN8ivm4SVfi2i7M2t9k8ZnjsScgzPQ==} 289 | dependencies: 290 | '@babel/parser': 7.15.3 291 | '@babel/types': 7.15.0 292 | '@types/estree': 0.0.48 293 | '@vue/compiler-core': 3.2.4 294 | '@vue/compiler-dom': 3.2.4 295 | '@vue/compiler-ssr': 3.2.4 296 | '@vue/shared': 3.2.4 297 | consolidate: 0.16.0 298 | estree-walker: 2.0.2 299 | hash-sum: 2.0.0 300 | lru-cache: 5.1.1 301 | magic-string: 0.25.7 302 | merge-source-map: 1.1.0 303 | postcss: 8.3.6 304 | postcss-modules: 4.2.2_postcss@8.3.6 305 | postcss-selector-parser: 6.0.6 306 | source-map: 0.6.1 307 | dev: true 308 | 309 | /@vue/compiler-ssr/3.2.4: 310 | resolution: {integrity: sha512-bKZuXu9/4XwsFHFWIKQK+5kN7mxIIWmMmT2L4VVek7cvY/vm3p4WTsXYDGZJy0htOTXvM2ifr6sflg012T0hsw==} 311 | dependencies: 312 | '@vue/compiler-dom': 3.2.4 313 | '@vue/shared': 3.2.4 314 | dev: true 315 | 316 | /@vue/devtools-api/6.0.0-beta.15: 317 | resolution: {integrity: sha512-quBx4Jjpexo6KDiNUGFr/zF/2A4srKM9S9v2uHgMXSU//hjgq1eGzqkIFql8T9gfX5ZaVOUzYBP3jIdIR3PKIA==} 318 | dev: false 319 | 320 | /@vue/reactivity/3.2.4: 321 | resolution: {integrity: sha512-ljWTR0hr8Tn09hM2tlmWxZzCBPlgGLnq/k8K8X6EcJhtV+C8OzFySnbWqMWataojbrQOocThwsC8awKthSl2uQ==} 322 | dependencies: 323 | '@vue/shared': 3.2.4 324 | dev: false 325 | 326 | /@vue/runtime-core/3.2.4: 327 | resolution: {integrity: sha512-W6PtEOs8P8jKYPo3JwaMAozZQivxInUleGfNwI2pK1t8ZLZIxn4kAf7p4VF4jJdQB8SZBzpfWdLUc06j7IOmpQ==} 328 | dependencies: 329 | '@vue/reactivity': 3.2.4 330 | '@vue/shared': 3.2.4 331 | dev: false 332 | 333 | /@vue/runtime-dom/3.2.4: 334 | resolution: {integrity: sha512-HcVtLyn2SGwsf6BFPwkvDPDOhOqkOKcfHDpBp5R1coX+qMsOFrY8lJnGXIY+JnxqFjND00E9+u+lq5cs/W7ooA==} 335 | dependencies: 336 | '@vue/runtime-core': 3.2.4 337 | '@vue/shared': 3.2.4 338 | csstype: 2.6.17 339 | dev: false 340 | 341 | /@vue/shared/3.2.4: 342 | resolution: {integrity: sha512-j2j1MRmjalVKr3YBTxl/BClSIc8UQ8NnPpLYclxerK65JIowI4O7n8O8lElveEtEoHxy1d7BelPUDI0Q4bumqg==} 343 | 344 | /acorn-jsx/5.3.2_acorn@7.4.1: 345 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 346 | peerDependencies: 347 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 348 | dependencies: 349 | acorn: 7.4.1 350 | dev: true 351 | 352 | /acorn/7.4.1: 353 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 354 | engines: {node: '>=0.4.0'} 355 | hasBin: true 356 | dev: true 357 | 358 | /ansi-regex/5.0.0: 359 | resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==} 360 | engines: {node: '>=8'} 361 | dev: true 362 | 363 | /ansi-styles/4.3.0: 364 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 365 | engines: {node: '>=8'} 366 | dependencies: 367 | color-convert: 2.0.1 368 | dev: true 369 | 370 | /anymatch/3.1.2: 371 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 372 | engines: {node: '>= 8'} 373 | dependencies: 374 | normalize-path: 3.0.0 375 | picomatch: 2.3.0 376 | dev: true 377 | 378 | /async-validator/4.0.2: 379 | resolution: {integrity: sha512-wPFnOgf9uIu/7uvptlX7PepSf2ArGt60Wng0bYrQ08eZVFG65LRLQpHKQebWEyAYtJcdPN31kndy4nS0jVnf0Q==} 380 | dev: true 381 | 382 | /balanced-match/1.0.2: 383 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 384 | dev: true 385 | 386 | /big-integer/1.6.48: 387 | resolution: {integrity: sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==} 388 | engines: {node: '>=0.6'} 389 | dev: true 390 | 391 | /big.js/5.2.2: 392 | resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} 393 | dev: true 394 | 395 | /binary-extensions/2.2.0: 396 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 397 | engines: {node: '>=8'} 398 | dev: true 399 | 400 | /binary/0.3.0: 401 | resolution: {integrity: sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=} 402 | dependencies: 403 | buffers: 0.1.1 404 | chainsaw: 0.1.0 405 | dev: true 406 | 407 | /bluebird/3.4.7: 408 | resolution: {integrity: sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=} 409 | dev: true 410 | 411 | /bluebird/3.7.2: 412 | resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} 413 | dev: true 414 | 415 | /brace-expansion/1.1.11: 416 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 417 | dependencies: 418 | balanced-match: 1.0.2 419 | concat-map: 0.0.1 420 | dev: true 421 | 422 | /braces/3.0.2: 423 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 424 | engines: {node: '>=8'} 425 | dependencies: 426 | fill-range: 7.0.1 427 | dev: true 428 | 429 | /buffer-indexof-polyfill/1.0.2: 430 | resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} 431 | engines: {node: '>=0.10'} 432 | dev: true 433 | 434 | /buffers/0.1.1: 435 | resolution: {integrity: sha1-skV5w77U1tOWru5tmorn9Ugqt7s=} 436 | engines: {node: '>=0.2.0'} 437 | dev: true 438 | 439 | /chainsaw/0.1.0: 440 | resolution: {integrity: sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=} 441 | dependencies: 442 | traverse: 0.3.9 443 | dev: true 444 | 445 | /chalk/4.1.2: 446 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 447 | engines: {node: '>=10'} 448 | dependencies: 449 | ansi-styles: 4.3.0 450 | supports-color: 7.2.0 451 | dev: true 452 | 453 | /chokidar/3.5.2: 454 | resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} 455 | engines: {node: '>= 8.10.0'} 456 | dependencies: 457 | anymatch: 3.1.2 458 | braces: 3.0.2 459 | glob-parent: 5.1.2 460 | is-binary-path: 2.1.0 461 | is-glob: 4.0.1 462 | normalize-path: 3.0.0 463 | readdirp: 3.6.0 464 | optionalDependencies: 465 | fsevents: 2.3.2 466 | dev: true 467 | 468 | /color-convert/2.0.1: 469 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 470 | engines: {node: '>=7.0.0'} 471 | dependencies: 472 | color-name: 1.1.4 473 | dev: true 474 | 475 | /color-name/1.1.4: 476 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 477 | dev: true 478 | 479 | /colorette/1.3.0: 480 | resolution: {integrity: sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==} 481 | dev: true 482 | 483 | /concat-map/0.0.1: 484 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 485 | dev: true 486 | 487 | /consolidate/0.16.0: 488 | resolution: {integrity: sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ==} 489 | engines: {node: '>= 0.10.0'} 490 | dependencies: 491 | bluebird: 3.7.2 492 | dev: true 493 | 494 | /core-util-is/1.0.2: 495 | resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} 496 | dev: true 497 | 498 | /css-render/0.15.5: 499 | resolution: {integrity: sha512-i33v56jCiq+TPmYbwCA0N9VKWVy+BjPBuBJg1FKdCcrZDLGZrEc5vDfedHrWwFA0J9MCiPtz1HLAGl7R1LLQBg==} 500 | dependencies: 501 | '@emotion/hash': 0.8.0 502 | '@types/node': 14.14.45 503 | csstype: 3.0.8 504 | dev: true 505 | 506 | /cssesc/3.0.0: 507 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 508 | engines: {node: '>=4'} 509 | hasBin: true 510 | dev: true 511 | 512 | /csstype/2.6.17: 513 | resolution: {integrity: sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A==} 514 | dev: false 515 | 516 | /csstype/3.0.8: 517 | resolution: {integrity: sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==} 518 | dev: true 519 | 520 | /date-fns/2.23.0: 521 | resolution: {integrity: sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA==} 522 | engines: {node: '>=0.11'} 523 | dev: true 524 | 525 | /debug/4.3.2: 526 | resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} 527 | engines: {node: '>=6.0'} 528 | peerDependencies: 529 | supports-color: '*' 530 | peerDependenciesMeta: 531 | supports-color: 532 | optional: true 533 | dependencies: 534 | ms: 2.1.2 535 | dev: true 536 | 537 | /diff-sequences/26.6.2: 538 | resolution: {integrity: sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==} 539 | engines: {node: '>= 10.14.2'} 540 | dev: true 541 | 542 | /duplexer2/0.1.4: 543 | resolution: {integrity: sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=} 544 | dependencies: 545 | readable-stream: 2.3.7 546 | dev: true 547 | 548 | /emojis-list/3.0.0: 549 | resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} 550 | engines: {node: '>= 4'} 551 | dev: true 552 | 553 | /esbuild/0.12.22: 554 | resolution: {integrity: sha512-yWCr9RoFehpqoe/+MwZXJpYOEIt7KOEvNnjIeMZpMSyQt+KCBASM3y7yViiN5dJRphf1wGdUz1+M4rTtWd/ulA==} 555 | hasBin: true 556 | requiresBuild: true 557 | dev: true 558 | 559 | /eslint-utils/3.0.0: 560 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 561 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 562 | peerDependencies: 563 | eslint: '>=5' 564 | dependencies: 565 | eslint-visitor-keys: 2.1.0 566 | dev: true 567 | 568 | /eslint-visitor-keys/1.3.0: 569 | resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} 570 | engines: {node: '>=4'} 571 | dev: true 572 | 573 | /eslint-visitor-keys/2.1.0: 574 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 575 | engines: {node: '>=10'} 576 | dev: true 577 | 578 | /eslint-visitor-keys/3.0.0: 579 | resolution: {integrity: sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==} 580 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 581 | dev: true 582 | 583 | /espree/7.3.1: 584 | resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} 585 | engines: {node: ^10.12.0 || >=12.0.0} 586 | dependencies: 587 | acorn: 7.4.1 588 | acorn-jsx: 5.3.2_acorn@7.4.1 589 | eslint-visitor-keys: 1.3.0 590 | dev: true 591 | 592 | /estree-walker/2.0.2: 593 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 594 | 595 | /evtd/0.2.2: 596 | resolution: {integrity: sha512-YRUY9BHnnOmeeaOOLlIfUEp3itg4oFEd+uWPGMs0m4WUJaGcEgxFx8PLRRQaaDKvN2B+19lYzhATILGfXuprnA==} 597 | dev: true 598 | 599 | /fast-glob/3.2.7: 600 | resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} 601 | engines: {node: '>=8'} 602 | dependencies: 603 | '@nodelib/fs.stat': 2.0.5 604 | '@nodelib/fs.walk': 1.2.8 605 | glob-parent: 5.1.2 606 | merge2: 1.4.1 607 | micromatch: 4.0.4 608 | dev: true 609 | 610 | /fastq/1.12.0: 611 | resolution: {integrity: sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==} 612 | dependencies: 613 | reusify: 1.0.4 614 | dev: true 615 | 616 | /fill-range/7.0.1: 617 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 618 | engines: {node: '>=8'} 619 | dependencies: 620 | to-regex-range: 5.0.1 621 | dev: true 622 | 623 | /fs.realpath/1.0.0: 624 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 625 | dev: true 626 | 627 | /fsevents/2.3.2: 628 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 629 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 630 | os: [darwin] 631 | dev: true 632 | optional: true 633 | 634 | /fstream/1.0.12: 635 | resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} 636 | engines: {node: '>=0.6'} 637 | dependencies: 638 | graceful-fs: 4.2.8 639 | inherits: 2.0.4 640 | mkdirp: 0.5.5 641 | rimraf: 2.7.1 642 | dev: true 643 | 644 | /function-bind/1.1.1: 645 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 646 | dev: true 647 | 648 | /generic-names/2.0.1: 649 | resolution: {integrity: sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==} 650 | dependencies: 651 | loader-utils: 1.4.0 652 | dev: true 653 | 654 | /glob-parent/5.1.2: 655 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 656 | engines: {node: '>= 6'} 657 | dependencies: 658 | is-glob: 4.0.1 659 | dev: true 660 | 661 | /glob/7.1.7: 662 | resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} 663 | dependencies: 664 | fs.realpath: 1.0.0 665 | inflight: 1.0.6 666 | inherits: 2.0.4 667 | minimatch: 3.0.4 668 | once: 1.4.0 669 | path-is-absolute: 1.0.1 670 | dev: true 671 | 672 | /graceful-fs/4.2.8: 673 | resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} 674 | dev: true 675 | 676 | /has-flag/4.0.0: 677 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 678 | engines: {node: '>=8'} 679 | dev: true 680 | 681 | /has/1.0.3: 682 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 683 | engines: {node: '>= 0.4.0'} 684 | dependencies: 685 | function-bind: 1.1.1 686 | dev: true 687 | 688 | /hash-sum/2.0.0: 689 | resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} 690 | dev: true 691 | 692 | /highlight.js/11.2.0: 693 | resolution: {integrity: sha512-JOySjtOEcyG8s4MLR2MNbLUyaXqUunmSnL2kdV/KuGJOmHZuAR5xC54Ko7goAXBWNhf09Vy3B+U7vR62UZ/0iw==} 694 | engines: {node: '>=12.0.0'} 695 | dev: true 696 | 697 | /icss-replace-symbols/1.1.0: 698 | resolution: {integrity: sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=} 699 | dev: true 700 | 701 | /icss-utils/5.1.0_postcss@8.3.6: 702 | resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} 703 | engines: {node: ^10 || ^12 || >= 14} 704 | peerDependencies: 705 | postcss: ^8.1.0 706 | dependencies: 707 | postcss: 8.3.6 708 | dev: true 709 | 710 | /inflight/1.0.6: 711 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 712 | dependencies: 713 | once: 1.4.0 714 | wrappy: 1.0.2 715 | dev: true 716 | 717 | /inherits/2.0.4: 718 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 719 | dev: true 720 | 721 | /is-binary-path/2.1.0: 722 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 723 | engines: {node: '>=8'} 724 | dependencies: 725 | binary-extensions: 2.2.0 726 | dev: true 727 | 728 | /is-core-module/2.6.0: 729 | resolution: {integrity: sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==} 730 | dependencies: 731 | has: 1.0.3 732 | dev: true 733 | 734 | /is-extglob/2.1.1: 735 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 736 | engines: {node: '>=0.10.0'} 737 | dev: true 738 | 739 | /is-glob/4.0.1: 740 | resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} 741 | engines: {node: '>=0.10.0'} 742 | dependencies: 743 | is-extglob: 2.1.1 744 | dev: true 745 | 746 | /is-number/7.0.0: 747 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 748 | engines: {node: '>=0.12.0'} 749 | dev: true 750 | 751 | /isarray/1.0.0: 752 | resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} 753 | dev: true 754 | 755 | /jest-diff/26.6.2: 756 | resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} 757 | engines: {node: '>= 10.14.2'} 758 | dependencies: 759 | chalk: 4.1.2 760 | diff-sequences: 26.6.2 761 | jest-get-type: 26.3.0 762 | pretty-format: 26.6.2 763 | dev: true 764 | 765 | /jest-get-type/26.3.0: 766 | resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} 767 | engines: {node: '>= 10.14.2'} 768 | dev: true 769 | 770 | /json5/1.0.1: 771 | resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} 772 | hasBin: true 773 | dependencies: 774 | minimist: 1.2.5 775 | dev: true 776 | 777 | /jsonc-eslint-parser/1.2.0: 778 | resolution: {integrity: sha512-+vnjPNITAoDX2G9/IWV5vo234gQM3Gz40VuLIr74mc86f8UIKJ9blre+HnX2pHXejxolevV2a+BpaC0nhTq8yA==} 779 | engines: {node: '>=8.10.0'} 780 | dependencies: 781 | eslint-utils: 3.0.0 782 | eslint-visitor-keys: 3.0.0 783 | espree: 7.3.1 784 | semver: 6.3.0 785 | transitivePeerDependencies: 786 | - eslint 787 | dev: true 788 | 789 | /listenercount/1.0.1: 790 | resolution: {integrity: sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=} 791 | dev: true 792 | 793 | /loader-utils/1.4.0: 794 | resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==} 795 | engines: {node: '>=4.0.0'} 796 | dependencies: 797 | big.js: 5.2.2 798 | emojis-list: 3.0.0 799 | json5: 1.0.1 800 | dev: true 801 | 802 | /lodash-es/4.17.21: 803 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} 804 | dev: true 805 | 806 | /lodash.camelcase/4.3.0: 807 | resolution: {integrity: sha1-soqmKIorn8ZRA1x3EfZathkDMaY=} 808 | dev: true 809 | 810 | /lodash/4.17.21: 811 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 812 | dev: true 813 | 814 | /lru-cache/5.1.1: 815 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 816 | dependencies: 817 | yallist: 3.1.1 818 | dev: true 819 | 820 | /magic-string/0.25.7: 821 | resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} 822 | dependencies: 823 | sourcemap-codec: 1.4.8 824 | dev: true 825 | 826 | /merge-source-map/1.1.0: 827 | resolution: {integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==} 828 | dependencies: 829 | source-map: 0.6.1 830 | dev: true 831 | 832 | /merge2/1.4.1: 833 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 834 | engines: {node: '>= 8'} 835 | dev: true 836 | 837 | /micromatch/4.0.4: 838 | resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} 839 | engines: {node: '>=8.6'} 840 | dependencies: 841 | braces: 3.0.2 842 | picomatch: 2.3.0 843 | dev: true 844 | 845 | /minimatch/3.0.4: 846 | resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} 847 | dependencies: 848 | brace-expansion: 1.1.11 849 | dev: true 850 | 851 | /minimist/1.2.5: 852 | resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 853 | dev: true 854 | 855 | /mkdirp/0.5.5: 856 | resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==} 857 | hasBin: true 858 | dependencies: 859 | minimist: 1.2.5 860 | dev: true 861 | 862 | /ms/2.1.2: 863 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 864 | dev: true 865 | 866 | /naive-ui/2.16.5_vue@3.2.4: 867 | resolution: {integrity: sha512-nqIQTivPETbHR+Z7It0iSXlYe71Az5Hi5IBJ1l2tRSNWZU2Tz9v5vMf9F78xfIz1o2Mb+cmQV7PuMazc/EbGXQ==} 868 | peerDependencies: 869 | vue: ^3.0.0 870 | dependencies: 871 | '@css-render/plugin-bem': 0.15.5 872 | '@css-render/vue3-ssr': 0.15.5_vue@3.2.4 873 | '@types/lodash': 4.14.172 874 | '@types/lodash-es': 4.17.4 875 | async-validator: 4.0.2 876 | css-render: 0.15.5 877 | date-fns: 2.23.0 878 | evtd: 0.2.2 879 | highlight.js: 11.2.0 880 | lodash: 4.17.21 881 | lodash-es: 4.17.21 882 | seemly: 0.3.1 883 | treemate: 0.3.2 884 | vdirs: 0.1.4_vue@3.2.4 885 | vfonts: 0.1.0 886 | vooks: 0.2.8_vue@3.2.4 887 | vue: 3.2.4 888 | vueuc: 0.4.10_40aa6ddc39895f444e6b44d47c0da1ac 889 | dev: true 890 | 891 | /nanoid/3.1.25: 892 | resolution: {integrity: sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==} 893 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 894 | hasBin: true 895 | dev: true 896 | 897 | /normalize-path/3.0.0: 898 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 899 | engines: {node: '>=0.10.0'} 900 | dev: true 901 | 902 | /once/1.4.0: 903 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 904 | dependencies: 905 | wrappy: 1.0.2 906 | dev: true 907 | 908 | /path-is-absolute/1.0.1: 909 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 910 | engines: {node: '>=0.10.0'} 911 | dev: true 912 | 913 | /path-parse/1.0.7: 914 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 915 | dev: true 916 | 917 | /picomatch/2.3.0: 918 | resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} 919 | engines: {node: '>=8.6'} 920 | dev: true 921 | 922 | /postcss-modules-extract-imports/3.0.0_postcss@8.3.6: 923 | resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} 924 | engines: {node: ^10 || ^12 || >= 14} 925 | peerDependencies: 926 | postcss: ^8.1.0 927 | dependencies: 928 | postcss: 8.3.6 929 | dev: true 930 | 931 | /postcss-modules-local-by-default/4.0.0_postcss@8.3.6: 932 | resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} 933 | engines: {node: ^10 || ^12 || >= 14} 934 | peerDependencies: 935 | postcss: ^8.1.0 936 | dependencies: 937 | icss-utils: 5.1.0_postcss@8.3.6 938 | postcss: 8.3.6 939 | postcss-selector-parser: 6.0.6 940 | postcss-value-parser: 4.1.0 941 | dev: true 942 | 943 | /postcss-modules-scope/3.0.0_postcss@8.3.6: 944 | resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} 945 | engines: {node: ^10 || ^12 || >= 14} 946 | peerDependencies: 947 | postcss: ^8.1.0 948 | dependencies: 949 | postcss: 8.3.6 950 | postcss-selector-parser: 6.0.6 951 | dev: true 952 | 953 | /postcss-modules-values/4.0.0_postcss@8.3.6: 954 | resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} 955 | engines: {node: ^10 || ^12 || >= 14} 956 | peerDependencies: 957 | postcss: ^8.1.0 958 | dependencies: 959 | icss-utils: 5.1.0_postcss@8.3.6 960 | postcss: 8.3.6 961 | dev: true 962 | 963 | /postcss-modules/4.2.2_postcss@8.3.6: 964 | resolution: {integrity: sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg==} 965 | peerDependencies: 966 | postcss: ^8.0.0 967 | dependencies: 968 | generic-names: 2.0.1 969 | icss-replace-symbols: 1.1.0 970 | lodash.camelcase: 4.3.0 971 | postcss: 8.3.6 972 | postcss-modules-extract-imports: 3.0.0_postcss@8.3.6 973 | postcss-modules-local-by-default: 4.0.0_postcss@8.3.6 974 | postcss-modules-scope: 3.0.0_postcss@8.3.6 975 | postcss-modules-values: 4.0.0_postcss@8.3.6 976 | string-hash: 1.1.3 977 | dev: true 978 | 979 | /postcss-selector-parser/6.0.6: 980 | resolution: {integrity: sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==} 981 | engines: {node: '>=4'} 982 | dependencies: 983 | cssesc: 3.0.0 984 | util-deprecate: 1.0.2 985 | dev: true 986 | 987 | /postcss-value-parser/4.1.0: 988 | resolution: {integrity: sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==} 989 | dev: true 990 | 991 | /postcss/8.3.6: 992 | resolution: {integrity: sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==} 993 | engines: {node: ^10 || ^12 || >=14} 994 | dependencies: 995 | colorette: 1.3.0 996 | nanoid: 3.1.25 997 | source-map-js: 0.6.2 998 | dev: true 999 | 1000 | /pretty-format/26.6.2: 1001 | resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} 1002 | engines: {node: '>= 10'} 1003 | dependencies: 1004 | '@jest/types': 26.6.2 1005 | ansi-regex: 5.0.0 1006 | ansi-styles: 4.3.0 1007 | react-is: 17.0.2 1008 | dev: true 1009 | 1010 | /process-nextick-args/2.0.1: 1011 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1012 | dev: true 1013 | 1014 | /queue-microtask/1.2.3: 1015 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1016 | dev: true 1017 | 1018 | /react-is/17.0.2: 1019 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} 1020 | dev: true 1021 | 1022 | /readable-stream/2.3.7: 1023 | resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} 1024 | dependencies: 1025 | core-util-is: 1.0.2 1026 | inherits: 2.0.4 1027 | isarray: 1.0.0 1028 | process-nextick-args: 2.0.1 1029 | safe-buffer: 5.1.2 1030 | string_decoder: 1.1.1 1031 | util-deprecate: 1.0.2 1032 | dev: true 1033 | 1034 | /readdirp/3.6.0: 1035 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1036 | engines: {node: '>=8.10.0'} 1037 | dependencies: 1038 | picomatch: 2.3.0 1039 | dev: true 1040 | 1041 | /resize-observer-polyfill/1.5.1: 1042 | resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} 1043 | dev: true 1044 | 1045 | /resolve/1.20.0: 1046 | resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} 1047 | dependencies: 1048 | is-core-module: 2.6.0 1049 | path-parse: 1.0.7 1050 | dev: true 1051 | 1052 | /reusify/1.0.4: 1053 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1054 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1055 | dev: true 1056 | 1057 | /rimraf/2.7.1: 1058 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 1059 | hasBin: true 1060 | dependencies: 1061 | glob: 7.1.7 1062 | dev: true 1063 | 1064 | /rollup/2.56.2: 1065 | resolution: {integrity: sha512-s8H00ZsRi29M2/lGdm1u8DJpJ9ML8SUOpVVBd33XNeEeL3NVaTiUcSBHzBdF3eAyR0l7VSpsuoVUGrRHq7aPwQ==} 1066 | engines: {node: '>=10.0.0'} 1067 | hasBin: true 1068 | optionalDependencies: 1069 | fsevents: 2.3.2 1070 | dev: true 1071 | 1072 | /run-parallel/1.2.0: 1073 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1074 | dependencies: 1075 | queue-microtask: 1.2.3 1076 | dev: true 1077 | 1078 | /safe-buffer/5.1.2: 1079 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1080 | dev: true 1081 | 1082 | /sass/1.38.0: 1083 | resolution: {integrity: sha512-WBccZeMigAGKoI+NgD7Adh0ab1HUq+6BmyBUEaGxtErbUtWUevEbdgo5EZiJQofLUGcKtlNaO2IdN73AHEua5g==} 1084 | engines: {node: '>=8.9.0'} 1085 | hasBin: true 1086 | dependencies: 1087 | chokidar: 3.5.2 1088 | dev: true 1089 | 1090 | /seemly/0.3.1: 1091 | resolution: {integrity: sha512-7P4+IJU9SIP6EBl2jjVitbgrHPb0MqWRy4j2iXGOUiDrHpdG3tH/3j5Xpyv1qWAY3IBrCKOkmVXEfwTsT4UzDg==} 1092 | dependencies: 1093 | '@types/jest': 26.0.24 1094 | dev: true 1095 | 1096 | /semver/6.3.0: 1097 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1098 | hasBin: true 1099 | dev: true 1100 | 1101 | /setimmediate/1.0.5: 1102 | resolution: {integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=} 1103 | dev: true 1104 | 1105 | /source-map-js/0.6.2: 1106 | resolution: {integrity: sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==} 1107 | engines: {node: '>=0.10.0'} 1108 | dev: true 1109 | 1110 | /source-map/0.6.1: 1111 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1112 | engines: {node: '>=0.10.0'} 1113 | 1114 | /sourcemap-codec/1.4.8: 1115 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1116 | dev: true 1117 | 1118 | /string-hash/1.1.3: 1119 | resolution: {integrity: sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=} 1120 | dev: true 1121 | 1122 | /string_decoder/1.1.1: 1123 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1124 | dependencies: 1125 | safe-buffer: 5.1.2 1126 | dev: true 1127 | 1128 | /supports-color/7.2.0: 1129 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1130 | engines: {node: '>=8'} 1131 | dependencies: 1132 | has-flag: 4.0.0 1133 | dev: true 1134 | 1135 | /to-fast-properties/2.0.0: 1136 | resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} 1137 | engines: {node: '>=4'} 1138 | 1139 | /to-regex-range/5.0.1: 1140 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1141 | engines: {node: '>=8.0'} 1142 | dependencies: 1143 | is-number: 7.0.0 1144 | dev: true 1145 | 1146 | /traverse/0.3.9: 1147 | resolution: {integrity: sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=} 1148 | dev: true 1149 | 1150 | /treemate/0.3.2: 1151 | resolution: {integrity: sha512-vy4x0kVfNHxNh+AmXbvrCklYc6HlPpIgqy2zzCStBnqdlhuHP+PaOfKUS3YyISAPhj4g4KdqmvfYrgQV2SF6Ag==} 1152 | dev: true 1153 | 1154 | /typescript/4.3.5: 1155 | resolution: {integrity: sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==} 1156 | engines: {node: '>=4.2.0'} 1157 | hasBin: true 1158 | dev: true 1159 | 1160 | /unzipper/0.10.11: 1161 | resolution: {integrity: sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==} 1162 | dependencies: 1163 | big-integer: 1.6.48 1164 | binary: 0.3.0 1165 | bluebird: 3.4.7 1166 | buffer-indexof-polyfill: 1.0.2 1167 | duplexer2: 0.1.4 1168 | fstream: 1.0.12 1169 | graceful-fs: 4.2.8 1170 | listenercount: 1.0.1 1171 | readable-stream: 2.3.7 1172 | setimmediate: 1.0.5 1173 | dev: true 1174 | 1175 | /util-deprecate/1.0.2: 1176 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 1177 | dev: true 1178 | 1179 | /vdirs/0.1.4_vue@3.2.4: 1180 | resolution: {integrity: sha512-g2wJgE8hj/ruqEnGFEXFVC8IR4kRaPDr7Cl+SSy+A8kmNr47rL1l+0wMi51amlrTL6eQsRk+wcl4bjjfPXNzZQ==} 1181 | peerDependencies: 1182 | vue: ^3.0.11 1183 | dependencies: 1184 | '@types/node': 14.17.11 1185 | evtd: 0.2.2 1186 | vue: 3.2.4 1187 | dev: true 1188 | 1189 | /vfonts/0.1.0: 1190 | resolution: {integrity: sha512-vQBcvntBlnAPonAkGNM8iJ9NxE3PucA+V2W95xiN75YJKxirLJvOws2kEyOEO45T4N+YTbQOCR2m77Y05pfVhQ==} 1191 | dev: true 1192 | 1193 | /vite/2.5.0: 1194 | resolution: {integrity: sha512-Dn4B+g54PJsMG5WCc4QeFy1ygMXRdTtFrUPegqfk4+vzVQcbF/DqqmI/1bxezArzbujBJg/67QeT5wz8edfJVQ==} 1195 | engines: {node: '>=12.2.0'} 1196 | hasBin: true 1197 | dependencies: 1198 | esbuild: 0.12.22 1199 | postcss: 8.3.6 1200 | resolve: 1.20.0 1201 | rollup: 2.56.2 1202 | optionalDependencies: 1203 | fsevents: 2.3.2 1204 | dev: true 1205 | 1206 | /vooks/0.2.8_vue@3.2.4: 1207 | resolution: {integrity: sha512-d+MHX5mTHeNZn0XTILMUKjpxS1+dUKCI/kw9+LnvfHzCawL8bZ1itViAbWfwJI246uSc47rL3ECPgPMyS8wQrQ==} 1208 | peerDependencies: 1209 | vue: ^3.0.0 1210 | dependencies: 1211 | evtd: 0.2.2 1212 | vue: 3.2.4 1213 | dev: true 1214 | 1215 | /vue-i18n/9.1.7_vue@3.2.4: 1216 | resolution: {integrity: sha512-ujuuDanoHqtEd4GejWrbG/fXE9nrP51ElsEGxp0WBHfv+/ki0/wyUqkO+4fLikki2obGtXdviTPH0VNpas5K6g==} 1217 | engines: {node: '>= 10'} 1218 | peerDependencies: 1219 | vue: ^3.0.0 1220 | dependencies: 1221 | '@intlify/core-base': 9.1.7 1222 | '@intlify/shared': 9.1.7 1223 | '@intlify/vue-devtools': 9.1.7 1224 | '@vue/devtools-api': 6.0.0-beta.15 1225 | vue: 3.2.4 1226 | dev: false 1227 | 1228 | /vue-tsc/0.0.24: 1229 | resolution: {integrity: sha512-Qx0V7jkWMtvddtaWa1SA8YKkBCRmjq9zZUB2UIMZiso6JSH538oHD2VumSzkoDnAfFbY3t0/j1mB2abpA0bGWA==} 1230 | hasBin: true 1231 | dependencies: 1232 | unzipper: 0.10.11 1233 | dev: true 1234 | 1235 | /vue/3.2.4: 1236 | resolution: {integrity: sha512-rNCFmoewm8IwmTK0nj3ysKq53iRpNEFKoBJ4inar6tIh7Oj7juubS39RI8UI+VE7x+Cs2z6PBsadtZu7z2qppg==} 1237 | dependencies: 1238 | '@vue/compiler-dom': 3.2.4 1239 | '@vue/runtime-dom': 3.2.4 1240 | '@vue/shared': 3.2.4 1241 | dev: false 1242 | 1243 | /vueuc/0.4.10_40aa6ddc39895f444e6b44d47c0da1ac: 1244 | resolution: {integrity: sha512-d/GITEBOtrkMyhJPB72SNYeO7rYrsTYMlJ+uT7bwuTT1ag15O63vwUesqhY7Vf65FybJRcQwUtGAYShDOqRiJQ==} 1245 | peerDependencies: 1246 | '@css-render/vue3-ssr': ^0.15.3 1247 | vue: ^3.0.11 1248 | dependencies: 1249 | '@css-render/vue3-ssr': 0.15.5_vue@3.2.4 1250 | css-render: 0.15.5 1251 | evtd: 0.2.2 1252 | resize-observer-polyfill: 1.5.1 1253 | seemly: 0.3.1 1254 | vdirs: 0.1.4_vue@3.2.4 1255 | vooks: 0.2.8_vue@3.2.4 1256 | vue: 3.2.4 1257 | dev: true 1258 | 1259 | /wrappy/1.0.2: 1260 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 1261 | dev: true 1262 | 1263 | /yallist/3.1.1: 1264 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1265 | dev: true 1266 | 1267 | /yaml-eslint-parser/0.3.2: 1268 | resolution: {integrity: sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==} 1269 | dependencies: 1270 | eslint-visitor-keys: 1.3.0 1271 | lodash: 4.17.21 1272 | yaml: 1.10.2 1273 | dev: true 1274 | 1275 | /yaml/1.10.2: 1276 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1277 | engines: {node: '>= 6'} 1278 | dev: true 1279 | -------------------------------------------------------------------------------- /web-ui/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/project-vrcat/VRChatConfigurationEditor/2f1dcbd4cac436bbd751be645122d322f80907ff/web-ui/public/favicon.png -------------------------------------------------------------------------------- /web-ui/src/App.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /web-ui/src/api.ts: -------------------------------------------------------------------------------- 1 | import { postMessage, postMessageAsync } from "./webview2"; 2 | 3 | export function openURL(url: string) { 4 | postMessage("openURL", [url]); 5 | } 6 | 7 | export async function selectDirectory(title: string): Promise { 8 | return postMessageAsync("selectDirectory", [title]); 9 | } 10 | 11 | export async function loadConfigFile(): Promise { 12 | return postMessageAsync("loadConfigFile", []); 13 | } 14 | 15 | export async function saveConfigFile(data: string): Promise { 16 | return new Promise((resolve, reject) => { 17 | postMessageAsync("saveConfigFile", [data]).then((i) => { 18 | if (i === "success") return resolve(true); 19 | reject(i); 20 | }).catch((err) => { 21 | reject(err); 22 | }); 23 | }); 24 | } 25 | -------------------------------------------------------------------------------- /web-ui/src/components/Header.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 23 | 24 | 67 | -------------------------------------------------------------------------------- /web-ui/src/components/HelpIcon.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /web-ui/src/components/Locale.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 39 | 40 | 53 | -------------------------------------------------------------------------------- /web-ui/src/i18n.ts: -------------------------------------------------------------------------------- 1 | import { createI18n } from 'vue-i18n' 2 | import messages from '@intlify/vite-plugin-vue-i18n/messages' 3 | 4 | export const i18n = createI18n({ 5 | legacy: false, 6 | locale: 'en', 7 | fallbackLocale: 'en', 8 | messages, 9 | }) 10 | -------------------------------------------------------------------------------- /web-ui/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import { i18n } from './i18n' 4 | 5 | const app = createApp(App) 6 | 7 | app.use(i18n) 8 | 9 | app.mount('#app') 10 | -------------------------------------------------------------------------------- /web-ui/src/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import { DefineComponent } from 'vue' 3 | // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types 4 | const component: DefineComponent<{}, {}, any> 5 | export default component 6 | } -------------------------------------------------------------------------------- /web-ui/src/utils.ts: -------------------------------------------------------------------------------- 1 | export interface resolution { 2 | height: number; 3 | width: number; 4 | } 5 | 6 | export function name2resolution(name: string): resolution { 7 | switch (name) { 8 | case "720p": 9 | return { width: 1280, height: 720 }; 10 | case "2k": 11 | return { width: 2560, height: 1440 }; 12 | case "4k": 13 | return { width: 3840, height: 2160 }; 14 | default: 15 | return { width: 1920, height: 1080 }; 16 | } 17 | } 18 | 19 | export function resolution2name(r: resolution): string { 20 | if (r.height === 720 && r.width === 1280) return "720p"; 21 | if (r.height === 1440 && r.width === 2560) return "2k"; 22 | if (r.height === 2160 && r.width === 3840) return "4k"; 23 | return "1080p"; 24 | } 25 | -------------------------------------------------------------------------------- /web-ui/src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 93 | 94 | 241 | 242 | 247 | 248 | 267 | -------------------------------------------------------------------------------- /web-ui/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /web-ui/src/webview2.ts: -------------------------------------------------------------------------------- 1 | //@ts-nocheck 2 | let values = {}; 3 | 4 | window.chrome.webview.addEventListener("message", (event: any) => { 5 | // console.log(event); 6 | if (!event.data || !event.data.Method) return; 7 | if (event.data.Args.length === 2) { 8 | values[event.data.Args[0]] = event.data.Args[1]; 9 | } 10 | // console.log(values); 11 | }); 12 | 13 | export async function postMessageAsync( 14 | method: string, 15 | args: string[], 16 | ): Promise { 17 | return new Promise((resolve, reject) => { 18 | let valueInterval; 19 | const key = method + Math.floor(Date.now() / 1000); 20 | const promiseTimeout = setTimeout(() => { 21 | clearInterval(valueInterval); 22 | reject("timeout"); 23 | }, 30000); 24 | 25 | postMessage(method, [key].concat(args)); 26 | 27 | valueInterval = setInterval(() => { 28 | if (values[key]) { 29 | clearTimeout(promiseTimeout); 30 | resolve(values[key]); 31 | delete (values[key]); 32 | clearInterval(valueInterval); 33 | } 34 | }, 500); 35 | }); 36 | } 37 | 38 | export function postMessage(method: string, args: string[]) { 39 | window.chrome.webview.postMessage({ method: method, args: args }); 40 | } 41 | -------------------------------------------------------------------------------- /web-ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "baseUrl": ".", 5 | "module": "ESNext", 6 | "target": "es2016", 7 | "lib": ["DOM", "ESNext"], 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "incremental": false, 11 | "skipLibCheck": true, 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "noUnusedLocals": true, 15 | "strictNullChecks": true, 16 | "forceConsistentCasingInFileNames": true, 17 | "types": ["vite/client", "@intlify/vite-plugin-vue-i18n/client"], 18 | "paths": { 19 | "~/*": ["src/*"] 20 | } 21 | }, 22 | "exclude": ["dist", "node_modules"] 23 | } 24 | -------------------------------------------------------------------------------- /web-ui/vite.config.ts: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import { defineConfig } from 'vite' 3 | import vue from '@vitejs/plugin-vue' 4 | import vueI18n from '@intlify/vite-plugin-vue-i18n' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | base: "./", 9 | build: { 10 | outDir: './dist', 11 | }, 12 | resolve: { 13 | alias: { 14 | '~/': `${path.resolve(__dirname, 'src')}/`, 15 | }, 16 | }, 17 | plugins: [ 18 | vue(), 19 | vueI18n({ 20 | include: [path.resolve(__dirname, 'locales/**')], 21 | }), 22 | ], 23 | }) 24 | --------------------------------------------------------------------------------