├── frontend ├── package.json.md5 ├── src │ ├── vite-env.d.ts │ ├── style.css │ ├── assets │ │ ├── images │ │ │ ├── icon.ico │ │ │ ├── icon.png │ │ │ └── arizona.png │ │ └── fonts │ │ │ └── Gilroy-SemiBold.ttf │ ├── app.css │ ├── config.ts │ └── main.ts ├── wailsjs │ ├── go │ │ └── main │ │ │ ├── App.d.ts │ │ │ └── App.js │ └── runtime │ │ ├── package.json │ │ ├── runtime.js │ │ └── runtime.d.ts ├── package.json ├── tsconfig.json ├── index.html └── package-lock.json ├── .gitignore ├── .gitattributes ├── wails.json ├── query.go ├── README.md ├── main.go ├── config.go ├── go.mod ├── servers.go ├── app.go └── go.sum /frontend/package.json.md5: -------------------------------------------------------------------------------- 1 | 1c26f79dedda9078a050559eaaf81bf1 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | frontend/dist 3 | frontend/node_modules -------------------------------------------------------------------------------- /frontend/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /frontend/src/style.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaposcripts/arizona-rp-alternative-launcher/HEAD/frontend/src/style.css -------------------------------------------------------------------------------- /frontend/src/assets/images/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaposcripts/arizona-rp-alternative-launcher/HEAD/frontend/src/assets/images/icon.ico -------------------------------------------------------------------------------- /frontend/src/assets/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaposcripts/arizona-rp-alternative-launcher/HEAD/frontend/src/assets/images/icon.png -------------------------------------------------------------------------------- /frontend/src/assets/images/arizona.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaposcripts/arizona-rp-alternative-launcher/HEAD/frontend/src/assets/images/arizona.png -------------------------------------------------------------------------------- /frontend/src/assets/fonts/Gilroy-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chaposcripts/arizona-rp-alternative-launcher/HEAD/frontend/src/assets/fonts/Gilroy-SemiBold.ttf -------------------------------------------------------------------------------- /wails.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://wails.io/schemas/config.v2.json", 3 | "name": "go-arz-launcher", 4 | "outputfilename": "go-arz-launcher", 5 | "frontend:install": "npm install", 6 | "frontend:build": "npm run build", 7 | "frontend:dev:watcher": "npm run dev", 8 | "frontend:dev:serverUrl": "auto", 9 | "author": { 10 | "name": "Dmitry", 11 | "email": "aoufchapo@gmail.com" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /frontend/wailsjs/go/main/App.d.ts: -------------------------------------------------------------------------------- 1 | // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL 2 | // This file is automatically generated. DO NOT EDIT 3 | 4 | export function ReadConfig():Promise; 5 | 6 | export function SaveConfig(arg1:string):Promise; 7 | 8 | export function StartGame(arg1:string,arg2:string,arg3:Array):Promise; 9 | 10 | export function UpdateServerInfo(arg1:string):Promise; 11 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "tsc && vite build", 8 | "preview": "vite preview" 9 | }, 10 | "devDependencies": { 11 | "typescript": "^4.5.4", 12 | "vite": "^3.0.7" 13 | }, 14 | "dependencies": { 15 | "crypto": "^1.0.1", 16 | "crypto-js": "^4.2.0", 17 | "reactive-json-file": "^2.0.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /query.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | 6 | sampquery "github.com/Southclaws/go-samp-query" 7 | ) 8 | 9 | func getServerQueryInfo(host string, port int) (sampquery.Server, error) { 10 | var result sampquery.Server 11 | query, err := sampquery.NewQuery(host) 12 | if err != nil { 13 | return result, err 14 | } 15 | var ctx context.Context 16 | result, err = query.GetInfo(ctx, true) 17 | if err != nil { 18 | return result, err 19 | } 20 | return result, nil 21 | } 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Alternative Arizona RP Launcher 2 | ## Installation 3 | 1. Donwload [latest release](https://github.com/chaposcripts/arizona-rp-alternative-launcher/releases) 4 | 2. Unzip `Alternative Launcher.exe` 5 | 3. Run `Alternative Launcher.exe` 6 | 7 | ## Building 8 | 1. `git clone https://github.com/chaposcripts/arizona-rp-alternative-launcher` 9 | 2. `cd arizona-rp-alternative-launcher` 10 | 3. `wails build` 11 | 12 | ![image](https://github.com/user-attachments/assets/b5ef9d90-21d0-49c1-a718-f6d07cd30c9e) 13 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": [ 7 | "ESNext", 8 | "DOM" 9 | ], 10 | "moduleResolution": "Node", 11 | "strict": true, 12 | "sourceMap": true, 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "esModuleInterop": true, 16 | "noEmit": true, 17 | "noUnusedLocals": true, 18 | "noUnusedParameters": true, 19 | "noImplicitReturns": true, 20 | "skipLibCheck": true 21 | }, 22 | "include": [ 23 | "src" 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /frontend/wailsjs/go/main/App.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL 3 | // This file is automatically generated. DO NOT EDIT 4 | 5 | export function ReadConfig() { 6 | return window['go']['main']['App']['ReadConfig'](); 7 | } 8 | 9 | export function SaveConfig(arg1) { 10 | return window['go']['main']['App']['SaveConfig'](arg1); 11 | } 12 | 13 | export function StartGame(arg1, arg2, arg3) { 14 | return window['go']['main']['App']['StartGame'](arg1, arg2, arg3); 15 | } 16 | 17 | export function UpdateServerInfo(arg1) { 18 | return window['go']['main']['App']['UpdateServerInfo'](arg1); 19 | } 20 | -------------------------------------------------------------------------------- /frontend/wailsjs/runtime/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@wailsapp/runtime", 3 | "version": "2.0.0", 4 | "description": "Wails Javascript runtime library", 5 | "main": "runtime.js", 6 | "types": "runtime.d.ts", 7 | "scripts": { 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/wailsapp/wails.git" 12 | }, 13 | "keywords": [ 14 | "Wails", 15 | "Javascript", 16 | "Go" 17 | ], 18 | "author": "Lea Anthony ", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/wailsapp/wails/issues" 22 | }, 23 | "homepage": "https://github.com/wailsapp/wails#readme" 24 | } 25 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "embed" 5 | 6 | "github.com/wailsapp/wails/v2" 7 | "github.com/wailsapp/wails/v2/pkg/options" 8 | "github.com/wailsapp/wails/v2/pkg/options/assetserver" 9 | ) 10 | 11 | //go:embed all:frontend/dist 12 | var assets embed.FS 13 | 14 | func main() { 15 | app := NewApp() 16 | err := wails.Run(&options.App{ 17 | Title: "AltLauncher // t.me/chaposcripts", 18 | Width: 376, 19 | Height: 440, 20 | DisableResize: true, 21 | AssetServer: &assetserver.Options{ 22 | Assets: assets, 23 | }, 24 | BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1}, 25 | OnStartup: app.startup, 26 | Bind: []interface{}{ 27 | app, 28 | }, 29 | }) 30 | 31 | if err != nil { 32 | println("Error:", err.Error()) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /frontend/src/app.css: -------------------------------------------------------------------------------- 1 | #logo { 2 | display: block; 3 | width: 50%; 4 | height: 50%; 5 | margin: auto; 6 | padding: 10% 0 0; 7 | background-position: center; 8 | background-repeat: no-repeat; 9 | background-size: 100% 100%; 10 | background-origin: content-box; 11 | } 12 | 13 | .result { 14 | height: 20px; 15 | line-height: 20px; 16 | margin: 1.5rem auto; 17 | } 18 | 19 | .input-box .btn { 20 | width: 60px; 21 | height: 30px; 22 | line-height: 30px; 23 | border-radius: 3px; 24 | border: none; 25 | margin: 0 0 0 20px; 26 | padding: 0 8px; 27 | cursor: pointer; 28 | } 29 | 30 | .input-box .btn:hover { 31 | background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); 32 | color: #333333; 33 | } 34 | 35 | .input-box .input { 36 | border: none; 37 | border-radius: 3px; 38 | outline: none; 39 | height: 30px; 40 | line-height: 30px; 41 | padding: 0 10px; 42 | background-color: rgba(240, 240, 240, 1); 43 | -webkit-font-smoothing: antialiased; 44 | } 45 | 46 | .input-box .input:hover { 47 | border: none; 48 | background-color: rgba(255, 255, 255, 1); 49 | } 50 | 51 | .input-box .input:focus { 52 | border: none; 53 | background-color: rgba(255, 255, 255, 1); 54 | } -------------------------------------------------------------------------------- /config.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | type ConfigParam struct { 4 | WideScreen bool `json:"wideScreen"` 5 | AutoLogin bool `json:"autoLogin"` 6 | Preload bool `json:"preload"` 7 | Windowed bool `json:"windowed"` 8 | Seasons bool `json:"seasons"` 9 | Graphics bool `json:"graphics"` 10 | ShitPc bool `json:"shitPc"` 11 | CefDirtyRects bool `json:"cefDirtyRects"` 12 | AuthCef bool `json:"authCef"` 13 | Grass bool `json:"grass"` 14 | OldResolution bool `json:"oldResolution"` 15 | HdrResolution bool `json:"hdrResolution"` 16 | } 17 | 18 | type Config struct { 19 | Name string `json:"name"` 20 | Path string `json:"path"` 21 | Memory int `json:"memory"` 22 | SelectedServer int `json:"selectedServer"` 23 | Params ConfigParam `json:"params"` 24 | } 25 | 26 | /* 27 | var defaultConfig Config = Config{ 28 | Name: "", 29 | Path: "", 30 | Memory: 4096, 31 | SelectedServer: 1, 32 | Params: ConfigParam{ 33 | WideScreen: true, 34 | AutoLogin: false, 35 | Preload: true, 36 | Windowed: false, 37 | Seasons: false, 38 | Graphics: false, 39 | ShitPc: false, 40 | CefDirtyRects: false, 41 | AuthCef: true, 42 | Grass: false, 43 | OldResolution: false, 44 | HdrResolution: false, 45 | }, 46 | } 47 | */ 48 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module go-arz-launcher 2 | 3 | go 1.21 4 | 5 | toolchain go1.21.0 6 | 7 | require ( 8 | github.com/Southclaws/go-samp-query v1.2.1 9 | github.com/wailsapp/wails/v2 v2.9.2 10 | ) 11 | 12 | require ( 13 | github.com/bep/debounce v1.2.1 // indirect 14 | github.com/go-ole/go-ole v1.2.6 // indirect 15 | github.com/godbus/dbus/v5 v5.1.0 // indirect 16 | github.com/google/uuid v1.3.0 // indirect 17 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect 18 | github.com/labstack/echo/v4 v4.10.2 // indirect 19 | github.com/labstack/gommon v0.4.0 // indirect 20 | github.com/leaanthony/go-ansi-parser v1.6.0 // indirect 21 | github.com/leaanthony/gosod v1.0.3 // indirect 22 | github.com/leaanthony/slicer v1.6.0 // indirect 23 | github.com/leaanthony/u v1.1.0 // indirect 24 | github.com/mattn/go-colorable v0.1.13 // indirect 25 | github.com/mattn/go-isatty v0.0.19 // indirect 26 | github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect 27 | github.com/pkg/errors v0.9.1 // indirect 28 | github.com/rivo/uniseg v0.4.4 // indirect 29 | github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca // indirect 30 | github.com/samber/lo v1.38.1 // indirect 31 | github.com/tkrajina/go-reflector v0.5.6 // indirect 32 | github.com/valyala/bytebufferpool v1.0.0 // indirect 33 | github.com/valyala/fasttemplate v1.2.2 // indirect 34 | github.com/wailsapp/go-webview2 v1.0.16 // indirect 35 | github.com/wailsapp/mimetype v1.4.1 // indirect 36 | golang.org/x/crypto v0.23.0 // indirect 37 | golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect 38 | golang.org/x/net v0.25.0 // indirect 39 | golang.org/x/sys v0.20.0 // indirect 40 | golang.org/x/text v0.15.0 // indirect 41 | ) 42 | 43 | // replace github.com/wailsapp/wails/v2 v2.9.2 => C:\Users\amids\go\pkg\mod 44 | -------------------------------------------------------------------------------- /servers.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "io" 7 | "net/http" 8 | "os" 9 | "os/user" 10 | "sort" 11 | ) 12 | 13 | type ServerPlotPoint struct { 14 | Online int `json:"online"` 15 | Time int `json:"time"` 16 | } 17 | 18 | type Server struct { 19 | Number int `json:"number"` 20 | Name string `json:"name"` 21 | IP string `json:"ip"` 22 | Port int `json:"port"` 23 | Online int `json:"online"` 24 | MaxPlayers int `json:"maxplayers"` 25 | // Password bool `json:"password"` 26 | // VK string `json:"vk"` 27 | // TG string `json:"tg"` 28 | // Inst string `json:"inst"` 29 | Icon string `json:"icon"` 30 | // AdditionalIps []string `json:"additionalIps"` 31 | // DonateMultiplier int `json:"donateMultiplier"` 32 | // ExperienceMultiplier int `json:"experienceMultiplier"` 33 | // PlotPoints []ServerPlotPoint `json:"plotPoints"` 34 | } 35 | 36 | type ArizonaServerInfo struct { 37 | Arizona []Server `json:"arizona"` 38 | ArizonaMobile []Server `json:"arizonaMobile"` 39 | // ArizonaStaging []Server `json:"arizona_staging"` 40 | // Rodina []Server `json:"rodina"` 41 | // Village []Server `json:"village"` 42 | // Arizonav []Server `json:"arizonav"` 43 | } 44 | 45 | const ( 46 | ArizonaServersListURL string = "https://api.arizona-five.com/launcher/servers" 47 | ) 48 | 49 | func LoadServers() (ArizonaServerInfo, error) { 50 | var servers ArizonaServerInfo 51 | var err error 52 | var jsonBytes []byte 53 | var listFileReaded = false 54 | winUser, err := user.Current() 55 | if err == nil { 56 | listPath := winUser.HomeDir + "\\Documents\\alt-launcher-servers.json" 57 | fmt.Println("Custom servers list path=", listPath) 58 | if _, err := os.Stat(listPath); err == nil { 59 | jsonBytes, err = os.ReadFile(listPath) 60 | fmt.Println("List file:", string(jsonBytes), err) 61 | if err == nil { 62 | listFileReaded = true 63 | fmt.Println("Reading servers list from file") 64 | } 65 | } 66 | } 67 | if !listFileReaded { 68 | response, err := http.Get(ArizonaServersListURL) 69 | if err != nil { 70 | return servers, err 71 | } 72 | jsonBytes, err = io.ReadAll(response.Body) 73 | if err != nil { 74 | return servers, err 75 | } 76 | } 77 | // fmt.Println(string(jsonBytes)) 78 | if err == nil { 79 | err = json.Unmarshal(jsonBytes, &servers) 80 | if err == nil { 81 | sort.Slice(servers.Arizona, func(a, b int) bool { 82 | return servers.Arizona[a].Number < servers.Arizona[b].Number 83 | }) 84 | } 85 | } 86 | 87 | return servers, err 88 | } 89 | -------------------------------------------------------------------------------- /frontend/src/config.ts: -------------------------------------------------------------------------------- 1 | import { ReadConfig, SaveConfig } from '../wailsjs/go/main/App'; 2 | export type Config = { 3 | name: string, 4 | path: string, 5 | memory: number, 6 | selectedServer: number, 7 | pass: string, 8 | params: { 9 | wideScreen: boolean, 10 | autoLogin: boolean, 11 | preload: boolean, 12 | windowed: boolean, 13 | seasons: boolean, 14 | graphics: boolean, 15 | shitPc: boolean, 16 | cefDirtyRects: boolean, 17 | authCef: boolean, 18 | grass: boolean, 19 | oldResolution: boolean, 20 | hdrResolution: boolean, 21 | }, 22 | } 23 | ; 24 | export var config: Config = { 25 | name: 'Nick_Name', 26 | path: '', 27 | memory: 4096, 28 | selectedServer: 1, 29 | pass: '', 30 | params: { 31 | wideScreen: false, 32 | autoLogin: false, 33 | preload: false, 34 | windowed: false, 35 | seasons: false, 36 | graphics: false, 37 | shitPc: false, 38 | cefDirtyRects: false, 39 | authCef: false, 40 | grass: false, 41 | oldResolution: false, 42 | hdrResolution: false, 43 | } 44 | } 45 | 46 | export const parameterName: Record = { 47 | "windowed": "window", 48 | "autoLogin": "x", 49 | "wideScreen": "widescreen", 50 | "preload": "ldo", 51 | "seasons": "seasons", 52 | "graphics": "graphics", 53 | "shitPc": "t", 54 | "cefDirtyRects": "cef_dirty_rects", 55 | "authCef": "auth_cef_enable", 56 | "grass": "enable_grass", 57 | "oldResolution": "16bpp", 58 | "hdrResolution": "allow_hdr" 59 | } 60 | 61 | export function loadConfig() { 62 | ReadConfig().then((cfg) => { 63 | console.log('Config loaded:', cfg); 64 | config = JSON.parse(cfg) as Config; 65 | // @ts-ignore 66 | document.getElementById('name').value = config.name; 67 | // @ts-ignore 68 | document.getElementById('memory').value = config.memory; 69 | // @ts-ignore 70 | document.getElementById('path').value = config.path; 71 | // @ts-ignore 72 | document.getElementById('pass').value = config.pass ?? ''; 73 | 74 | // @ts-ignore 75 | for (const [k, v] of Object.entries(config.params)) document.getElementById(k).checked = v; 76 | }); 77 | } 78 | 79 | export function saveConfig() { 80 | // @ts-ignore 81 | config.name = document.getElementById('name').value; 82 | // @ts-ignore 83 | config.memory = document.getElementById('memory').value; 84 | // @ts-ignore 85 | config.path = document.getElementById('path').value; 86 | // @ts-ignore 87 | config.pass = document.getElementById('pass').value; 88 | 89 | 90 | for (const name of Object.keys(parameterName)) { 91 | // @ts-ignore 92 | config.params[name] = document.getElementById(name).checked ?? false; 93 | } 94 | console.log(config); 95 | console.log(Object.keys(config.params), JSON.stringify(config)); 96 | SaveConfig(JSON.stringify(config)); 97 | } 98 | -------------------------------------------------------------------------------- /app.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "os" 7 | "os/exec" 8 | "os/user" 9 | "strings" 10 | 11 | runtime "github.com/wailsapp/wails/v2/pkg/runtime" 12 | ) 13 | 14 | type App struct { 15 | ctx context.Context 16 | } 17 | 18 | func NewApp() *App { 19 | return &App{} 20 | } 21 | 22 | var CONFIG_FILE_PATH string 23 | 24 | func (a *App) startup(ctx context.Context) { 25 | a.ctx = ctx 26 | winUser, err := user.Current() 27 | if err == nil { 28 | CONFIG_FILE_PATH = winUser.HomeDir + "\\Documents\\alt-launcher-config.json" 29 | fmt.Println("CONFIG_FILE_PATH=", CONFIG_FILE_PATH) 30 | } else { 31 | runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ 32 | Title: "Ошибка", 33 | Message: "Ошибка получения папки с настройками:\n" + err.Error(), 34 | Type: runtime.ErrorDialog, 35 | }) 36 | } 37 | //fmt.Sprintf("%s\\alt-launcher-config.json", os.Use()) 38 | runtime.EventsOn(ctx, "servers:request", func(args ...interface{}) { 39 | go func() { 40 | servers, err := LoadServers() 41 | if err != nil { 42 | runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ 43 | Title: "Ошибка", 44 | Message: "Ошибка получения списка серверов:\n" + err.Error(), 45 | Type: runtime.ErrorDialog, 46 | }) 47 | return 48 | } 49 | runtime.EventsEmit(ctx, "servers:update", servers.Arizona, servers.ArizonaMobile) 50 | }() 51 | }) 52 | 53 | // Game path 54 | runtime.EventsOn(ctx, "settings:requestFileDialog", func(args ...interface{}) { 55 | path, err := runtime.OpenDirectoryDialog(ctx, runtime.OpenDialogOptions{}) 56 | if err != nil { 57 | runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ 58 | Title: "Ошибка", 59 | Message: "Ошибка при открытии диалога: " + err.Error(), 60 | Type: runtime.ErrorDialog, 61 | }) 62 | return 63 | } 64 | if len(path) > 0 { 65 | gamePath := fmt.Sprintf("%s\\gta_sa.exe", path) 66 | _, err := os.Stat(gamePath) 67 | if err != nil { 68 | runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ 69 | Title: "Error", 70 | Message: "Файл \"gta_sa.exe\" не найден в \"" + path + "\"", 71 | Type: runtime.ErrorDialog, 72 | }) 73 | return 74 | } 75 | runtime.EventsEmit(ctx, "settings:fileDialogPathSelected", path) 76 | } 77 | }) 78 | } 79 | 80 | func (a *App) StartGame(name string, gamePath string, parameters []string) error { 81 | if len(name) < 3 || len(name) > 22 { 82 | runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{ 83 | Title: "Ошибка запуска игры", 84 | Message: "Некоррекнтный ник-нейм", 85 | Type: runtime.ErrorDialog, 86 | }) 87 | return nil 88 | } 89 | var batFile = fmt.Sprintf("%s\\%s", gamePath, "alternative-launcher.bat") 90 | var batText = fmt.Sprintf("@echo off\ncd /D %%~dp0\nstart gta_sa.exe %s\nexit", strings.Join(parameters, " ")) 91 | fmt.Println("[CREATING BAT]:", batText) 92 | err := os.WriteFile(batFile, []byte(batText), 0644) 93 | if err != nil { 94 | runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{ 95 | Title: "Ошибка запуска игры", 96 | Message: fmt.Sprintf("Ошибка: %s", err.Error()), 97 | Type: runtime.ErrorDialog, 98 | }) 99 | return err 100 | } 101 | cmd := exec.Command(batFile).Run() 102 | fmt.Println(cmd) 103 | return nil 104 | } 105 | 106 | func (a *App) ReadConfig() string { 107 | bytes, err := os.ReadFile(CONFIG_FILE_PATH) 108 | if err != nil { 109 | runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{ 110 | Title: "Ваши настройки не были загружены", 111 | Message: fmt.Sprintf("Произошла ошибка при чтении файла настроек: %s\nБыли загружены стандартные настройки.", err.Error()), 112 | Type: runtime.InfoDialog, 113 | }) 114 | return "" 115 | } 116 | return string(bytes) 117 | } 118 | 119 | func (a *App) SaveConfig(json string) { 120 | fmt.Println("SAVE CONFIG:", json) 121 | err := os.WriteFile(CONFIG_FILE_PATH, []byte(json), 0644) 122 | if err != nil { 123 | runtime.MessageDialog(a.ctx, runtime.MessageDialogOptions{ 124 | Title: "Ваши настройки не были сохранены", 125 | Message: "Ошибка при сохранении настроек: " + err.Error(), 126 | Type: runtime.ErrorDialog, 127 | }) 128 | } 129 | } 130 | 131 | func (a *App) UpdateServerInfo(host string) { 132 | server, err := getServerQueryInfo(host, 7777) 133 | if err == nil { 134 | runtime.EventsEmit(a.ctx, "server:update_players", host, server.Players, server.MaxPlayers) 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | go-arz-launcher 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 |
50 |
51 | 52 | 53 |
54 |
55 | 56 | 57 |
58 |
59 | 60 | 61 |
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 | -------------------------------------------------------------------------------- /frontend/src/main.ts: -------------------------------------------------------------------------------- 1 | import './style.css'; 2 | import './app.css'; 3 | import { EventsOn, EventsEmit } from '../wailsjs/runtime' 4 | import { config, loadConfig, saveConfig, parameterName } from './config'; 5 | import { StartGame, UpdateServerInfo } from '../wailsjs/go/main/App'; 6 | 7 | type Server = { 8 | number: number, 9 | name: string, 10 | ip: string, 11 | port: number, 12 | online: number, 13 | maxplayers: number, 14 | password: boolean, 15 | vk: string, 16 | tg: string, 17 | inst: string, 18 | icon: string, 19 | additionalIps: string[], 20 | donateMultiplier: number, 21 | experienceMultiplier: number, 22 | plotPoints: {online: number, time: number}[] 23 | } 24 | 25 | var serversList: Server[] = []; 26 | 27 | function createServer(server: Server, id: number, isSelected = false, hideNumber = false) { 28 | const list = document.getElementById('servers-list'); 29 | const serverDiv = document.createElement('div'); 30 | serverDiv.classList.add('server'); 31 | if (isSelected) serverDiv.classList.add('server-selected'); 32 | serverDiv.id = id.toString(); 33 | serverDiv.onclick = () => { 34 | document.querySelectorAll('.server').forEach((el) => { 35 | el.classList.remove('server-selected'); 36 | }); 37 | serverDiv.classList.add('server-selected'); 38 | UpdateServerInfo(server.ip); 39 | config.selectedServer = server.number; 40 | saveConfig(); 41 | }; 42 | const serverLogo = document.createElement('img'); 43 | serverLogo.classList.add('server-logo') 44 | serverLogo.src = server.icon; 45 | 46 | 47 | const serverId = document.createElement('a'); 48 | serverId.classList.add('server-id'); 49 | serverId.textContent = `#${server.number}`; 50 | 51 | const serverName = document.createElement('a'); 52 | serverName.classList.add('server-name'); 53 | serverName.textContent = server.name; 54 | 55 | const serverPlayers = document.createElement('a'); 56 | serverPlayers.id = `players-count-${server.number}` 57 | serverPlayers.classList.add('server-players'); 58 | serverPlayers.textContent = `${server.online}/${server.maxplayers}`; 59 | 60 | serverDiv.appendChild(serverLogo); 61 | if (!hideNumber) 62 | serverDiv.appendChild(serverId); 63 | serverDiv.appendChild(serverName); 64 | serverDiv.appendChild(serverPlayers); 65 | list?.appendChild(serverDiv); 66 | } 67 | 68 | addEventListener('DOMContentLoaded', () => { 69 | loadConfig(); 70 | EventsEmit('servers:request'); 71 | setInterval(() => { 72 | console.log('Requesting servers update...'); 73 | EventsEmit('servers:request'); 74 | }, 10000); 75 | document.querySelectorAll('input[type=checkbox]').forEach((el) => el.addEventListener('click', () => { 76 | //@ts-ignore 77 | config.params[el.id] = el.checked 78 | saveConfig(); 79 | })); 80 | //@ts-ignore 81 | document.getElementById('button-settings')?.addEventListener('click', () => document.getElementById('dialog-settings')?.showModal()); 82 | const nameInput = document.getElementById('name'); 83 | //@ts-ignore 84 | nameInput.addEventListener('input', () => config.name = nameInput.value); 85 | document.getElementById('path')?.addEventListener('click', () => EventsEmit('settings:requestFileDialog')) 86 | document.getElementById('button-play')?.addEventListener('click', () => { 87 | saveConfig(); 88 | const selectedServer = serversList.find((s) => s.number == config.selectedServer) ?? serversList[0]; 89 | const params: string[] = [ 90 | '-c', 91 | '-arizona', 92 | `-h ${selectedServer.ip}`, 93 | `-p ${selectedServer.port}`, 94 | `-n ${config.name}`, 95 | `-mem ${config.memory.toString().length > 0 ? config.memory : '2048'}`, 96 | '-referrer', 97 | '-userId undefined', 98 | config.pass.length > 0 ? `-z ${config.pass}` : '', 99 | ]; 100 | for (const [param, value] of Object.entries(config.params)) { 101 | if (value) params.push(`-${parameterName[param] ?? "-UNKNOWN_" + param}`); 102 | console.log(param, value); 103 | } 104 | console.log(config) 105 | console.log(`Starting: ${params.join(' ')}`); 106 | 107 | StartGame(config.name, config.path, params); 108 | }); 109 | 110 | loadConfig(); 111 | }) 112 | 113 | EventsOn('settings:fileDialogPathSelected', (path: string) => { 114 | config.path = path; 115 | // @ts-ignore 116 | document.getElementById('path').value = path; 117 | }); 118 | 119 | EventsOn('servers:update', (servers: Server[], mobileServers: Server[]) => { 120 | console.log('servers:update'); 121 | const scrollAfterCreation = serversList.length == 0; 122 | 123 | mobileServers.sort((a, b) => a.name.length - b.name.length).forEach((ms) => { 124 | ms.number += servers.length; 125 | servers.push(ms) 126 | }); 127 | 128 | serversList = servers; 129 | // alert(servers); 130 | servers.sort((a, b) => a.number - b.number).forEach((server) => { 131 | document.getElementById(server.number.toString())?.remove(); 132 | createServer(server, server.number, config.selectedServer == server.number, server.number > servers.length - mobileServers.length); 133 | }); 134 | //@ts-ignore 135 | if (scrollAfterCreation) document.getElementById('servers-list').scrollTop = (config.selectedServer - 1) * 42 136 | }); 137 | 138 | EventsOn('server:update_players', (host: string, players: number, maxplayers: number) => { 139 | const server = serversList.find((s) => s.ip == host); 140 | if (server) { 141 | const playersCount = document.getElementById(`players-count-${server.number}`); 142 | if (playersCount) playersCount.textContent = `${players}/${maxplayers}`; 143 | } 144 | console.log('server:update_players', host, players, maxplayers); 145 | }) -------------------------------------------------------------------------------- /frontend/wailsjs/runtime/runtime.js: -------------------------------------------------------------------------------- 1 | /* 2 | _ __ _ __ 3 | | | / /___ _(_) /____ 4 | | | /| / / __ `/ / / ___/ 5 | | |/ |/ / /_/ / / (__ ) 6 | |__/|__/\__,_/_/_/____/ 7 | The electron alternative for Go 8 | (c) Lea Anthony 2019-present 9 | */ 10 | 11 | export function LogPrint(message) { 12 | window.runtime.LogPrint(message); 13 | } 14 | 15 | export function LogTrace(message) { 16 | window.runtime.LogTrace(message); 17 | } 18 | 19 | export function LogDebug(message) { 20 | window.runtime.LogDebug(message); 21 | } 22 | 23 | export function LogInfo(message) { 24 | window.runtime.LogInfo(message); 25 | } 26 | 27 | export function LogWarning(message) { 28 | window.runtime.LogWarning(message); 29 | } 30 | 31 | export function LogError(message) { 32 | window.runtime.LogError(message); 33 | } 34 | 35 | export function LogFatal(message) { 36 | window.runtime.LogFatal(message); 37 | } 38 | 39 | export function EventsOnMultiple(eventName, callback, maxCallbacks) { 40 | return window.runtime.EventsOnMultiple(eventName, callback, maxCallbacks); 41 | } 42 | 43 | export function EventsOn(eventName, callback) { 44 | return EventsOnMultiple(eventName, callback, -1); 45 | } 46 | 47 | export function EventsOff(eventName, ...additionalEventNames) { 48 | return window.runtime.EventsOff(eventName, ...additionalEventNames); 49 | } 50 | 51 | export function EventsOnce(eventName, callback) { 52 | return EventsOnMultiple(eventName, callback, 1); 53 | } 54 | 55 | export function EventsEmit(eventName) { 56 | let args = [eventName].slice.call(arguments); 57 | return window.runtime.EventsEmit.apply(null, args); 58 | } 59 | 60 | export function WindowReload() { 61 | window.runtime.WindowReload(); 62 | } 63 | 64 | export function WindowReloadApp() { 65 | window.runtime.WindowReloadApp(); 66 | } 67 | 68 | export function WindowSetAlwaysOnTop(b) { 69 | window.runtime.WindowSetAlwaysOnTop(b); 70 | } 71 | 72 | export function WindowSetSystemDefaultTheme() { 73 | window.runtime.WindowSetSystemDefaultTheme(); 74 | } 75 | 76 | export function WindowSetLightTheme() { 77 | window.runtime.WindowSetLightTheme(); 78 | } 79 | 80 | export function WindowSetDarkTheme() { 81 | window.runtime.WindowSetDarkTheme(); 82 | } 83 | 84 | export function WindowCenter() { 85 | window.runtime.WindowCenter(); 86 | } 87 | 88 | export function WindowSetTitle(title) { 89 | window.runtime.WindowSetTitle(title); 90 | } 91 | 92 | export function WindowFullscreen() { 93 | window.runtime.WindowFullscreen(); 94 | } 95 | 96 | export function WindowUnfullscreen() { 97 | window.runtime.WindowUnfullscreen(); 98 | } 99 | 100 | export function WindowIsFullscreen() { 101 | return window.runtime.WindowIsFullscreen(); 102 | } 103 | 104 | export function WindowGetSize() { 105 | return window.runtime.WindowGetSize(); 106 | } 107 | 108 | export function WindowSetSize(width, height) { 109 | window.runtime.WindowSetSize(width, height); 110 | } 111 | 112 | export function WindowSetMaxSize(width, height) { 113 | window.runtime.WindowSetMaxSize(width, height); 114 | } 115 | 116 | export function WindowSetMinSize(width, height) { 117 | window.runtime.WindowSetMinSize(width, height); 118 | } 119 | 120 | export function WindowSetPosition(x, y) { 121 | window.runtime.WindowSetPosition(x, y); 122 | } 123 | 124 | export function WindowGetPosition() { 125 | return window.runtime.WindowGetPosition(); 126 | } 127 | 128 | export function WindowHide() { 129 | window.runtime.WindowHide(); 130 | } 131 | 132 | export function WindowShow() { 133 | window.runtime.WindowShow(); 134 | } 135 | 136 | export function WindowMaximise() { 137 | window.runtime.WindowMaximise(); 138 | } 139 | 140 | export function WindowToggleMaximise() { 141 | window.runtime.WindowToggleMaximise(); 142 | } 143 | 144 | export function WindowUnmaximise() { 145 | window.runtime.WindowUnmaximise(); 146 | } 147 | 148 | export function WindowIsMaximised() { 149 | return window.runtime.WindowIsMaximised(); 150 | } 151 | 152 | export function WindowMinimise() { 153 | window.runtime.WindowMinimise(); 154 | } 155 | 156 | export function WindowUnminimise() { 157 | window.runtime.WindowUnminimise(); 158 | } 159 | 160 | export function WindowSetBackgroundColour(R, G, B, A) { 161 | window.runtime.WindowSetBackgroundColour(R, G, B, A); 162 | } 163 | 164 | export function ScreenGetAll() { 165 | return window.runtime.ScreenGetAll(); 166 | } 167 | 168 | export function WindowIsMinimised() { 169 | return window.runtime.WindowIsMinimised(); 170 | } 171 | 172 | export function WindowIsNormal() { 173 | return window.runtime.WindowIsNormal(); 174 | } 175 | 176 | export function BrowserOpenURL(url) { 177 | window.runtime.BrowserOpenURL(url); 178 | } 179 | 180 | export function Environment() { 181 | return window.runtime.Environment(); 182 | } 183 | 184 | export function Quit() { 185 | window.runtime.Quit(); 186 | } 187 | 188 | export function Hide() { 189 | window.runtime.Hide(); 190 | } 191 | 192 | export function Show() { 193 | window.runtime.Show(); 194 | } 195 | 196 | export function ClipboardGetText() { 197 | return window.runtime.ClipboardGetText(); 198 | } 199 | 200 | export function ClipboardSetText(text) { 201 | return window.runtime.ClipboardSetText(text); 202 | } 203 | 204 | /** 205 | * Callback for OnFileDrop returns a slice of file path strings when a drop is finished. 206 | * 207 | * @export 208 | * @callback OnFileDropCallback 209 | * @param {number} x - x coordinate of the drop 210 | * @param {number} y - y coordinate of the drop 211 | * @param {string[]} paths - A list of file paths. 212 | */ 213 | 214 | /** 215 | * OnFileDrop listens to drag and drop events and calls the callback with the coordinates of the drop and an array of path strings. 216 | * 217 | * @export 218 | * @param {OnFileDropCallback} callback - Callback for OnFileDrop returns a slice of file path strings when a drop is finished. 219 | * @param {boolean} [useDropTarget=true] - Only call the callback when the drop finished on an element that has the drop target style. (--wails-drop-target) 220 | */ 221 | export function OnFileDrop(callback, useDropTarget) { 222 | return window.runtime.OnFileDrop(callback, useDropTarget); 223 | } 224 | 225 | /** 226 | * OnFileDropOff removes the drag and drop listeners and handlers. 227 | */ 228 | export function OnFileDropOff() { 229 | return window.runtime.OnFileDropOff(); 230 | } 231 | 232 | export function CanResolveFilePaths() { 233 | return window.runtime.CanResolveFilePaths(); 234 | } 235 | 236 | export function ResolveFilePaths(files) { 237 | return window.runtime.ResolveFilePaths(files); 238 | } -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/Southclaws/go-samp-query v1.2.1 h1:UOPzYdnwcZDxJ5bsZ5zZ+YOlFX8QmRLZ20YBNuKMh0Y= 2 | github.com/Southclaws/go-samp-query v1.2.1/go.mod h1:veYZpOaPw6PXwvTGo9Rg3INKQV/2PR8Bn8p+bQedFNM= 3 | github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= 4 | github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= 5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 8 | github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= 9 | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= 10 | github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= 11 | github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 12 | github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= 13 | github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 14 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= 15 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= 16 | github.com/labstack/echo/v4 v4.10.2 h1:n1jAhnq/elIFTHr1EYpiYtyKgx4RW9ccVgkqByZaN2M= 17 | github.com/labstack/echo/v4 v4.10.2/go.mod h1:OEyqf2//K1DFdE57vw2DRgWY0M7s65IVQO2FzvI4J5k= 18 | github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= 19 | github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= 20 | github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc= 21 | github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= 22 | github.com/leaanthony/go-ansi-parser v1.6.0 h1:T8TuMhFB6TUMIUm0oRrSbgJudTFw9csT3ZK09w0t4Pg= 23 | github.com/leaanthony/go-ansi-parser v1.6.0/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= 24 | github.com/leaanthony/gosod v1.0.3 h1:Fnt+/B6NjQOVuCWOKYRREZnjGyvg+mEhd1nkkA04aTQ= 25 | github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4= 26 | github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= 27 | github.com/leaanthony/slicer v1.6.0 h1:1RFP5uiPJvT93TAHi+ipd3NACobkW53yUiBqZheE/Js= 28 | github.com/leaanthony/slicer v1.6.0/go.mod h1:o/Iz29g7LN0GqH3aMjWAe90381nyZlDNquK+mtH2Fj8= 29 | github.com/leaanthony/u v1.1.0 h1:2n0d2BwPVXSUq5yhe8lJPHdxevE2qK5G99PMStMZMaI= 30 | github.com/leaanthony/u v1.1.0/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI= 31 | github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= 32 | github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= 33 | github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= 34 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 35 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 36 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 37 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 38 | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= 39 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 40 | github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= 41 | github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= 42 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 43 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 44 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 45 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 46 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 47 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 48 | github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= 49 | github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 50 | github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca h1:NugYot0LIVPxTvN8n+Kvkn6TrbMyxQiuvKdEwFdR9vI= 51 | github.com/saintfish/chardet v0.0.0-20120816061221-3af4cd4741ca/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= 52 | github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= 53 | github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= 54 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 55 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 56 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 57 | github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= 58 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 59 | github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE= 60 | github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= 61 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 62 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 63 | github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= 64 | github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= 65 | github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= 66 | github.com/wailsapp/go-webview2 v1.0.16 h1:wffnvnkkLvhRex/aOrA3R7FP7rkvOqL/bir1br7BekU= 67 | github.com/wailsapp/go-webview2 v1.0.16/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo= 68 | github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= 69 | github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= 70 | github.com/wailsapp/wails/v2 v2.9.2 h1:Xb5YRTos1w5N7DTMyYegWaGukCP2fIaX9WF21kPPF2k= 71 | github.com/wailsapp/wails/v2 v2.9.2/go.mod h1:uehvlCwJSFcBq7rMCGfk4rxca67QQGsbg5Nm4m9UnBs= 72 | golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= 73 | golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= 74 | golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= 75 | golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= 76 | golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 77 | golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= 78 | golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= 79 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 80 | golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 81 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 82 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 83 | golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 84 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 85 | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 86 | golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 87 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 88 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 89 | golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= 90 | golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 91 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 92 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 93 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 94 | golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= 95 | golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 96 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 97 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 98 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 99 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 100 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 101 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 102 | -------------------------------------------------------------------------------- /frontend/wailsjs/runtime/runtime.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | _ __ _ __ 3 | | | / /___ _(_) /____ 4 | | | /| / / __ `/ / / ___/ 5 | | |/ |/ / /_/ / / (__ ) 6 | |__/|__/\__,_/_/_/____/ 7 | The electron alternative for Go 8 | (c) Lea Anthony 2019-present 9 | */ 10 | 11 | export interface Position { 12 | x: number; 13 | y: number; 14 | } 15 | 16 | export interface Size { 17 | w: number; 18 | h: number; 19 | } 20 | 21 | export interface Screen { 22 | isCurrent: boolean; 23 | isPrimary: boolean; 24 | width : number 25 | height : number 26 | } 27 | 28 | // Environment information such as platform, buildtype, ... 29 | export interface EnvironmentInfo { 30 | buildType: string; 31 | platform: string; 32 | arch: string; 33 | } 34 | 35 | // [EventsEmit](https://wails.io/docs/reference/runtime/events#eventsemit) 36 | // emits the given event. Optional data may be passed with the event. 37 | // This will trigger any event listeners. 38 | export function EventsEmit(eventName: string, ...data: any): void; 39 | 40 | // [EventsOn](https://wails.io/docs/reference/runtime/events#eventson) sets up a listener for the given event name. 41 | export function EventsOn(eventName: string, callback: (...data: any) => void): () => void; 42 | 43 | // [EventsOnMultiple](https://wails.io/docs/reference/runtime/events#eventsonmultiple) 44 | // sets up a listener for the given event name, but will only trigger a given number times. 45 | export function EventsOnMultiple(eventName: string, callback: (...data: any) => void, maxCallbacks: number): () => void; 46 | 47 | // [EventsOnce](https://wails.io/docs/reference/runtime/events#eventsonce) 48 | // sets up a listener for the given event name, but will only trigger once. 49 | export function EventsOnce(eventName: string, callback: (...data: any) => void): () => void; 50 | 51 | // [EventsOff](https://wails.io/docs/reference/runtime/events#eventsoff) 52 | // unregisters the listener for the given event name. 53 | export function EventsOff(eventName: string, ...additionalEventNames: string[]): void; 54 | 55 | // [EventsOffAll](https://wails.io/docs/reference/runtime/events#eventsoffall) 56 | // unregisters all listeners. 57 | export function EventsOffAll(): void; 58 | 59 | // [LogPrint](https://wails.io/docs/reference/runtime/log#logprint) 60 | // logs the given message as a raw message 61 | export function LogPrint(message: string): void; 62 | 63 | // [LogTrace](https://wails.io/docs/reference/runtime/log#logtrace) 64 | // logs the given message at the `trace` log level. 65 | export function LogTrace(message: string): void; 66 | 67 | // [LogDebug](https://wails.io/docs/reference/runtime/log#logdebug) 68 | // logs the given message at the `debug` log level. 69 | export function LogDebug(message: string): void; 70 | 71 | // [LogError](https://wails.io/docs/reference/runtime/log#logerror) 72 | // logs the given message at the `error` log level. 73 | export function LogError(message: string): void; 74 | 75 | // [LogFatal](https://wails.io/docs/reference/runtime/log#logfatal) 76 | // logs the given message at the `fatal` log level. 77 | // The application will quit after calling this method. 78 | export function LogFatal(message: string): void; 79 | 80 | // [LogInfo](https://wails.io/docs/reference/runtime/log#loginfo) 81 | // logs the given message at the `info` log level. 82 | export function LogInfo(message: string): void; 83 | 84 | // [LogWarning](https://wails.io/docs/reference/runtime/log#logwarning) 85 | // logs the given message at the `warning` log level. 86 | export function LogWarning(message: string): void; 87 | 88 | // [WindowReload](https://wails.io/docs/reference/runtime/window#windowreload) 89 | // Forces a reload by the main application as well as connected browsers. 90 | export function WindowReload(): void; 91 | 92 | // [WindowReloadApp](https://wails.io/docs/reference/runtime/window#windowreloadapp) 93 | // Reloads the application frontend. 94 | export function WindowReloadApp(): void; 95 | 96 | // [WindowSetAlwaysOnTop](https://wails.io/docs/reference/runtime/window#windowsetalwaysontop) 97 | // Sets the window AlwaysOnTop or not on top. 98 | export function WindowSetAlwaysOnTop(b: boolean): void; 99 | 100 | // [WindowSetSystemDefaultTheme](https://wails.io/docs/next/reference/runtime/window#windowsetsystemdefaulttheme) 101 | // *Windows only* 102 | // Sets window theme to system default (dark/light). 103 | export function WindowSetSystemDefaultTheme(): void; 104 | 105 | // [WindowSetLightTheme](https://wails.io/docs/next/reference/runtime/window#windowsetlighttheme) 106 | // *Windows only* 107 | // Sets window to light theme. 108 | export function WindowSetLightTheme(): void; 109 | 110 | // [WindowSetDarkTheme](https://wails.io/docs/next/reference/runtime/window#windowsetdarktheme) 111 | // *Windows only* 112 | // Sets window to dark theme. 113 | export function WindowSetDarkTheme(): void; 114 | 115 | // [WindowCenter](https://wails.io/docs/reference/runtime/window#windowcenter) 116 | // Centers the window on the monitor the window is currently on. 117 | export function WindowCenter(): void; 118 | 119 | // [WindowSetTitle](https://wails.io/docs/reference/runtime/window#windowsettitle) 120 | // Sets the text in the window title bar. 121 | export function WindowSetTitle(title: string): void; 122 | 123 | // [WindowFullscreen](https://wails.io/docs/reference/runtime/window#windowfullscreen) 124 | // Makes the window full screen. 125 | export function WindowFullscreen(): void; 126 | 127 | // [WindowUnfullscreen](https://wails.io/docs/reference/runtime/window#windowunfullscreen) 128 | // Restores the previous window dimensions and position prior to full screen. 129 | export function WindowUnfullscreen(): void; 130 | 131 | // [WindowIsFullscreen](https://wails.io/docs/reference/runtime/window#windowisfullscreen) 132 | // Returns the state of the window, i.e. whether the window is in full screen mode or not. 133 | export function WindowIsFullscreen(): Promise; 134 | 135 | // [WindowSetSize](https://wails.io/docs/reference/runtime/window#windowsetsize) 136 | // Sets the width and height of the window. 137 | export function WindowSetSize(width: number, height: number): Promise; 138 | 139 | // [WindowGetSize](https://wails.io/docs/reference/runtime/window#windowgetsize) 140 | // Gets the width and height of the window. 141 | export function WindowGetSize(): Promise; 142 | 143 | // [WindowSetMaxSize](https://wails.io/docs/reference/runtime/window#windowsetmaxsize) 144 | // Sets the maximum window size. Will resize the window if the window is currently larger than the given dimensions. 145 | // Setting a size of 0,0 will disable this constraint. 146 | export function WindowSetMaxSize(width: number, height: number): void; 147 | 148 | // [WindowSetMinSize](https://wails.io/docs/reference/runtime/window#windowsetminsize) 149 | // Sets the minimum window size. Will resize the window if the window is currently smaller than the given dimensions. 150 | // Setting a size of 0,0 will disable this constraint. 151 | export function WindowSetMinSize(width: number, height: number): void; 152 | 153 | // [WindowSetPosition](https://wails.io/docs/reference/runtime/window#windowsetposition) 154 | // Sets the window position relative to the monitor the window is currently on. 155 | export function WindowSetPosition(x: number, y: number): void; 156 | 157 | // [WindowGetPosition](https://wails.io/docs/reference/runtime/window#windowgetposition) 158 | // Gets the window position relative to the monitor the window is currently on. 159 | export function WindowGetPosition(): Promise; 160 | 161 | // [WindowHide](https://wails.io/docs/reference/runtime/window#windowhide) 162 | // Hides the window. 163 | export function WindowHide(): void; 164 | 165 | // [WindowShow](https://wails.io/docs/reference/runtime/window#windowshow) 166 | // Shows the window, if it is currently hidden. 167 | export function WindowShow(): void; 168 | 169 | // [WindowMaximise](https://wails.io/docs/reference/runtime/window#windowmaximise) 170 | // Maximises the window to fill the screen. 171 | export function WindowMaximise(): void; 172 | 173 | // [WindowToggleMaximise](https://wails.io/docs/reference/runtime/window#windowtogglemaximise) 174 | // Toggles between Maximised and UnMaximised. 175 | export function WindowToggleMaximise(): void; 176 | 177 | // [WindowUnmaximise](https://wails.io/docs/reference/runtime/window#windowunmaximise) 178 | // Restores the window to the dimensions and position prior to maximising. 179 | export function WindowUnmaximise(): void; 180 | 181 | // [WindowIsMaximised](https://wails.io/docs/reference/runtime/window#windowismaximised) 182 | // Returns the state of the window, i.e. whether the window is maximised or not. 183 | export function WindowIsMaximised(): Promise; 184 | 185 | // [WindowMinimise](https://wails.io/docs/reference/runtime/window#windowminimise) 186 | // Minimises the window. 187 | export function WindowMinimise(): void; 188 | 189 | // [WindowUnminimise](https://wails.io/docs/reference/runtime/window#windowunminimise) 190 | // Restores the window to the dimensions and position prior to minimising. 191 | export function WindowUnminimise(): void; 192 | 193 | // [WindowIsMinimised](https://wails.io/docs/reference/runtime/window#windowisminimised) 194 | // Returns the state of the window, i.e. whether the window is minimised or not. 195 | export function WindowIsMinimised(): Promise; 196 | 197 | // [WindowIsNormal](https://wails.io/docs/reference/runtime/window#windowisnormal) 198 | // Returns the state of the window, i.e. whether the window is normal or not. 199 | export function WindowIsNormal(): Promise; 200 | 201 | // [WindowSetBackgroundColour](https://wails.io/docs/reference/runtime/window#windowsetbackgroundcolour) 202 | // Sets the background colour of the window to the given RGBA colour definition. This colour will show through for all transparent pixels. 203 | export function WindowSetBackgroundColour(R: number, G: number, B: number, A: number): void; 204 | 205 | // [ScreenGetAll](https://wails.io/docs/reference/runtime/window#screengetall) 206 | // Gets the all screens. Call this anew each time you want to refresh data from the underlying windowing system. 207 | export function ScreenGetAll(): Promise; 208 | 209 | // [BrowserOpenURL](https://wails.io/docs/reference/runtime/browser#browseropenurl) 210 | // Opens the given URL in the system browser. 211 | export function BrowserOpenURL(url: string): void; 212 | 213 | // [Environment](https://wails.io/docs/reference/runtime/intro#environment) 214 | // Returns information about the environment 215 | export function Environment(): Promise; 216 | 217 | // [Quit](https://wails.io/docs/reference/runtime/intro#quit) 218 | // Quits the application. 219 | export function Quit(): void; 220 | 221 | // [Hide](https://wails.io/docs/reference/runtime/intro#hide) 222 | // Hides the application. 223 | export function Hide(): void; 224 | 225 | // [Show](https://wails.io/docs/reference/runtime/intro#show) 226 | // Shows the application. 227 | export function Show(): void; 228 | 229 | // [ClipboardGetText](https://wails.io/docs/reference/runtime/clipboard#clipboardgettext) 230 | // Returns the current text stored on clipboard 231 | export function ClipboardGetText(): Promise; 232 | 233 | // [ClipboardSetText](https://wails.io/docs/reference/runtime/clipboard#clipboardsettext) 234 | // Sets a text on the clipboard 235 | export function ClipboardSetText(text: string): Promise; 236 | 237 | // [OnFileDrop](https://wails.io/docs/reference/runtime/draganddrop#onfiledrop) 238 | // OnFileDrop listens to drag and drop events and calls the callback with the coordinates of the drop and an array of path strings. 239 | export function OnFileDrop(callback: (x: number, y: number ,paths: string[]) => void, useDropTarget: boolean) :void 240 | 241 | // [OnFileDropOff](https://wails.io/docs/reference/runtime/draganddrop#dragandddropoff) 242 | // OnFileDropOff removes the drag and drop listeners and handlers. 243 | export function OnFileDropOff() :void 244 | 245 | // Check if the file path resolver is available 246 | export function CanResolveFilePaths(): boolean; 247 | 248 | // Resolves file paths for an array of files 249 | export function ResolveFilePaths(files: File[]): void -------------------------------------------------------------------------------- /frontend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "frontend", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "crypto": "^1.0.1", 12 | "crypto-js": "^4.2.0", 13 | "reactive-json-file": "^2.0.0" 14 | }, 15 | "devDependencies": { 16 | "typescript": "^4.5.4", 17 | "vite": "^3.0.7" 18 | } 19 | }, 20 | "node_modules/@esbuild/android-arm": { 21 | "version": "0.15.18", 22 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", 23 | "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", 24 | "cpu": [ 25 | "arm" 26 | ], 27 | "dev": true, 28 | "optional": true, 29 | "os": [ 30 | "android" 31 | ], 32 | "engines": { 33 | "node": ">=12" 34 | } 35 | }, 36 | "node_modules/@esbuild/linux-loong64": { 37 | "version": "0.15.18", 38 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", 39 | "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", 40 | "cpu": [ 41 | "loong64" 42 | ], 43 | "dev": true, 44 | "optional": true, 45 | "os": [ 46 | "linux" 47 | ], 48 | "engines": { 49 | "node": ">=12" 50 | } 51 | }, 52 | "node_modules/crypto": { 53 | "version": "1.0.1", 54 | "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", 55 | "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", 56 | "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." 57 | }, 58 | "node_modules/crypto-js": { 59 | "version": "4.2.0", 60 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", 61 | "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" 62 | }, 63 | "node_modules/esbuild": { 64 | "version": "0.15.18", 65 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", 66 | "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", 67 | "dev": true, 68 | "hasInstallScript": true, 69 | "bin": { 70 | "esbuild": "bin/esbuild" 71 | }, 72 | "engines": { 73 | "node": ">=12" 74 | }, 75 | "optionalDependencies": { 76 | "@esbuild/android-arm": "0.15.18", 77 | "@esbuild/linux-loong64": "0.15.18", 78 | "esbuild-android-64": "0.15.18", 79 | "esbuild-android-arm64": "0.15.18", 80 | "esbuild-darwin-64": "0.15.18", 81 | "esbuild-darwin-arm64": "0.15.18", 82 | "esbuild-freebsd-64": "0.15.18", 83 | "esbuild-freebsd-arm64": "0.15.18", 84 | "esbuild-linux-32": "0.15.18", 85 | "esbuild-linux-64": "0.15.18", 86 | "esbuild-linux-arm": "0.15.18", 87 | "esbuild-linux-arm64": "0.15.18", 88 | "esbuild-linux-mips64le": "0.15.18", 89 | "esbuild-linux-ppc64le": "0.15.18", 90 | "esbuild-linux-riscv64": "0.15.18", 91 | "esbuild-linux-s390x": "0.15.18", 92 | "esbuild-netbsd-64": "0.15.18", 93 | "esbuild-openbsd-64": "0.15.18", 94 | "esbuild-sunos-64": "0.15.18", 95 | "esbuild-windows-32": "0.15.18", 96 | "esbuild-windows-64": "0.15.18", 97 | "esbuild-windows-arm64": "0.15.18" 98 | } 99 | }, 100 | "node_modules/esbuild-android-64": { 101 | "version": "0.15.18", 102 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", 103 | "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", 104 | "cpu": [ 105 | "x64" 106 | ], 107 | "dev": true, 108 | "optional": true, 109 | "os": [ 110 | "android" 111 | ], 112 | "engines": { 113 | "node": ">=12" 114 | } 115 | }, 116 | "node_modules/esbuild-android-arm64": { 117 | "version": "0.15.18", 118 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", 119 | "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", 120 | "cpu": [ 121 | "arm64" 122 | ], 123 | "dev": true, 124 | "optional": true, 125 | "os": [ 126 | "android" 127 | ], 128 | "engines": { 129 | "node": ">=12" 130 | } 131 | }, 132 | "node_modules/esbuild-darwin-64": { 133 | "version": "0.15.18", 134 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", 135 | "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", 136 | "cpu": [ 137 | "x64" 138 | ], 139 | "dev": true, 140 | "optional": true, 141 | "os": [ 142 | "darwin" 143 | ], 144 | "engines": { 145 | "node": ">=12" 146 | } 147 | }, 148 | "node_modules/esbuild-darwin-arm64": { 149 | "version": "0.15.18", 150 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", 151 | "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", 152 | "cpu": [ 153 | "arm64" 154 | ], 155 | "dev": true, 156 | "optional": true, 157 | "os": [ 158 | "darwin" 159 | ], 160 | "engines": { 161 | "node": ">=12" 162 | } 163 | }, 164 | "node_modules/esbuild-freebsd-64": { 165 | "version": "0.15.18", 166 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", 167 | "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", 168 | "cpu": [ 169 | "x64" 170 | ], 171 | "dev": true, 172 | "optional": true, 173 | "os": [ 174 | "freebsd" 175 | ], 176 | "engines": { 177 | "node": ">=12" 178 | } 179 | }, 180 | "node_modules/esbuild-freebsd-arm64": { 181 | "version": "0.15.18", 182 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", 183 | "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", 184 | "cpu": [ 185 | "arm64" 186 | ], 187 | "dev": true, 188 | "optional": true, 189 | "os": [ 190 | "freebsd" 191 | ], 192 | "engines": { 193 | "node": ">=12" 194 | } 195 | }, 196 | "node_modules/esbuild-linux-32": { 197 | "version": "0.15.18", 198 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", 199 | "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", 200 | "cpu": [ 201 | "ia32" 202 | ], 203 | "dev": true, 204 | "optional": true, 205 | "os": [ 206 | "linux" 207 | ], 208 | "engines": { 209 | "node": ">=12" 210 | } 211 | }, 212 | "node_modules/esbuild-linux-64": { 213 | "version": "0.15.18", 214 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", 215 | "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", 216 | "cpu": [ 217 | "x64" 218 | ], 219 | "dev": true, 220 | "optional": true, 221 | "os": [ 222 | "linux" 223 | ], 224 | "engines": { 225 | "node": ">=12" 226 | } 227 | }, 228 | "node_modules/esbuild-linux-arm": { 229 | "version": "0.15.18", 230 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", 231 | "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", 232 | "cpu": [ 233 | "arm" 234 | ], 235 | "dev": true, 236 | "optional": true, 237 | "os": [ 238 | "linux" 239 | ], 240 | "engines": { 241 | "node": ">=12" 242 | } 243 | }, 244 | "node_modules/esbuild-linux-arm64": { 245 | "version": "0.15.18", 246 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", 247 | "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", 248 | "cpu": [ 249 | "arm64" 250 | ], 251 | "dev": true, 252 | "optional": true, 253 | "os": [ 254 | "linux" 255 | ], 256 | "engines": { 257 | "node": ">=12" 258 | } 259 | }, 260 | "node_modules/esbuild-linux-mips64le": { 261 | "version": "0.15.18", 262 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", 263 | "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", 264 | "cpu": [ 265 | "mips64el" 266 | ], 267 | "dev": true, 268 | "optional": true, 269 | "os": [ 270 | "linux" 271 | ], 272 | "engines": { 273 | "node": ">=12" 274 | } 275 | }, 276 | "node_modules/esbuild-linux-ppc64le": { 277 | "version": "0.15.18", 278 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", 279 | "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", 280 | "cpu": [ 281 | "ppc64" 282 | ], 283 | "dev": true, 284 | "optional": true, 285 | "os": [ 286 | "linux" 287 | ], 288 | "engines": { 289 | "node": ">=12" 290 | } 291 | }, 292 | "node_modules/esbuild-linux-riscv64": { 293 | "version": "0.15.18", 294 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", 295 | "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", 296 | "cpu": [ 297 | "riscv64" 298 | ], 299 | "dev": true, 300 | "optional": true, 301 | "os": [ 302 | "linux" 303 | ], 304 | "engines": { 305 | "node": ">=12" 306 | } 307 | }, 308 | "node_modules/esbuild-linux-s390x": { 309 | "version": "0.15.18", 310 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", 311 | "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", 312 | "cpu": [ 313 | "s390x" 314 | ], 315 | "dev": true, 316 | "optional": true, 317 | "os": [ 318 | "linux" 319 | ], 320 | "engines": { 321 | "node": ">=12" 322 | } 323 | }, 324 | "node_modules/esbuild-netbsd-64": { 325 | "version": "0.15.18", 326 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", 327 | "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", 328 | "cpu": [ 329 | "x64" 330 | ], 331 | "dev": true, 332 | "optional": true, 333 | "os": [ 334 | "netbsd" 335 | ], 336 | "engines": { 337 | "node": ">=12" 338 | } 339 | }, 340 | "node_modules/esbuild-openbsd-64": { 341 | "version": "0.15.18", 342 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", 343 | "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", 344 | "cpu": [ 345 | "x64" 346 | ], 347 | "dev": true, 348 | "optional": true, 349 | "os": [ 350 | "openbsd" 351 | ], 352 | "engines": { 353 | "node": ">=12" 354 | } 355 | }, 356 | "node_modules/esbuild-sunos-64": { 357 | "version": "0.15.18", 358 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", 359 | "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", 360 | "cpu": [ 361 | "x64" 362 | ], 363 | "dev": true, 364 | "optional": true, 365 | "os": [ 366 | "sunos" 367 | ], 368 | "engines": { 369 | "node": ">=12" 370 | } 371 | }, 372 | "node_modules/esbuild-windows-32": { 373 | "version": "0.15.18", 374 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", 375 | "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", 376 | "cpu": [ 377 | "ia32" 378 | ], 379 | "dev": true, 380 | "optional": true, 381 | "os": [ 382 | "win32" 383 | ], 384 | "engines": { 385 | "node": ">=12" 386 | } 387 | }, 388 | "node_modules/esbuild-windows-64": { 389 | "version": "0.15.18", 390 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", 391 | "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", 392 | "cpu": [ 393 | "x64" 394 | ], 395 | "dev": true, 396 | "optional": true, 397 | "os": [ 398 | "win32" 399 | ], 400 | "engines": { 401 | "node": ">=12" 402 | } 403 | }, 404 | "node_modules/esbuild-windows-arm64": { 405 | "version": "0.15.18", 406 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", 407 | "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", 408 | "cpu": [ 409 | "arm64" 410 | ], 411 | "dev": true, 412 | "optional": true, 413 | "os": [ 414 | "win32" 415 | ], 416 | "engines": { 417 | "node": ">=12" 418 | } 419 | }, 420 | "node_modules/fsevents": { 421 | "version": "2.3.3", 422 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 423 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 424 | "dev": true, 425 | "hasInstallScript": true, 426 | "optional": true, 427 | "os": [ 428 | "darwin" 429 | ], 430 | "engines": { 431 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 432 | } 433 | }, 434 | "node_modules/function-bind": { 435 | "version": "1.1.2", 436 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 437 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 438 | "dev": true, 439 | "funding": { 440 | "url": "https://github.com/sponsors/ljharb" 441 | } 442 | }, 443 | "node_modules/hasown": { 444 | "version": "2.0.2", 445 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 446 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 447 | "dev": true, 448 | "dependencies": { 449 | "function-bind": "^1.1.2" 450 | }, 451 | "engines": { 452 | "node": ">= 0.4" 453 | } 454 | }, 455 | "node_modules/is-core-module": { 456 | "version": "2.15.1", 457 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", 458 | "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", 459 | "dev": true, 460 | "dependencies": { 461 | "hasown": "^2.0.2" 462 | }, 463 | "engines": { 464 | "node": ">= 0.4" 465 | }, 466 | "funding": { 467 | "url": "https://github.com/sponsors/ljharb" 468 | } 469 | }, 470 | "node_modules/nanoid": { 471 | "version": "3.3.8", 472 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 473 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 474 | "dev": true, 475 | "funding": [ 476 | { 477 | "type": "github", 478 | "url": "https://github.com/sponsors/ai" 479 | } 480 | ], 481 | "bin": { 482 | "nanoid": "bin/nanoid.cjs" 483 | }, 484 | "engines": { 485 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 486 | } 487 | }, 488 | "node_modules/path-parse": { 489 | "version": "1.0.7", 490 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 491 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 492 | "dev": true 493 | }, 494 | "node_modules/picocolors": { 495 | "version": "1.1.1", 496 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 497 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 498 | "dev": true 499 | }, 500 | "node_modules/postcss": { 501 | "version": "8.4.49", 502 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", 503 | "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", 504 | "dev": true, 505 | "funding": [ 506 | { 507 | "type": "opencollective", 508 | "url": "https://opencollective.com/postcss/" 509 | }, 510 | { 511 | "type": "tidelift", 512 | "url": "https://tidelift.com/funding/github/npm/postcss" 513 | }, 514 | { 515 | "type": "github", 516 | "url": "https://github.com/sponsors/ai" 517 | } 518 | ], 519 | "dependencies": { 520 | "nanoid": "^3.3.7", 521 | "picocolors": "^1.1.1", 522 | "source-map-js": "^1.2.1" 523 | }, 524 | "engines": { 525 | "node": "^10 || ^12 || >=14" 526 | } 527 | }, 528 | "node_modules/reactive-json-file": { 529 | "version": "2.0.0", 530 | "resolved": "https://registry.npmjs.org/reactive-json-file/-/reactive-json-file-2.0.0.tgz", 531 | "integrity": "sha512-UJ94iRufNEs6YuUHTi3vhbwkUYGX/cgjMZECej5W8Jw8MTnEvKlWPNJK+a72340aIeTK1UCi2dajh9G7p4bZOw==" 532 | }, 533 | "node_modules/resolve": { 534 | "version": "1.22.8", 535 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 536 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 537 | "dev": true, 538 | "dependencies": { 539 | "is-core-module": "^2.13.0", 540 | "path-parse": "^1.0.7", 541 | "supports-preserve-symlinks-flag": "^1.0.0" 542 | }, 543 | "bin": { 544 | "resolve": "bin/resolve" 545 | }, 546 | "funding": { 547 | "url": "https://github.com/sponsors/ljharb" 548 | } 549 | }, 550 | "node_modules/rollup": { 551 | "version": "2.79.2", 552 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", 553 | "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", 554 | "dev": true, 555 | "bin": { 556 | "rollup": "dist/bin/rollup" 557 | }, 558 | "engines": { 559 | "node": ">=10.0.0" 560 | }, 561 | "optionalDependencies": { 562 | "fsevents": "~2.3.2" 563 | } 564 | }, 565 | "node_modules/source-map-js": { 566 | "version": "1.2.1", 567 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 568 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 569 | "dev": true, 570 | "engines": { 571 | "node": ">=0.10.0" 572 | } 573 | }, 574 | "node_modules/supports-preserve-symlinks-flag": { 575 | "version": "1.0.0", 576 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 577 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 578 | "dev": true, 579 | "engines": { 580 | "node": ">= 0.4" 581 | }, 582 | "funding": { 583 | "url": "https://github.com/sponsors/ljharb" 584 | } 585 | }, 586 | "node_modules/typescript": { 587 | "version": "4.9.5", 588 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 589 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 590 | "dev": true, 591 | "bin": { 592 | "tsc": "bin/tsc", 593 | "tsserver": "bin/tsserver" 594 | }, 595 | "engines": { 596 | "node": ">=4.2.0" 597 | } 598 | }, 599 | "node_modules/vite": { 600 | "version": "3.2.11", 601 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.11.tgz", 602 | "integrity": "sha512-K/jGKL/PgbIgKCiJo5QbASQhFiV02X9Jh+Qq0AKCRCRKZtOTVi4t6wh75FDpGf2N9rYOnzH87OEFQNaFy6pdxQ==", 603 | "dev": true, 604 | "dependencies": { 605 | "esbuild": "^0.15.9", 606 | "postcss": "^8.4.18", 607 | "resolve": "^1.22.1", 608 | "rollup": "^2.79.1" 609 | }, 610 | "bin": { 611 | "vite": "bin/vite.js" 612 | }, 613 | "engines": { 614 | "node": "^14.18.0 || >=16.0.0" 615 | }, 616 | "optionalDependencies": { 617 | "fsevents": "~2.3.2" 618 | }, 619 | "peerDependencies": { 620 | "@types/node": ">= 14", 621 | "less": "*", 622 | "sass": "*", 623 | "stylus": "*", 624 | "sugarss": "*", 625 | "terser": "^5.4.0" 626 | }, 627 | "peerDependenciesMeta": { 628 | "@types/node": { 629 | "optional": true 630 | }, 631 | "less": { 632 | "optional": true 633 | }, 634 | "sass": { 635 | "optional": true 636 | }, 637 | "stylus": { 638 | "optional": true 639 | }, 640 | "sugarss": { 641 | "optional": true 642 | }, 643 | "terser": { 644 | "optional": true 645 | } 646 | } 647 | } 648 | } 649 | } 650 | --------------------------------------------------------------------------------