├── web-ui ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── logo192.png │ ├── logo512.png │ └── manifest.json ├── vite.config.js ├── src │ ├── index.tsx │ ├── App.test.tsx │ ├── index.css │ ├── App.css │ ├── App.tsx │ ├── logo.svg │ └── betterBridge.ts ├── .gitignore ├── tsconfig.json ├── package.json ├── index.html └── yarn.lock ├── WebView2BetterBridge ├── WebView2BetterBridge.csproj ├── Program.cs ├── Form1.cs ├── SimpleBridge.cs ├── Form1.Designer.cs ├── Form1.resx └── BetterBridge.cs ├── WebView2BetterBridge.sln ├── Readme.md └── .gitignore /web-ui/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /web-ui/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johot/WebView2-better-bridge/HEAD/web-ui/public/favicon.ico -------------------------------------------------------------------------------- /web-ui/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johot/WebView2-better-bridge/HEAD/web-ui/public/logo192.png -------------------------------------------------------------------------------- /web-ui/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johot/WebView2-better-bridge/HEAD/web-ui/public/logo512.png -------------------------------------------------------------------------------- /web-ui/vite.config.js: -------------------------------------------------------------------------------- 1 | // vite.config.js 2 | import { defineConfig } from "vite"; 3 | import react from "@vitejs/plugin-react"; 4 | 5 | export default defineConfig({ 6 | plugins: [react()], 7 | server: { 8 | port: 3000, 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /web-ui/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import "./index.css"; 4 | import App from "./App"; 5 | 6 | ReactDOM.render( 7 | 8 | 9 | , 10 | document.getElementById("root") 11 | ); 12 | -------------------------------------------------------------------------------- /web-ui/src/App.test.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { render, screen } from '@testing-library/react'; 3 | import App from './App'; 4 | 5 | test('renders learn react link', () => { 6 | render(); 7 | const linkElement = screen.getByText(/learn react/i); 8 | expect(linkElement).toBeInTheDocument(); 9 | }); 10 | -------------------------------------------------------------------------------- /web-ui/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /web-ui/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /WebView2BetterBridge/WebView2BetterBridge.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | WinExe 5 | net5.0-windows 6 | true 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /web-ui/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /web-ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": [ 5 | "dom", 6 | "dom.iterable", 7 | "esnext" 8 | ], 9 | "allowJs": true, 10 | "skipLibCheck": true, 11 | "esModuleInterop": true, 12 | "allowSyntheticDefaultImports": true, 13 | "strict": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "noFallthroughCasesInSwitch": true, 16 | "module": "esnext", 17 | "moduleResolution": "node", 18 | "resolveJsonModule": true, 19 | "isolatedModules": true, 20 | "noEmit": true, 21 | "jsx": "react-jsx" 22 | }, 23 | "include": [ 24 | "src" 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /WebView2BetterBridge/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace WebView2BetterBridge 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// The main entry point for the application. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.SetHighDpiMode(HighDpiMode.SystemAware); 18 | Application.EnableVisualStyles(); 19 | Application.SetCompatibleTextRenderingDefault(false); 20 | Application.Run(new Form1()); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /web-ui/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /web-ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "web-ui", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@types/node": "^16.11.26", 7 | "@types/react": "^17.0.39", 8 | "@types/react-dom": "^17.0.13", 9 | "@vitejs/plugin-react": "^2.0.1", 10 | "react": "^17.0.2", 11 | "react-dom": "^17.0.2", 12 | "typescript": "^4.6.2", 13 | "vite": "^3.0.7" 14 | }, 15 | "scripts": { 16 | "start": "vite", 17 | "dev": "vite", 18 | "build": "vite build" 19 | }, 20 | "eslintConfig": { 21 | "extends": [ 22 | "react-app" 23 | ] 24 | }, 25 | "browserslist": { 26 | "production": [ 27 | ">0.2%", 28 | "not dead", 29 | "not op_mini all" 30 | ], 31 | "development": [ 32 | "last 1 chrome version", 33 | "last 1 firefox version", 34 | "last 1 safari version" 35 | ] 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /WebView2BetterBridge.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.32126.315 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebView2BetterBridge", "WebView2BetterBridge\WebView2BetterBridge.csproj", "{AB65B44D-16E9-49A8-8621-FB9185EDDF73}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {AB65B44D-16E9-49A8-8621-FB9185EDDF73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {AB65B44D-16E9-49A8-8621-FB9185EDDF73}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {AB65B44D-16E9-49A8-8621-FB9185EDDF73}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {AB65B44D-16E9-49A8-8621-FB9185EDDF73}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {FCA5DCED-FAF5-407A-9D6D-E0B1410EA4FB} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /WebView2BetterBridge/Form1.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using System.Windows.Forms; 10 | 11 | namespace WebView2BetterBridge 12 | { 13 | public partial class Form1 : Form 14 | { 15 | public Form1() 16 | { 17 | InitializeComponent(); 18 | this.Resize += new System.EventHandler(this.Form_Resize); 19 | InitializeAsync(); 20 | } 21 | 22 | private void Form_Resize(object sender, EventArgs e) 23 | { 24 | webView2.Size = this.ClientSize - new System.Drawing.Size(webView2.Location); 25 | } 26 | 27 | async void InitializeAsync() 28 | { 29 | await webView2.EnsureCoreWebView2Async(null); 30 | 31 | webView2.Source = new Uri("http://localhost:3000"); 32 | webView2.CoreWebView2.AddHostObjectToScript("bridge", new BetterBridge(new SimpleBridge(new BetterBridgeMessageSender(webView2)), webView2)); 33 | } 34 | } 35 | 36 | public class MyFunctions 37 | { 38 | public async Task HelloWorld(Int64 nr) 39 | { 40 | await Task.Delay(3000); 41 | return "HELLO!"; 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /web-ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /WebView2BetterBridge/SimpleBridge.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace WebView2BetterBridge 8 | { 9 | public class SimpleBridge 10 | { 11 | private readonly BetterBridgeMessageSender messageSender; 12 | 13 | public SimpleBridge(BetterBridgeMessageSender messageSender) 14 | { 15 | this.messageSender = messageSender; 16 | } 17 | 18 | public async Task StartSendingMessagesAsync() 19 | { 20 | messageSender.SendMessage("message", new Message() { Text = "Message 1", Sent = DateTime.Now }); 21 | await Task.Delay(1000); 22 | messageSender.SendMessage("message", new Message() { Text = "Message 2", Sent = DateTime.Now }); 23 | await Task.Delay(1000); 24 | messageSender.SendMessage("message", new Message() { Text = "Message 3", Sent = DateTime.Now }); 25 | } 26 | 27 | public Message HelloWorld(int someData, string moreData, Message message) 28 | { 29 | return new Message() 30 | { 31 | Text = $"Hi from C#! Thank you for the data: {message.Text} {message.Sent} {someData} and {moreData}.", 32 | Sent = DateTime.Now 33 | }; 34 | } 35 | 36 | public async Task HelloWorldAsync(int someData, string moreData, Message message) 37 | { 38 | var msg = new Message() 39 | { 40 | Text = $"Hi from C#! Thank you for the data: {message.Text} {message.Sent} {someData} and {moreData}.", 41 | Sent = DateTime.Now 42 | }; 43 | 44 | await Task.Delay(500); 45 | 46 | return msg; 47 | } 48 | } 49 | 50 | public class Message 51 | { 52 | public string Text { get; set; } 53 | 54 | public DateTime Sent { get; set; } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /web-ui/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from "react"; 2 | import "./App.css"; 3 | import { createBridge } from "./betterBridge"; 4 | 5 | interface SimpleBridge { 6 | helloWorld: (number: number, string: string, message: any) => Promise; 7 | helloWorldAsync: ( 8 | number: number, 9 | string: string, 10 | message: any 11 | ) => Promise; 12 | startSendingMessagesAsync: () => Promise; 13 | } 14 | 15 | const bridge = createBridge("bridge"); 16 | 17 | function App() { 18 | useEffect(() => { 19 | bridge.addMessageHandler((type, data) => { 20 | alert("Got message of type: " + type + " data: " + JSON.stringify(data)); 21 | }); 22 | }); 23 | 24 | return ( 25 |
26 | 41 | 56 | 57 | 67 |
68 | ); 69 | } 70 | 71 | export default App; 72 | -------------------------------------------------------------------------------- /web-ui/src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /WebView2BetterBridge/Form1.Designer.cs: -------------------------------------------------------------------------------- 1 | 2 | namespace WebView2BetterBridge 3 | { 4 | partial class Form1 5 | { 6 | /// 7 | /// Required designer variable. 8 | /// 9 | private System.ComponentModel.IContainer components = null; 10 | 11 | /// 12 | /// Clean up any resources being used. 13 | /// 14 | /// true if managed resources should be disposed; otherwise, false. 15 | protected override void Dispose(bool disposing) 16 | { 17 | if (disposing && (components != null)) 18 | { 19 | components.Dispose(); 20 | } 21 | base.Dispose(disposing); 22 | } 23 | 24 | #region Windows Form Designer generated code 25 | 26 | /// 27 | /// Required method for Designer support - do not modify 28 | /// the contents of this method with the code editor. 29 | /// 30 | private void InitializeComponent() 31 | { 32 | this.webView2 = new Microsoft.Web.WebView2.WinForms.WebView2(); 33 | ((System.ComponentModel.ISupportInitialize)(this.webView2)).BeginInit(); 34 | this.SuspendLayout(); 35 | // 36 | // webView2 37 | // 38 | this.webView2.CreationProperties = null; 39 | this.webView2.DefaultBackgroundColor = System.Drawing.Color.White; 40 | this.webView2.Dock = System.Windows.Forms.DockStyle.Fill; 41 | this.webView2.Location = new System.Drawing.Point(0, 0); 42 | this.webView2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); 43 | this.webView2.Name = "webView2"; 44 | this.webView2.Size = new System.Drawing.Size(914, 600); 45 | this.webView2.TabIndex = 0; 46 | this.webView2.ZoomFactor = 1D; 47 | // 48 | // Form1 49 | // 50 | this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); 51 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 52 | this.ClientSize = new System.Drawing.Size(914, 600); 53 | this.Controls.Add(this.webView2); 54 | this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); 55 | this.Name = "Form1"; 56 | this.Text = "Better Bridge Sample"; 57 | ((System.ComponentModel.ISupportInitialize)(this.webView2)).EndInit(); 58 | this.ResumeLayout(false); 59 | 60 | } 61 | 62 | #endregion 63 | 64 | private Microsoft.Web.WebView2.WinForms.WebView2 webView2; 65 | } 66 | } 67 | 68 | -------------------------------------------------------------------------------- /web-ui/src/betterBridge.ts: -------------------------------------------------------------------------------- 1 | export function createBridge< 2 | T = Record Promise> 3 | >(bridgeName: string) { 4 | return new BetterBridge(bridgeName) as BetterBridge & T; 5 | } 6 | 7 | class BetterBridge { 8 | private webViewBridge: any = undefined; 9 | private messageHandlers: MessageHandler[] = []; 10 | 11 | constructor(bridgeName: string) { 12 | this.webViewBridge = (window as any).chrome.webview.hostObjects[bridgeName]; 13 | 14 | const availableMethods = (window as any).chrome.webview.hostObjects.sync[ 15 | bridgeName 16 | ].GetMethods(); 17 | 18 | availableMethods.forEach((methodName: string) => { 19 | const lowerCaseMethodName = lowercaseFirstLetter(methodName); 20 | 21 | (this as any)[lowerCaseMethodName] = (...args: any[]) => { 22 | return this.runMethod(methodName, args); 23 | }; 24 | }); 25 | } 26 | 27 | // TODO: Need logic to clean this up when no handlers exist anymore, might cause leaks 28 | private initMessageHandling = () => { 29 | (window as any).chrome.webview.addEventListener("message", (event: any) => { 30 | // This data will already be deserialized for us 31 | const eventData = event.data; 32 | const type: string = eventData.type; 33 | const data: any = eventData.data; 34 | 35 | if (type) { 36 | this.onMessage(type, data); 37 | } 38 | }); 39 | }; 40 | 41 | private messageHandlingInitialized = false; 42 | 43 | addMessageHandler = (messageHandler: MessageHandler) => { 44 | if (!this.messageHandlingInitialized) { 45 | this.initMessageHandling(); 46 | this.messageHandlingInitialized = true; 47 | } 48 | 49 | this.messageHandlers.push(messageHandler); 50 | }; 51 | 52 | removeMessageHandler = (messageHandler: MessageHandler) => { 53 | const index = this.messageHandlers.indexOf(messageHandler); 54 | this.messageHandlers.splice(index, 1); 55 | }; 56 | 57 | private onMessage = (type: string, data: any) => { 58 | // Call all handlers 59 | for (const handler of this.messageHandlers) { 60 | handler(type, data); 61 | } 62 | }; 63 | 64 | // Only works in WebView2 1.0.1293.44+ 65 | private runMethod = async ( 66 | methodName: string, 67 | args: any[] 68 | ): Promise => { 69 | const argsJson = args.map((a) => JSON.stringify(a)); 70 | 71 | const returnJson = await this.webViewBridge.RunMethod( 72 | methodName, 73 | JSON.stringify(argsJson) 74 | ); 75 | 76 | return JSON.parse(returnJson); 77 | }; 78 | } 79 | 80 | export type MessageHandler = (type: string, data: any) => void; 81 | 82 | function lowercaseFirstLetter(name: string) { 83 | return name.charAt(0).toLowerCase() + name.slice(1); 84 | } 85 | -------------------------------------------------------------------------------- /WebView2BetterBridge/Form1.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | text/microsoft-resx 50 | 51 | 52 | 2.0 53 | 54 | 55 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 56 | 57 | 58 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 59 | 60 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # WebView2 Better Bridge 2 | 3 | Using WebView2 call C# methods (async and sync) with complex parameters and return values from TS/JS! 4 | 5 | ## Installation 6 | 7 | There currently is no NuGet and npm packages, instead copy the `WebView2BetterBridge\BetterBridge.cs` to your C# project and `web-ui\src\betterBridge.ts` to your frontend project. 8 | 9 | > Note: For this solution to work with async methods you need to be on WebView2 1.0.1293.44 or later. 10 | 11 | ## Usage 12 | 13 | The documentation here is just a very light overview, for full details check the sample projects. 14 | 15 | ### Initialize bridge 16 | 17 | - Create a regular class that contains all the methods you can call from TS/JS (see `SampleBridge.cs` for an example). Both async and sync methods with complex object parameters and return values will work. 18 | 19 | - Register it by calling: 20 | 21 | ```cs 22 | webView2.CoreWebView2.AddHostObjectToScript("bridge", new BetterBridge(new MyBridge(), webView2)); 23 | ``` 24 | 25 | _Notice how BetterBridge wraps your own bridge class._ 26 | 27 | ### Calling async C# methods 28 | 29 | > Note: The TS/JS method on the bridge should use camelCase. 30 | 31 | ```ts 32 | // TypeScript 33 | import { createBridge } from "./betterBridge"; 34 | const bridge = createBridge("bridge"); 35 | 36 | const result = await bridge.helloWorldAsync(99, "abc", { 37 | text: "hello from JS!", 38 | sent: new Date(), 39 | }); 40 | ``` 41 | 42 | ```cs 43 | // C# 44 | public async Task HelloWorldAsync(int someData, string moreData, Message message) 45 | { 46 | var msg = new Message() 47 | { 48 | Text = $"Hi from C#! Thank you for the data: {message.Text} {message.Sent} {someData} and {moreData}.", 49 | Sent = DateTime.Now 50 | }; 51 | 52 | await Task.Delay(500); 53 | 54 | return msg; 55 | } 56 | ``` 57 | 58 | ### Calling sync C# methods 59 | 60 | > Note: The TS/JS method on the bridge should use camelCase. 61 | 62 | > Note: Even though the C# method is sync it's still resolved to a Promise that we have to await. This is the recommended way since we do not want to lock up the UI. 63 | 64 | ```ts 65 | // TypeScript 66 | import { createBridge } from "./betterBridge"; 67 | const bridge = createBridge("bridge"); 68 | 69 | const result = await bridge.helloWorld(99, "abc", { 70 | text: "hello from JS!", 71 | sent: new Date(), 72 | }); 73 | ``` 74 | 75 | ```cs 76 | // C# 77 | public Message HelloWorld(int someData, string moreData, Message message) 78 | { 79 | return new Message() 80 | { 81 | Text = $"Hi from C#! Thank you for the data: {message.Text} {message.Sent} {someData} and {moreData}.", 82 | Sent = DateTime.Now 83 | }; 84 | } 85 | ``` 86 | 87 | ### Sending messages from C# to TS/JS 88 | 89 | Makes it a bit easier to send messages from C# to TS/JS instead of using `webView2.CoreWebView2.PostWebMessageAsJson` directly. 90 | 91 | ```cs 92 | // C# 93 | var messageSender = new BetterBridgeMessageSender(webView2); 94 | messageSender.SendMessage("message", new Message() { Text = "I want to report something", Sent = DateTime.Now }); 95 | ``` 96 | 97 | ```ts 98 | // TypeScript 99 | import { createBridge } from "./betterBridge"; 100 | const bridge = createBridge("bridge"); 101 | 102 | bridge.addMessageHandler((type, data) => { 103 | console.log("Got message", type, data); 104 | }); 105 | ``` 106 | 107 | ## Performance 108 | 109 | Uses some reflection under the hood but when testing I saw very small performance differences often in the range of 0.1-0.5 ms. But your results may vary 😊. 110 | -------------------------------------------------------------------------------- /WebView2BetterBridge/BetterBridge.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Web.WebView2.WinForms; 2 | using Newtonsoft.Json; 3 | using Newtonsoft.Json.Serialization; 4 | using System; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | 8 | namespace WebView2BetterBridge 9 | { 10 | /// 11 | /// Subscribers to messages from TS/JS and invokes methods / parses JSON etc for a wrapping bridge class. 12 | /// Giving us the ability to use any arguments, use async methods pass complex objects etc :D 13 | /// 14 | public class BetterBridge 15 | { 16 | private readonly WebView2 webView2; 17 | 18 | // Will invoke methods on this object 19 | private readonly object bridgeClass; 20 | private Type bridgeClassType; 21 | 22 | public BetterBridge(object bridgeClass, WebView2 webView2) 23 | { 24 | this.webView2 = webView2; 25 | this.bridgeClass = bridgeClass; 26 | this.bridgeClassType = this.bridgeClass.GetType(); 27 | } 28 | 29 | private JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings 30 | { 31 | ObjectCreationHandling = ObjectCreationHandling.Replace, 32 | ContractResolver = new DefaultContractResolver 33 | { 34 | NamingStrategy = new CamelCaseNamingStrategy() 35 | }, 36 | //Formatting = Formatting.Indented 37 | }; 38 | 39 | public string[] GetMethods() 40 | { 41 | return this.bridgeClassType.GetMethods().Select(m => m.Name).ToArray(); 42 | } 43 | 44 | /// 45 | /// Called from TS/JS side works on both async and regular methods of the wrapped class :D ! 46 | /// 47 | /// 48 | /// 49 | /// 50 | /// 51 | public async Task RunMethod(string methodName, string argsJson) 52 | { 53 | // We have stored each argument as json data in an array, the array is also encoded to a string 54 | // since webview can't invoke string[] array functions 55 | var jsonDataArray = JsonConvert.DeserializeObject(argsJson, jsonSerializerSettings); 56 | 57 | var method = bridgeClassType.GetMethod(methodName); 58 | var parameters = bridgeClassType.GetMethod(methodName).GetParameters(); 59 | 60 | if (parameters.Length != jsonDataArray.Length) 61 | throw new Exception("Wrong number of arguments, expected: " + parameters.Length + " but got: " + jsonDataArray.Length); 62 | 63 | var typedArgs = new object[jsonDataArray.Length]; 64 | 65 | for (int i = 0; i < typedArgs.Length; i++) 66 | { 67 | var typedObj = JsonConvert.DeserializeObject(jsonDataArray[i], parameters[i].ParameterType, jsonSerializerSettings); 68 | typedArgs[i] = typedObj; 69 | } 70 | 71 | var resultTyped = method.Invoke(this.bridgeClass, typedArgs); 72 | 73 | // Was it an async method (in bridgeClass?) 74 | var resultTypedTask = resultTyped as Task; 75 | 76 | string resultJson = null; 77 | 78 | // Was the method called async? 79 | if (resultTypedTask == null) 80 | { 81 | // Regular method: 82 | 83 | // Package the result 84 | resultJson = JsonConvert.SerializeObject(resultTyped, jsonSerializerSettings); 85 | } 86 | else 87 | { 88 | // Async method: 89 | 90 | await resultTypedTask; 91 | 92 | // If has a "Result" property return the value otherwise null (Task etc) 93 | var resultProperty = resultTypedTask.GetType().GetProperty("Result"); 94 | 95 | var taskResult = resultProperty != null ? resultProperty.GetValue(resultTypedTask) : null; 96 | 97 | // Package the result 98 | resultJson = JsonConvert.SerializeObject(taskResult, jsonSerializerSettings); 99 | } 100 | 101 | return resultJson; 102 | } 103 | } 104 | 105 | public class BetterBridgeMessageSender 106 | { 107 | private readonly WebView2 webView2; 108 | 109 | public BetterBridgeMessageSender(WebView2 webView2) 110 | { 111 | this.webView2 = webView2; 112 | } 113 | public void SendMessage(string type, object data) 114 | { 115 | // Convert to JSON 116 | string result = JsonConvert.SerializeObject(new BridgeMessage() { Type = type, Data = data }, jsonSerializerSettings); 117 | 118 | webView2.CoreWebView2.PostWebMessageAsJson(result); 119 | } 120 | 121 | private JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings 122 | { 123 | ContractResolver = new DefaultContractResolver 124 | { 125 | NamingStrategy = new CamelCaseNamingStrategy() 126 | }, 127 | //Formatting = Formatting.Indented 128 | }; 129 | } 130 | 131 | /// 132 | /// For sending messages (like progress etc) to TS/JS. 133 | /// 134 | public class BridgeMessage 135 | { 136 | public string Type { get; set; } 137 | public object Data { get; set; } 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /.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/main/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 | [Ll]og/ 33 | [Ll]ogs/ 34 | 35 | # Visual Studio 2015/2017 cache/options directory 36 | .vs/ 37 | # Uncomment if you have tasks that create the project's static files in wwwroot 38 | #wwwroot/ 39 | 40 | # Visual Studio 2017 auto generated files 41 | Generated\ Files/ 42 | 43 | # MSTest test Results 44 | [Tt]est[Rr]esult*/ 45 | [Bb]uild[Ll]og.* 46 | 47 | # NUnit 48 | *.VisualState.xml 49 | TestResult.xml 50 | nunit-*.xml 51 | 52 | # Build Results of an ATL Project 53 | [Dd]ebugPS/ 54 | [Rr]eleasePS/ 55 | dlldata.c 56 | 57 | # Benchmark Results 58 | BenchmarkDotNet.Artifacts/ 59 | 60 | # .NET Core 61 | project.lock.json 62 | project.fragment.lock.json 63 | artifacts/ 64 | 65 | # ASP.NET Scaffolding 66 | ScaffoldingReadMe.txt 67 | 68 | # StyleCop 69 | StyleCopReport.xml 70 | 71 | # Files built by Visual Studio 72 | *_i.c 73 | *_p.c 74 | *_h.h 75 | *.ilk 76 | *.meta 77 | *.obj 78 | *.iobj 79 | *.pch 80 | *.pdb 81 | *.ipdb 82 | *.pgc 83 | *.pgd 84 | *.rsp 85 | *.sbr 86 | *.tlb 87 | *.tli 88 | *.tlh 89 | *.tmp 90 | *.tmp_proj 91 | *_wpftmp.csproj 92 | *.log 93 | *.tlog 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 6 auto-generated project file (contains which files were open etc.) 298 | *.vbp 299 | 300 | # Visual Studio 6 workspace and project file (working project files containing files to include in project) 301 | *.dsw 302 | *.dsp 303 | 304 | # Visual Studio 6 technical files 305 | *.ncb 306 | *.aps 307 | 308 | # Visual Studio LightSwitch build output 309 | **/*.HTMLClient/GeneratedArtifacts 310 | **/*.DesktopClient/GeneratedArtifacts 311 | **/*.DesktopClient/ModelManifest.xml 312 | **/*.Server/GeneratedArtifacts 313 | **/*.Server/ModelManifest.xml 314 | _Pvt_Extensions 315 | 316 | # Paket dependency manager 317 | .paket/paket.exe 318 | paket-files/ 319 | 320 | # FAKE - F# Make 321 | .fake/ 322 | 323 | # CodeRush personal settings 324 | .cr/personal 325 | 326 | # Python Tools for Visual Studio (PTVS) 327 | __pycache__/ 328 | *.pyc 329 | 330 | # Cake - Uncomment if you are using it 331 | # tools/** 332 | # !tools/packages.config 333 | 334 | # Tabs Studio 335 | *.tss 336 | 337 | # Telerik's JustMock configuration file 338 | *.jmconfig 339 | 340 | # BizTalk build output 341 | *.btp.cs 342 | *.btm.cs 343 | *.odx.cs 344 | *.xsd.cs 345 | 346 | # OpenCover UI analysis results 347 | OpenCover/ 348 | 349 | # Azure Stream Analytics local run output 350 | ASALocalRun/ 351 | 352 | # MSBuild Binary and Structured Log 353 | *.binlog 354 | 355 | # NVidia Nsight GPU debugger configuration file 356 | *.nvuser 357 | 358 | # MFractors (Xamarin productivity tool) working folder 359 | .mfractor/ 360 | 361 | # Local History for Visual Studio 362 | .localhistory/ 363 | 364 | # Visual Studio History (VSHistory) files 365 | .vshistory/ 366 | 367 | # BeatPulse healthcheck temp database 368 | healthchecksdb 369 | 370 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 371 | MigrationBackup/ 372 | 373 | # Ionide (cross platform F# VS Code tools) working folder 374 | .ionide/ 375 | 376 | # Fody - auto-generated XML schema 377 | FodyWeavers.xsd 378 | 379 | # VS Code files for those working on multiple tools 380 | .vscode/* 381 | !.vscode/settings.json 382 | !.vscode/tasks.json 383 | !.vscode/launch.json 384 | !.vscode/extensions.json 385 | *.code-workspace 386 | 387 | # Local History for Visual Studio Code 388 | .history/ 389 | 390 | # Windows Installer files from build outputs 391 | *.cab 392 | *.msi 393 | *.msix 394 | *.msm 395 | *.msp 396 | 397 | # JetBrains Rider 398 | *.sln.iml -------------------------------------------------------------------------------- /web-ui/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ampproject/remapping@^2.1.0": 6 | version "2.1.2" 7 | resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" 8 | integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== 9 | dependencies: 10 | "@jridgewell/trace-mapping" "^0.3.0" 11 | 12 | "@babel/code-frame@^7.18.6": 13 | version "7.18.6" 14 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" 15 | integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== 16 | dependencies: 17 | "@babel/highlight" "^7.18.6" 18 | 19 | "@babel/compat-data@^7.18.8": 20 | version "7.18.8" 21 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" 22 | integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== 23 | 24 | "@babel/core@^7.18.10": 25 | version "7.18.10" 26 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" 27 | integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== 28 | dependencies: 29 | "@ampproject/remapping" "^2.1.0" 30 | "@babel/code-frame" "^7.18.6" 31 | "@babel/generator" "^7.18.10" 32 | "@babel/helper-compilation-targets" "^7.18.9" 33 | "@babel/helper-module-transforms" "^7.18.9" 34 | "@babel/helpers" "^7.18.9" 35 | "@babel/parser" "^7.18.10" 36 | "@babel/template" "^7.18.10" 37 | "@babel/traverse" "^7.18.10" 38 | "@babel/types" "^7.18.10" 39 | convert-source-map "^1.7.0" 40 | debug "^4.1.0" 41 | gensync "^1.0.0-beta.2" 42 | json5 "^2.2.1" 43 | semver "^6.3.0" 44 | 45 | "@babel/generator@^7.18.10": 46 | version "7.18.12" 47 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4" 48 | integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== 49 | dependencies: 50 | "@babel/types" "^7.18.10" 51 | "@jridgewell/gen-mapping" "^0.3.2" 52 | jsesc "^2.5.1" 53 | 54 | "@babel/helper-annotate-as-pure@^7.18.6": 55 | version "7.18.6" 56 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" 57 | integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== 58 | dependencies: 59 | "@babel/types" "^7.18.6" 60 | 61 | "@babel/helper-compilation-targets@^7.18.9": 62 | version "7.18.9" 63 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" 64 | integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== 65 | dependencies: 66 | "@babel/compat-data" "^7.18.8" 67 | "@babel/helper-validator-option" "^7.18.6" 68 | browserslist "^4.20.2" 69 | semver "^6.3.0" 70 | 71 | "@babel/helper-environment-visitor@^7.18.9": 72 | version "7.18.9" 73 | resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" 74 | integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== 75 | 76 | "@babel/helper-function-name@^7.18.9": 77 | version "7.18.9" 78 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" 79 | integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== 80 | dependencies: 81 | "@babel/template" "^7.18.6" 82 | "@babel/types" "^7.18.9" 83 | 84 | "@babel/helper-hoist-variables@^7.18.6": 85 | version "7.18.6" 86 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" 87 | integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== 88 | dependencies: 89 | "@babel/types" "^7.18.6" 90 | 91 | "@babel/helper-module-imports@^7.18.6": 92 | version "7.18.6" 93 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" 94 | integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== 95 | dependencies: 96 | "@babel/types" "^7.18.6" 97 | 98 | "@babel/helper-module-transforms@^7.18.9": 99 | version "7.18.9" 100 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" 101 | integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== 102 | dependencies: 103 | "@babel/helper-environment-visitor" "^7.18.9" 104 | "@babel/helper-module-imports" "^7.18.6" 105 | "@babel/helper-simple-access" "^7.18.6" 106 | "@babel/helper-split-export-declaration" "^7.18.6" 107 | "@babel/helper-validator-identifier" "^7.18.6" 108 | "@babel/template" "^7.18.6" 109 | "@babel/traverse" "^7.18.9" 110 | "@babel/types" "^7.18.9" 111 | 112 | "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9": 113 | version "7.18.9" 114 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" 115 | integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== 116 | 117 | "@babel/helper-simple-access@^7.18.6": 118 | version "7.18.6" 119 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" 120 | integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== 121 | dependencies: 122 | "@babel/types" "^7.18.6" 123 | 124 | "@babel/helper-split-export-declaration@^7.18.6": 125 | version "7.18.6" 126 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" 127 | integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== 128 | dependencies: 129 | "@babel/types" "^7.18.6" 130 | 131 | "@babel/helper-string-parser@^7.18.10": 132 | version "7.18.10" 133 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" 134 | integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== 135 | 136 | "@babel/helper-validator-identifier@^7.18.6": 137 | version "7.18.6" 138 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" 139 | integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== 140 | 141 | "@babel/helper-validator-option@^7.18.6": 142 | version "7.18.6" 143 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" 144 | integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== 145 | 146 | "@babel/helpers@^7.18.9": 147 | version "7.18.9" 148 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" 149 | integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== 150 | dependencies: 151 | "@babel/template" "^7.18.6" 152 | "@babel/traverse" "^7.18.9" 153 | "@babel/types" "^7.18.9" 154 | 155 | "@babel/highlight@^7.18.6": 156 | version "7.18.6" 157 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" 158 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 159 | dependencies: 160 | "@babel/helper-validator-identifier" "^7.18.6" 161 | chalk "^2.0.0" 162 | js-tokens "^4.0.0" 163 | 164 | "@babel/parser@^7.18.10", "@babel/parser@^7.18.11": 165 | version "7.18.11" 166 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" 167 | integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== 168 | 169 | "@babel/plugin-syntax-jsx@^7.18.6": 170 | version "7.18.6" 171 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" 172 | integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== 173 | dependencies: 174 | "@babel/helper-plugin-utils" "^7.18.6" 175 | 176 | "@babel/plugin-transform-react-jsx-development@^7.18.6": 177 | version "7.18.6" 178 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" 179 | integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== 180 | dependencies: 181 | "@babel/plugin-transform-react-jsx" "^7.18.6" 182 | 183 | "@babel/plugin-transform-react-jsx-self@^7.18.6": 184 | version "7.18.6" 185 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" 186 | integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== 187 | dependencies: 188 | "@babel/helper-plugin-utils" "^7.18.6" 189 | 190 | "@babel/plugin-transform-react-jsx-source@^7.18.6": 191 | version "7.18.6" 192 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz#06e9ae8a14d2bc19ce6e3c447d842032a50598fc" 193 | integrity sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw== 194 | dependencies: 195 | "@babel/helper-plugin-utils" "^7.18.6" 196 | 197 | "@babel/plugin-transform-react-jsx@^7.18.10", "@babel/plugin-transform-react-jsx@^7.18.6": 198 | version "7.18.10" 199 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz#ea47b2c4197102c196cbd10db9b3bb20daa820f1" 200 | integrity sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A== 201 | dependencies: 202 | "@babel/helper-annotate-as-pure" "^7.18.6" 203 | "@babel/helper-module-imports" "^7.18.6" 204 | "@babel/helper-plugin-utils" "^7.18.9" 205 | "@babel/plugin-syntax-jsx" "^7.18.6" 206 | "@babel/types" "^7.18.10" 207 | 208 | "@babel/template@^7.18.10", "@babel/template@^7.18.6": 209 | version "7.18.10" 210 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" 211 | integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== 212 | dependencies: 213 | "@babel/code-frame" "^7.18.6" 214 | "@babel/parser" "^7.18.10" 215 | "@babel/types" "^7.18.10" 216 | 217 | "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9": 218 | version "7.18.11" 219 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.11.tgz#3d51f2afbd83ecf9912bcbb5c4d94e3d2ddaa16f" 220 | integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== 221 | dependencies: 222 | "@babel/code-frame" "^7.18.6" 223 | "@babel/generator" "^7.18.10" 224 | "@babel/helper-environment-visitor" "^7.18.9" 225 | "@babel/helper-function-name" "^7.18.9" 226 | "@babel/helper-hoist-variables" "^7.18.6" 227 | "@babel/helper-split-export-declaration" "^7.18.6" 228 | "@babel/parser" "^7.18.11" 229 | "@babel/types" "^7.18.10" 230 | debug "^4.1.0" 231 | globals "^11.1.0" 232 | 233 | "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9": 234 | version "7.18.10" 235 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" 236 | integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== 237 | dependencies: 238 | "@babel/helper-string-parser" "^7.18.10" 239 | "@babel/helper-validator-identifier" "^7.18.6" 240 | to-fast-properties "^2.0.0" 241 | 242 | "@esbuild/linux-loong64@0.14.54": 243 | version "0.14.54" 244 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" 245 | integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== 246 | 247 | "@jridgewell/gen-mapping@^0.3.2": 248 | version "0.3.2" 249 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" 250 | integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== 251 | dependencies: 252 | "@jridgewell/set-array" "^1.0.1" 253 | "@jridgewell/sourcemap-codec" "^1.4.10" 254 | "@jridgewell/trace-mapping" "^0.3.9" 255 | 256 | "@jridgewell/resolve-uri@^3.0.3": 257 | version "3.0.5" 258 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" 259 | integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== 260 | 261 | "@jridgewell/set-array@^1.0.1": 262 | version "1.1.2" 263 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" 264 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 265 | 266 | "@jridgewell/sourcemap-codec@^1.4.10": 267 | version "1.4.11" 268 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" 269 | integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== 270 | 271 | "@jridgewell/trace-mapping@^0.3.0": 272 | version "0.3.4" 273 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" 274 | integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== 275 | dependencies: 276 | "@jridgewell/resolve-uri" "^3.0.3" 277 | "@jridgewell/sourcemap-codec" "^1.4.10" 278 | 279 | "@jridgewell/trace-mapping@^0.3.9": 280 | version "0.3.15" 281 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" 282 | integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== 283 | dependencies: 284 | "@jridgewell/resolve-uri" "^3.0.3" 285 | "@jridgewell/sourcemap-codec" "^1.4.10" 286 | 287 | "@types/node@^16.11.26": 288 | version "16.11.26" 289 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.26.tgz#63d204d136c9916fb4dcd1b50f9740fe86884e47" 290 | integrity sha512-GZ7bu5A6+4DtG7q9GsoHXy3ALcgeIHP4NnL0Vv2wu0uUB/yQex26v0tf6/na1mm0+bS9Uw+0DFex7aaKr2qawQ== 291 | 292 | "@types/prop-types@*": 293 | version "15.7.4" 294 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" 295 | integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== 296 | 297 | "@types/react-dom@^17.0.13": 298 | version "17.0.13" 299 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.13.tgz#a3323b974ee4280070982b3112351bb1952a7809" 300 | integrity sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ== 301 | dependencies: 302 | "@types/react" "*" 303 | 304 | "@types/react@*", "@types/react@^17.0.39": 305 | version "17.0.39" 306 | resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.39.tgz#d0f4cde092502a6db00a1cded6e6bf2abb7633ce" 307 | integrity sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug== 308 | dependencies: 309 | "@types/prop-types" "*" 310 | "@types/scheduler" "*" 311 | csstype "^3.0.2" 312 | 313 | "@types/scheduler@*": 314 | version "0.16.2" 315 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" 316 | integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== 317 | 318 | "@vitejs/plugin-react@^2.0.1": 319 | version "2.0.1" 320 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-2.0.1.tgz#3197c01d8e4a4eb9fed829c7888c467a43aadd4e" 321 | integrity sha512-uINzNHmjrbunlFtyVkST6lY1ewSfz/XwLufG0PIqvLGnpk2nOIOa/1CACTDNcKi1/RwaCzJLmsXwm1NsUVV/NA== 322 | dependencies: 323 | "@babel/core" "^7.18.10" 324 | "@babel/plugin-transform-react-jsx" "^7.18.10" 325 | "@babel/plugin-transform-react-jsx-development" "^7.18.6" 326 | "@babel/plugin-transform-react-jsx-self" "^7.18.6" 327 | "@babel/plugin-transform-react-jsx-source" "^7.18.6" 328 | magic-string "^0.26.2" 329 | react-refresh "^0.14.0" 330 | 331 | ansi-styles@^3.2.1: 332 | version "3.2.1" 333 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 334 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 335 | dependencies: 336 | color-convert "^1.9.0" 337 | 338 | browserslist@^4.20.2: 339 | version "4.21.3" 340 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" 341 | integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== 342 | dependencies: 343 | caniuse-lite "^1.0.30001370" 344 | electron-to-chromium "^1.4.202" 345 | node-releases "^2.0.6" 346 | update-browserslist-db "^1.0.5" 347 | 348 | caniuse-lite@^1.0.30001370: 349 | version "1.0.30001376" 350 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001376.tgz#af2450833e5a06873fbb030a9556ca9461a2736d" 351 | integrity sha512-I27WhtOQ3X3v3it9gNs/oTpoE5KpwmqKR5oKPA8M0G7uMXh9Ty81Q904HpKUrM30ei7zfcL5jE7AXefgbOfMig== 352 | 353 | chalk@^2.0.0: 354 | version "2.4.2" 355 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 356 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 357 | dependencies: 358 | ansi-styles "^3.2.1" 359 | escape-string-regexp "^1.0.5" 360 | supports-color "^5.3.0" 361 | 362 | color-convert@^1.9.0: 363 | version "1.9.3" 364 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 365 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 366 | dependencies: 367 | color-name "1.1.3" 368 | 369 | color-name@1.1.3: 370 | version "1.1.3" 371 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 372 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 373 | 374 | convert-source-map@^1.7.0: 375 | version "1.8.0" 376 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" 377 | integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== 378 | dependencies: 379 | safe-buffer "~5.1.1" 380 | 381 | csstype@^3.0.2: 382 | version "3.0.11" 383 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" 384 | integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== 385 | 386 | debug@^4.1.0: 387 | version "4.3.3" 388 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 389 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 390 | dependencies: 391 | ms "2.1.2" 392 | 393 | electron-to-chromium@^1.4.202: 394 | version "1.4.219" 395 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.219.tgz#a7a672304b6aa4f376918d3f63a47f2c3906009a" 396 | integrity sha512-zoQJsXOUw0ZA0YxbjkmzBumAJRtr6je5JySuL/bAoFs0DuLiLJ+5FzRF7/ZayihxR2QcewlRZVm5QZdUhwjOgA== 397 | 398 | esbuild-android-64@0.14.54: 399 | version "0.14.54" 400 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" 401 | integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== 402 | 403 | esbuild-android-arm64@0.14.54: 404 | version "0.14.54" 405 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" 406 | integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== 407 | 408 | esbuild-darwin-64@0.14.54: 409 | version "0.14.54" 410 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" 411 | integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== 412 | 413 | esbuild-darwin-arm64@0.14.54: 414 | version "0.14.54" 415 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" 416 | integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== 417 | 418 | esbuild-freebsd-64@0.14.54: 419 | version "0.14.54" 420 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" 421 | integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== 422 | 423 | esbuild-freebsd-arm64@0.14.54: 424 | version "0.14.54" 425 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" 426 | integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== 427 | 428 | esbuild-linux-32@0.14.54: 429 | version "0.14.54" 430 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" 431 | integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== 432 | 433 | esbuild-linux-64@0.14.54: 434 | version "0.14.54" 435 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" 436 | integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== 437 | 438 | esbuild-linux-arm64@0.14.54: 439 | version "0.14.54" 440 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" 441 | integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== 442 | 443 | esbuild-linux-arm@0.14.54: 444 | version "0.14.54" 445 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" 446 | integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== 447 | 448 | esbuild-linux-mips64le@0.14.54: 449 | version "0.14.54" 450 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" 451 | integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== 452 | 453 | esbuild-linux-ppc64le@0.14.54: 454 | version "0.14.54" 455 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" 456 | integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== 457 | 458 | esbuild-linux-riscv64@0.14.54: 459 | version "0.14.54" 460 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" 461 | integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== 462 | 463 | esbuild-linux-s390x@0.14.54: 464 | version "0.14.54" 465 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" 466 | integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== 467 | 468 | esbuild-netbsd-64@0.14.54: 469 | version "0.14.54" 470 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" 471 | integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== 472 | 473 | esbuild-openbsd-64@0.14.54: 474 | version "0.14.54" 475 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" 476 | integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== 477 | 478 | esbuild-sunos-64@0.14.54: 479 | version "0.14.54" 480 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" 481 | integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== 482 | 483 | esbuild-windows-32@0.14.54: 484 | version "0.14.54" 485 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" 486 | integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== 487 | 488 | esbuild-windows-64@0.14.54: 489 | version "0.14.54" 490 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" 491 | integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== 492 | 493 | esbuild-windows-arm64@0.14.54: 494 | version "0.14.54" 495 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" 496 | integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== 497 | 498 | esbuild@^0.14.47: 499 | version "0.14.54" 500 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" 501 | integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== 502 | optionalDependencies: 503 | "@esbuild/linux-loong64" "0.14.54" 504 | esbuild-android-64 "0.14.54" 505 | esbuild-android-arm64 "0.14.54" 506 | esbuild-darwin-64 "0.14.54" 507 | esbuild-darwin-arm64 "0.14.54" 508 | esbuild-freebsd-64 "0.14.54" 509 | esbuild-freebsd-arm64 "0.14.54" 510 | esbuild-linux-32 "0.14.54" 511 | esbuild-linux-64 "0.14.54" 512 | esbuild-linux-arm "0.14.54" 513 | esbuild-linux-arm64 "0.14.54" 514 | esbuild-linux-mips64le "0.14.54" 515 | esbuild-linux-ppc64le "0.14.54" 516 | esbuild-linux-riscv64 "0.14.54" 517 | esbuild-linux-s390x "0.14.54" 518 | esbuild-netbsd-64 "0.14.54" 519 | esbuild-openbsd-64 "0.14.54" 520 | esbuild-sunos-64 "0.14.54" 521 | esbuild-windows-32 "0.14.54" 522 | esbuild-windows-64 "0.14.54" 523 | esbuild-windows-arm64 "0.14.54" 524 | 525 | escalade@^3.1.1: 526 | version "3.1.1" 527 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 528 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 529 | 530 | escape-string-regexp@^1.0.5: 531 | version "1.0.5" 532 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 533 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 534 | 535 | fsevents@~2.3.2: 536 | version "2.3.2" 537 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 538 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 539 | 540 | function-bind@^1.1.1: 541 | version "1.1.1" 542 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 543 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 544 | 545 | gensync@^1.0.0-beta.2: 546 | version "1.0.0-beta.2" 547 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 548 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 549 | 550 | globals@^11.1.0: 551 | version "11.12.0" 552 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 553 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 554 | 555 | has-flag@^3.0.0: 556 | version "3.0.0" 557 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 558 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 559 | 560 | has@^1.0.3: 561 | version "1.0.3" 562 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 563 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 564 | dependencies: 565 | function-bind "^1.1.1" 566 | 567 | is-core-module@^2.9.0: 568 | version "2.10.0" 569 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" 570 | integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== 571 | dependencies: 572 | has "^1.0.3" 573 | 574 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 575 | version "4.0.0" 576 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 577 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 578 | 579 | jsesc@^2.5.1: 580 | version "2.5.2" 581 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 582 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 583 | 584 | json5@^2.2.1: 585 | version "2.2.1" 586 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" 587 | integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== 588 | 589 | loose-envify@^1.1.0: 590 | version "1.4.0" 591 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 592 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 593 | dependencies: 594 | js-tokens "^3.0.0 || ^4.0.0" 595 | 596 | magic-string@^0.26.2: 597 | version "0.26.2" 598 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.2.tgz#5331700e4158cd6befda738bb6b0c7b93c0d4432" 599 | integrity sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A== 600 | dependencies: 601 | sourcemap-codec "^1.4.8" 602 | 603 | ms@2.1.2: 604 | version "2.1.2" 605 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 606 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 607 | 608 | nanoid@^3.3.4: 609 | version "3.3.4" 610 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" 611 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 612 | 613 | node-releases@^2.0.6: 614 | version "2.0.6" 615 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" 616 | integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== 617 | 618 | object-assign@^4.1.1: 619 | version "4.1.1" 620 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 621 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 622 | 623 | path-parse@^1.0.7: 624 | version "1.0.7" 625 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 626 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 627 | 628 | picocolors@^1.0.0: 629 | version "1.0.0" 630 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 631 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 632 | 633 | postcss@^8.4.16: 634 | version "8.4.16" 635 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" 636 | integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== 637 | dependencies: 638 | nanoid "^3.3.4" 639 | picocolors "^1.0.0" 640 | source-map-js "^1.0.2" 641 | 642 | react-dom@^17.0.2: 643 | version "17.0.2" 644 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" 645 | integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== 646 | dependencies: 647 | loose-envify "^1.1.0" 648 | object-assign "^4.1.1" 649 | scheduler "^0.20.2" 650 | 651 | react-refresh@^0.14.0: 652 | version "0.14.0" 653 | resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" 654 | integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== 655 | 656 | react@^17.0.2: 657 | version "17.0.2" 658 | resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" 659 | integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== 660 | dependencies: 661 | loose-envify "^1.1.0" 662 | object-assign "^4.1.1" 663 | 664 | resolve@^1.22.1: 665 | version "1.22.1" 666 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 667 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 668 | dependencies: 669 | is-core-module "^2.9.0" 670 | path-parse "^1.0.7" 671 | supports-preserve-symlinks-flag "^1.0.0" 672 | 673 | "rollup@>=2.75.6 <2.77.0 || ~2.77.0": 674 | version "2.77.3" 675 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12" 676 | integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== 677 | optionalDependencies: 678 | fsevents "~2.3.2" 679 | 680 | safe-buffer@~5.1.1: 681 | version "5.1.2" 682 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 683 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 684 | 685 | scheduler@^0.20.2: 686 | version "0.20.2" 687 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" 688 | integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== 689 | dependencies: 690 | loose-envify "^1.1.0" 691 | object-assign "^4.1.1" 692 | 693 | semver@^6.3.0: 694 | version "6.3.0" 695 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 696 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 697 | 698 | source-map-js@^1.0.2: 699 | version "1.0.2" 700 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 701 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 702 | 703 | sourcemap-codec@^1.4.8: 704 | version "1.4.8" 705 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 706 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 707 | 708 | supports-color@^5.3.0: 709 | version "5.5.0" 710 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 711 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 712 | dependencies: 713 | has-flag "^3.0.0" 714 | 715 | supports-preserve-symlinks-flag@^1.0.0: 716 | version "1.0.0" 717 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 718 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 719 | 720 | to-fast-properties@^2.0.0: 721 | version "2.0.0" 722 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 723 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 724 | 725 | typescript@^4.6.2: 726 | version "4.6.2" 727 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4" 728 | integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg== 729 | 730 | update-browserslist-db@^1.0.5: 731 | version "1.0.5" 732 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" 733 | integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== 734 | dependencies: 735 | escalade "^3.1.1" 736 | picocolors "^1.0.0" 737 | 738 | vite@^3.0.7: 739 | version "3.0.7" 740 | resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.7.tgz#f1e379857e9c5d652126f8b20d371e1365eb700f" 741 | integrity sha512-dILhvKba1mbP1wCezVQx/qhEK7/+jVn9ciadEcyKMMhZpsuAi/eWZfJRMkmYlkSFG7Qq9NvJbgFq4XOBxugJsA== 742 | dependencies: 743 | esbuild "^0.14.47" 744 | postcss "^8.4.16" 745 | resolve "^1.22.1" 746 | rollup ">=2.75.6 <2.77.0 || ~2.77.0" 747 | optionalDependencies: 748 | fsevents "~2.3.2" 749 | --------------------------------------------------------------------------------