forked from Berry-Dash/launcher
Look at description for changelog
- Wine support - Loading script - Format code - Hide downloads button on sidebar when not downloading - Add installs list - A lot of improvements & more
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
"@tauri-apps/plugin-opener": "2.4.0",
|
||||
"@tauri-apps/plugin-os": "2.3.0",
|
||||
"axios": "1.10.0",
|
||||
"date-fns": "4.1.0",
|
||||
"react": "19.1.0",
|
||||
"react-dom": "19.1.0"
|
||||
},
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
||||
|
||||
mod keys;
|
||||
|
||||
use futures_util::stream::StreamExt;
|
||||
use keys::Keys;
|
||||
use std::{
|
||||
fs::{File, create_dir_all},
|
||||
io::{BufReader, Write, copy},
|
||||
@@ -13,9 +13,9 @@ use std::{
|
||||
use tauri::{AppHandle, Emitter, Manager};
|
||||
use tauri_plugin_dialog::{DialogExt, MessageDialogKind};
|
||||
use tauri_plugin_opener::OpenerExt;
|
||||
use tauri_plugin_os::platform;
|
||||
use tokio::{io::AsyncWriteExt, task::spawn_blocking, time::timeout};
|
||||
use zip::ZipArchive;
|
||||
use keys::Keys;
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
use std::{fs, os::unix::fs::PermissionsExt};
|
||||
@@ -48,6 +48,7 @@ pub async fn unzip_to_dir(zip_path: PathBuf, out_dir: PathBuf) -> zip::result::Z
|
||||
.map_err(|e| zip::result::ZipError::Io(std::io::Error::new(std::io::ErrorKind::Other, e)))?
|
||||
}
|
||||
|
||||
#[allow(unused_variables)]
|
||||
#[tauri::command]
|
||||
async fn download(
|
||||
app: AppHandle,
|
||||
@@ -75,7 +76,10 @@ async fn download(
|
||||
|
||||
let download_part_path = downloads_path.join(format!("{}.part", name));
|
||||
let download_zip_path = downloads_path.join(format!("{}.zip", name));
|
||||
let executable_path = game_path.join(&name).join(&executable);
|
||||
|
||||
if download_part_path.exists() {
|
||||
let _ = tokio::fs::remove_file(&download_part_path).await;
|
||||
}
|
||||
|
||||
let _ = tokio::fs::create_dir_all(&downloads_path).await;
|
||||
if let Ok(true) = tokio::fs::try_exists(&game_path.join(name.clone())).await {
|
||||
@@ -132,6 +136,7 @@ async fn download(
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
{
|
||||
let executable_path = game_path.join(&name).join(&executable);
|
||||
let mut perms = fs::metadata(&executable_path).unwrap().permissions();
|
||||
perms.set_mode(0o755);
|
||||
fs::set_permissions(executable_path, perms).unwrap();
|
||||
@@ -142,7 +147,7 @@ async fn download(
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn launch_game(app: AppHandle, name: String, executable: String) {
|
||||
fn launch_game(app: AppHandle, name: String, executable: String, wine: bool) {
|
||||
let game_folder = app
|
||||
.path()
|
||||
.app_local_data_dir()
|
||||
@@ -158,7 +163,39 @@ fn launch_game(app: AppHandle, name: String, executable: String) {
|
||||
.show(|_| {});
|
||||
return;
|
||||
}
|
||||
match Command::new(&game_path).current_dir(&game_folder).spawn() {
|
||||
let result = if wine && (platform() == "linux" || platform() == "macos") {
|
||||
let wine_path_output = Command::new("which").arg("wine").output();
|
||||
let wine_path = match wine_path_output {
|
||||
Ok(output) if output.status.success() => {
|
||||
let path = String::from_utf8_lossy(&output.stdout).trim().to_string();
|
||||
if path.is_empty() {
|
||||
app.dialog()
|
||||
.message("Wine is not installed. Please install Wine to run this version of Berry Dash.")
|
||||
.kind(MessageDialogKind::Error)
|
||||
.title("Wine not found")
|
||||
.show(|_| {});
|
||||
return;
|
||||
}
|
||||
path
|
||||
}
|
||||
_ => {
|
||||
app.dialog()
|
||||
.message("Wine is not installed. Please install Wine to run this version of Berry Dash.")
|
||||
.kind(MessageDialogKind::Error)
|
||||
.title("Wine not found")
|
||||
.show(|_| {});
|
||||
return;
|
||||
}
|
||||
};
|
||||
Command::new(wine_path)
|
||||
.arg(&game_path)
|
||||
.current_dir(&game_folder)
|
||||
.spawn()
|
||||
} else {
|
||||
Command::new(&game_path).current_dir(&game_folder).spawn()
|
||||
};
|
||||
|
||||
match result {
|
||||
Ok(_) => println!("Game launched successfully."),
|
||||
Err(e) => {
|
||||
app.dialog()
|
||||
|
||||
@@ -2,14 +2,24 @@ import './Sidebar.css'
|
||||
import Icon from '../Icon.png'
|
||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||
import { faCog, faDownload, faRankingStar, faServer } from '@fortawesome/free-solid-svg-icons'
|
||||
import {
|
||||
faCog,
|
||||
faDownload,
|
||||
faRankingStar,
|
||||
faServer
|
||||
} from '@fortawesome/free-solid-svg-icons'
|
||||
import { faDiscord } from '@fortawesome/free-brands-svg-icons'
|
||||
import { useState } from 'react'
|
||||
import { platform } from '@tauri-apps/plugin-os'
|
||||
import { getCurrentWindow } from '@tauri-apps/api/window'
|
||||
import { SidebarProps } from '../types/SidebarProps'
|
||||
|
||||
export default function Sidebar({ setShowPopup, setPopupMode, setFadeOut }: SidebarProps) {
|
||||
export default function Sidebar ({
|
||||
setShowPopup,
|
||||
setPopupMode,
|
||||
setFadeOut,
|
||||
downloadProgress
|
||||
}: SidebarProps) {
|
||||
const [rot, setRot] = useState(0)
|
||||
const [dir, setDir] = useState(1)
|
||||
|
||||
@@ -41,7 +51,9 @@ export default function Sidebar({ setShowPopup, setPopupMode, setFadeOut }: Side
|
||||
style={{
|
||||
transform: `rotate(${rot}deg)`,
|
||||
transition: 'transform 0.3s ease',
|
||||
marginTop: ['windows','macos'].includes(platform()) ? '20px' : '0px'
|
||||
marginTop: ['windows', 'macos'].includes(platform())
|
||||
? '20px'
|
||||
: '0px'
|
||||
}}
|
||||
onClick={() =>
|
||||
setRot(r => {
|
||||
@@ -71,14 +83,60 @@ export default function Sidebar({ setShowPopup, setPopupMode, setFadeOut }: Side
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
<nav className="nav-links">
|
||||
<a draggable={false} href="#installs" className={`link ${(window.location.hash || '#installs') === '#installs' ? 'active' : ''}`}><FontAwesomeIcon icon={faServer} className="mr-1" /> Installs</a>
|
||||
<a draggable={false} href="#settings" className={`link ${(window.location.hash || '#installs') === '#settings' ? 'active' : ''}`}><FontAwesomeIcon icon={faCog} className="mr-1" /> Settings</a>
|
||||
<a draggable={false} href="#leaderboards" className={`link ${(window.location.hash || '#installs') === '#leaderboards' ? 'active' : ''}`}><FontAwesomeIcon icon={faRankingStar} className="mr-1" /> Leaderboards</a>
|
||||
<a draggable={false} onClick={() => openUrl("https://berrydash.lncvrt.xyz/discord")} className="link"><FontAwesomeIcon icon={faDiscord} className="mr-1" /> Community</a>
|
||||
<nav className='nav-links'>
|
||||
<a
|
||||
draggable={false}
|
||||
href='#installs'
|
||||
className={`link ${
|
||||
(window.location.hash || '#installs') === '#installs'
|
||||
? 'active'
|
||||
: ''
|
||||
}`}
|
||||
>
|
||||
<FontAwesomeIcon icon={faServer} className='mr-1' /> Installs
|
||||
</a>
|
||||
<a
|
||||
draggable={false}
|
||||
href='#settings'
|
||||
className={`link ${
|
||||
(window.location.hash || '#installs') === '#settings'
|
||||
? 'active'
|
||||
: ''
|
||||
}`}
|
||||
>
|
||||
<FontAwesomeIcon icon={faCog} className='mr-1' /> Settings
|
||||
</a>
|
||||
<a
|
||||
draggable={false}
|
||||
href='#leaderboards'
|
||||
className={`link ${
|
||||
(window.location.hash || '#installs') === '#leaderboards'
|
||||
? 'active'
|
||||
: ''
|
||||
}`}
|
||||
>
|
||||
<FontAwesomeIcon icon={faRankingStar} className='mr-1' /> Leaderboards
|
||||
</a>
|
||||
<a
|
||||
draggable={false}
|
||||
onClick={() => openUrl('https://berrydash.lncvrt.xyz/discord')}
|
||||
className='link'
|
||||
>
|
||||
<FontAwesomeIcon icon={faDiscord} className='mr-1' /> Community
|
||||
</a>
|
||||
</nav>
|
||||
<div className='sidebar-downloads' onClick={() => { setPopupMode(1); setShowPopup(true); setFadeOut(false) }}>
|
||||
<p><FontAwesomeIcon icon={faDownload} /> Downloads</p>
|
||||
<div
|
||||
className='sidebar-downloads'
|
||||
style={{ display: downloadProgress.length != 0 ? 'block' : 'none' }}
|
||||
onClick={() => {
|
||||
setPopupMode(1)
|
||||
setShowPopup(true)
|
||||
setFadeOut(false)
|
||||
}}
|
||||
>
|
||||
<p>
|
||||
<FontAwesomeIcon icon={faDownload} /> Downloads
|
||||
</p>
|
||||
</div>
|
||||
</aside>
|
||||
)
|
||||
|
||||
291
src/main.tsx
291
src/main.tsx
@@ -13,21 +13,45 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||
import { faAdd, faRemove, faX } from '@fortawesome/free-solid-svg-icons'
|
||||
import '@fontsource/roboto'
|
||||
import Leaderboards from './routes/Leaderboards'
|
||||
import { isPermissionGranted, requestPermission, sendNotification } from '@tauri-apps/plugin-notification'
|
||||
import { readNormalConfig, readVersionsConfig, writeVersionsConfig } from './util/BazookaManager'
|
||||
import {
|
||||
isPermissionGranted,
|
||||
requestPermission,
|
||||
sendNotification
|
||||
} from '@tauri-apps/plugin-notification'
|
||||
import {
|
||||
readNormalConfig,
|
||||
readVersionsConfig,
|
||||
writeVersionsConfig
|
||||
} from './util/BazookaManager'
|
||||
import { VersionsConfig } from './types/VersionsConfig'
|
||||
import { DownloadedVersion } from './types/DownloadedVersion'
|
||||
import { NormalConfig } from './types/NormalConfig'
|
||||
import { app } from '@tauri-apps/api'
|
||||
import axios from 'axios'
|
||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
||||
|
||||
function App () {
|
||||
const [hash, setHash] = useState(window.location.hash || '#installs')
|
||||
const [versionList, setVersionList] = useState<null | LauncherVersion[]>(null);
|
||||
const [selectedVersionList, setSelectedVersionList] = useState<LauncherVersion[]>([]);
|
||||
const [downloadProgress, setDownloadProgress] = useState<DownloadProgress[]>([]);
|
||||
const [loading, setLoading] = useState(true)
|
||||
const [loadingText, setLoadingText] = useState('Loading...')
|
||||
const [outdated, setOutdated] = useState(false)
|
||||
const [versionList, setVersionList] = useState<null | LauncherVersion[]>(null)
|
||||
const [selectedVersionList, setSelectedVersionList] = useState<
|
||||
LauncherVersion[]
|
||||
>([])
|
||||
const [downloadProgress, setDownloadProgress] = useState<DownloadProgress[]>(
|
||||
[]
|
||||
)
|
||||
const [showPopup, setShowPopup] = useState(false)
|
||||
const [popupMode, setPopupMode] = useState<null | number>(null)
|
||||
const [fadeOut, setFadeOut] = useState(false)
|
||||
const activeDownloads = useRef(0)
|
||||
const queue = useRef<(() => void)[]>([])
|
||||
const [downloadedVersionsConfig, setDownloadedVersionsConfig] =
|
||||
useState<VersionsConfig | null>(null)
|
||||
const [normalConfig, setNormalConfig] = useState<NormalConfig | null>(null)
|
||||
|
||||
function runNext() {
|
||||
function runNext () {
|
||||
if (activeDownloads.current >= 3 || queue.current.length === 0) return
|
||||
activeDownloads.current++
|
||||
const next = queue.current.shift()
|
||||
@@ -35,7 +59,31 @@ function App () {
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
const unlistenProgress = listen<string>('download-progress', (event) => {
|
||||
;(async () => {
|
||||
setLoadingText('Checking latest version...')
|
||||
try {
|
||||
const response = await axios.get(
|
||||
'https://berrydash.lncvrt.xyz/database/launcher/latest.php'
|
||||
)
|
||||
const client = await app.getVersion()
|
||||
if (response.data !== client) {
|
||||
setOutdated(true)
|
||||
return
|
||||
}
|
||||
} catch (e) {
|
||||
setLoadingText('Failed to check latest version.')
|
||||
return
|
||||
}
|
||||
setLoadingText('Loading configs...')
|
||||
const normalConfig = await readNormalConfig()
|
||||
const versionsConfig = await readVersionsConfig()
|
||||
setDownloadedVersionsConfig(versionsConfig)
|
||||
setNormalConfig(normalConfig)
|
||||
setLoading(false)
|
||||
})()
|
||||
}, [])
|
||||
useEffect(() => {
|
||||
const unlistenProgress = listen<string>('download-progress', event => {
|
||||
const [versionName, progStr] = event.payload.split(':')
|
||||
const prog = Number(progStr)
|
||||
|
||||
@@ -48,15 +96,18 @@ function App () {
|
||||
})
|
||||
})
|
||||
|
||||
const unlistenDone = listen<string>('download-done', async (event) => {
|
||||
const unlistenDone = listen<string>('download-done', async event => {
|
||||
const versionName = event.payload
|
||||
setDownloadProgress(prev => {
|
||||
const downloaded = prev.find(d => d.version.version === versionName)
|
||||
if (downloaded) {
|
||||
readVersionsConfig().then(cfg => {
|
||||
cfg.list.push(downloaded.version)
|
||||
writeVersionsConfig(cfg)
|
||||
})
|
||||
if (downloaded && downloadedVersionsConfig) {
|
||||
const newDownloaded = DownloadedVersion.import(downloaded.version)
|
||||
const updatedConfig = {
|
||||
...downloadedVersionsConfig,
|
||||
list: [...downloadedVersionsConfig.list, newDownloaded]
|
||||
}
|
||||
setDownloadedVersionsConfig(updatedConfig)
|
||||
writeVersionsConfig(updatedConfig)
|
||||
}
|
||||
return prev.filter(d => d.version.version !== versionName)
|
||||
})
|
||||
@@ -67,7 +118,7 @@ function App () {
|
||||
}
|
||||
})
|
||||
|
||||
const unlistenFailed = listen<string>('download-failed', async (event) => {
|
||||
const unlistenFailed = listen<string>('download-failed', async event => {
|
||||
const versionName = event.payload
|
||||
setDownloadProgress(prev =>
|
||||
prev.map(d =>
|
||||
@@ -76,7 +127,10 @@ function App () {
|
||||
)
|
||||
activeDownloads.current--
|
||||
runNext()
|
||||
await notifyUser('Download Failed', `The download for version ${versionName} has failed.`)
|
||||
await notifyUser(
|
||||
'Download Failed',
|
||||
`The download for version ${versionName} has failed.`
|
||||
)
|
||||
})
|
||||
|
||||
return () => {
|
||||
@@ -84,19 +138,24 @@ function App () {
|
||||
unlistenDone.then(f => f())
|
||||
unlistenFailed.then(f => f())
|
||||
}
|
||||
}, [])
|
||||
}, [downloadedVersionsConfig])
|
||||
|
||||
async function downloadVersions(versions: LauncherVersion[]) {
|
||||
const config = await readNormalConfig()
|
||||
const useWine = config.settings.useWineOnUnixWhenNeeded
|
||||
async function downloadVersions (versions: LauncherVersion[]) {
|
||||
while (normalConfig != null) {
|
||||
const useWine = normalConfig.settings.useWineOnUnixWhenNeeded
|
||||
const p = platform()
|
||||
const newDownloads = versions.map(v => new DownloadProgress(v, 0, false, true))
|
||||
const newDownloads = versions.map(
|
||||
v => new DownloadProgress(v, 0, false, true)
|
||||
)
|
||||
setDownloadProgress(prev => [...prev, ...newDownloads])
|
||||
|
||||
newDownloads.forEach(download => {
|
||||
let plat = p
|
||||
if ((p === 'macos' || p === 'linux') && useWine) {
|
||||
if (!download.version.platforms.includes(p) && download.version.platforms.includes('windows')) {
|
||||
if (
|
||||
!download.version.platforms.includes(p) &&
|
||||
download.version.platforms.includes('windows')
|
||||
) {
|
||||
plat = 'windows'
|
||||
}
|
||||
}
|
||||
@@ -107,7 +166,9 @@ function App () {
|
||||
if (!url) {
|
||||
setDownloadProgress(prev =>
|
||||
prev.map(d =>
|
||||
d.version.version === download.version.version ? { ...d, failed: true } : d
|
||||
d.version.version === download.version.version
|
||||
? { ...d, failed: true }
|
||||
: d
|
||||
)
|
||||
)
|
||||
return
|
||||
@@ -115,7 +176,9 @@ function App () {
|
||||
|
||||
const task = () => {
|
||||
setDownloadProgress(prev => {
|
||||
const i = prev.findIndex(d => d.version.version === download.version.version)
|
||||
const i = prev.findIndex(
|
||||
d => d.version.version === download.version.version
|
||||
)
|
||||
if (i === -1) return prev
|
||||
const copy = [...prev]
|
||||
copy[i] = { ...copy[i], queued: false }
|
||||
@@ -132,6 +195,8 @@ function App () {
|
||||
queue.current.push(task)
|
||||
runNext()
|
||||
})
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
function handleOverlayClick (e: React.MouseEvent<HTMLDivElement>) {
|
||||
@@ -141,16 +206,18 @@ function App () {
|
||||
}
|
||||
}
|
||||
|
||||
async function notifyUser(title: string, body: string) {
|
||||
const config = await readNormalConfig()
|
||||
if (!config.settings.allowNotifications) return
|
||||
let permissionGranted = await isPermissionGranted();
|
||||
async function notifyUser (title: string, body: string) {
|
||||
while (normalConfig != null) {
|
||||
if (!normalConfig.settings.allowNotifications) return
|
||||
break
|
||||
}
|
||||
let permissionGranted = await isPermissionGranted()
|
||||
if (!permissionGranted) {
|
||||
const permission = await requestPermission();
|
||||
permissionGranted = permission === 'granted';
|
||||
const permission = await requestPermission()
|
||||
permissionGranted = permission === 'granted'
|
||||
}
|
||||
if (permissionGranted) {
|
||||
sendNotification({ title, body });
|
||||
sendNotification({ title, body })
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,20 +235,68 @@ function App () {
|
||||
|
||||
function renderContent () {
|
||||
if (hash === '#installs') {
|
||||
return <Installs downloadProgress={downloadProgress} showPopup={showPopup} setShowPopup={setShowPopup} setPopupMode={setPopupMode} setFadeOut={setFadeOut} setSelectedVersionList={setSelectedVersionList} setVersionList={setVersionList} />
|
||||
return (
|
||||
<Installs
|
||||
downloadProgress={downloadProgress}
|
||||
showPopup={showPopup}
|
||||
setShowPopup={setShowPopup}
|
||||
setPopupMode={setPopupMode}
|
||||
setFadeOut={setFadeOut}
|
||||
setSelectedVersionList={setSelectedVersionList}
|
||||
setVersionList={setVersionList}
|
||||
downloadedVersionsConfig={downloadedVersionsConfig}
|
||||
normalConfig={normalConfig}
|
||||
/>
|
||||
)
|
||||
} else if (hash === '#settings') {
|
||||
return <Settings />
|
||||
return <Settings normalConfig={normalConfig} />
|
||||
} else if (hash === '#leaderboards') {
|
||||
return <Leaderboards />
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
return (
|
||||
return loading ? (
|
||||
<div className='w-screen h-screen flex items-center justify-center'>
|
||||
{outdated ? (
|
||||
<div className='text-center'>
|
||||
<p className='text-8xl mb-4'>Outdated Launcher!</p>
|
||||
<p className='text-4xl mb-4'>
|
||||
Please update to the latest version to continue.
|
||||
</p>
|
||||
<button
|
||||
className='button'
|
||||
onClick={() => openUrl('https://berrydash.lncvrt.xyz/download')}
|
||||
>
|
||||
Download latest version
|
||||
</button>
|
||||
</div>
|
||||
) : (
|
||||
<p className='text-8xl text-center'>{loadingText}</p>
|
||||
)}
|
||||
</div>
|
||||
) : (
|
||||
<>
|
||||
<Sidebar setShowPopup={setShowPopup} setPopupMode={setPopupMode} setFadeOut={setFadeOut} />
|
||||
<div className="relative z-[2] ml-[239px] w-[761px] border-b border-[#242424] h-[33px] bg-[#161616]" style={{ display: platform() == 'windows' ? 'block' : 'none' }}></div>
|
||||
<div className="relative z-0">
|
||||
<div
|
||||
tabIndex={0}
|
||||
onKeyDown={e => {
|
||||
if (showPopup && e.key === 'Escape') {
|
||||
setFadeOut(true)
|
||||
setTimeout(() => setShowPopup(false), 200)
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Sidebar
|
||||
setShowPopup={setShowPopup}
|
||||
setPopupMode={setPopupMode}
|
||||
setFadeOut={setFadeOut}
|
||||
downloadProgress={downloadProgress}
|
||||
/>
|
||||
<div
|
||||
className='relative z-[2] ml-[239px] w-[761px] border-b border-[#242424] h-[33px] bg-[#161616]'
|
||||
style={{ display: platform() == 'windows' ? 'block' : 'none' }}
|
||||
></div>
|
||||
<div className='relative z-0'>
|
||||
<main style={{ marginLeft: '15rem' }}>{renderContent()}</main>
|
||||
</div>
|
||||
{showPopup && (
|
||||
@@ -201,24 +316,53 @@ function App () {
|
||||
</button>
|
||||
{popupMode === 0 ? (
|
||||
<>
|
||||
<p className='text-xl text-center'>Select versions to download</p>
|
||||
<p className='text-xl text-center'>
|
||||
Select versions to download
|
||||
</p>
|
||||
<div className='popup-content'>
|
||||
{versionList == null ? (
|
||||
<p className='text-center'>Getting version list...</p>
|
||||
) : (
|
||||
versionList.map((v, i) =>
|
||||
versionList
|
||||
.filter(
|
||||
v =>
|
||||
!downloadedVersionsConfig?.list.some(
|
||||
dv => dv.version.version === v.version
|
||||
)
|
||||
)
|
||||
.map((v, i) => (
|
||||
<div key={i} className='popup-entry'>
|
||||
<p className='text-2xl'>Berry Dash v{v.displayName}</p>
|
||||
<button className='button right-2 bottom-2' onClick={() => {
|
||||
<p className='text-2xl'>
|
||||
Berry Dash v{v.displayName}
|
||||
</p>
|
||||
<button
|
||||
className='button right-2 bottom-2'
|
||||
onClick={() => {
|
||||
if (!selectedVersionList) return
|
||||
if (!selectedVersionList.includes(v)) {
|
||||
setSelectedVersionList([...selectedVersionList, v])
|
||||
setSelectedVersionList([
|
||||
...selectedVersionList,
|
||||
v
|
||||
])
|
||||
} else {
|
||||
setSelectedVersionList(selectedVersionList.filter(x => x !== v))
|
||||
}
|
||||
}}>{selectedVersionList.includes(v) ? <><FontAwesomeIcon icon={faRemove} /> Remove</> : <><FontAwesomeIcon icon={faAdd} /> Add</>}</button>
|
||||
</div>
|
||||
setSelectedVersionList(
|
||||
selectedVersionList.filter(x => x !== v)
|
||||
)
|
||||
}
|
||||
}}
|
||||
>
|
||||
{selectedVersionList.includes(v) ? (
|
||||
<>
|
||||
<FontAwesomeIcon icon={faRemove} /> Remove
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<FontAwesomeIcon icon={faAdd} /> Add
|
||||
</>
|
||||
)}
|
||||
</button>
|
||||
</div>
|
||||
))
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
@@ -230,17 +374,26 @@ function App () {
|
||||
<p className='text-center mt-6'>Nothing here...</p>
|
||||
) : (
|
||||
downloadProgress.map((v, i) => (
|
||||
<div key={i} className='popup-entry flex flex-col justify-between'>
|
||||
<p className='text-2xl'>Berry Dash v{v.version.displayName}</p>
|
||||
<div
|
||||
key={i}
|
||||
className='popup-entry flex flex-col justify-between'
|
||||
>
|
||||
<p className='text-2xl'>
|
||||
Berry Dash v{v.version.displayName}
|
||||
</p>
|
||||
<div className='mt-[25px] flex items-center justify-between'>
|
||||
{v.failed ? (
|
||||
<>
|
||||
<div className='flex items-center'>
|
||||
<span className='text-red-500'>Download failed</span>
|
||||
<span className='text-red-500'>
|
||||
Download failed
|
||||
</span>
|
||||
<button
|
||||
className='button ml-30 mb-2'
|
||||
onClick={() =>
|
||||
setDownloadProgress((prev) => prev.filter((_, idx) => idx !== i))
|
||||
setDownloadProgress(prev =>
|
||||
prev.filter((_, idx) => idx !== i)
|
||||
)
|
||||
}
|
||||
>
|
||||
Cancel
|
||||
@@ -261,16 +414,52 @@ function App () {
|
||||
) : null}
|
||||
{popupMode == 0 && versionList != null && (
|
||||
<div className='flex justify-center'>
|
||||
<button className='button w-fit mt-2 mb-[-16px]' onClick={() => {
|
||||
<button
|
||||
className='button w-fit mt-2 mb-[-16px]'
|
||||
onClick={() => {
|
||||
setFadeOut(true)
|
||||
setTimeout(() => setShowPopup(false), 200)
|
||||
downloadVersions(selectedVersionList)
|
||||
}}>Download {selectedVersionList.length} version{selectedVersionList.length == 1 ? '' : 's'}</button>
|
||||
}}
|
||||
>
|
||||
Download {selectedVersionList.length} version
|
||||
{selectedVersionList.length == 1 ? '' : 's'}
|
||||
</button>
|
||||
<button
|
||||
className='button w-fit mt-2 ml-2 mb-[-16px]'
|
||||
onClick={() => {
|
||||
const filtered = versionList.filter(
|
||||
v =>
|
||||
!downloadedVersionsConfig?.list.some(
|
||||
dv => dv.version.version === v.version
|
||||
)
|
||||
)
|
||||
if (
|
||||
selectedVersionList.length === filtered.length &&
|
||||
filtered.every(v => selectedVersionList.includes(v))
|
||||
) {
|
||||
setSelectedVersionList([])
|
||||
} else {
|
||||
setSelectedVersionList(filtered)
|
||||
}
|
||||
}}
|
||||
>
|
||||
{selectedVersionList.length ===
|
||||
versionList.filter(
|
||||
v =>
|
||||
!downloadedVersionsConfig?.list.some(
|
||||
dv => dv.version.version === v.version
|
||||
)
|
||||
).length
|
||||
? 'Deselect All'
|
||||
: 'Select All'}
|
||||
</button>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
17
src/routes/Installs.css
Normal file
17
src/routes/Installs.css
Normal file
@@ -0,0 +1,17 @@
|
||||
@import 'tailwindcss';
|
||||
|
||||
.downloads-container {
|
||||
@apply flex justify-center;
|
||||
}
|
||||
|
||||
.downloads-scroll {
|
||||
@apply h-[515px] bg-[#161616] border border-[#242424] rounded-lg overflow-y-auto w-full;
|
||||
}
|
||||
|
||||
.downloads-entry {
|
||||
@apply flex justify-between items-center m-2 p-4 rounded-lg text-gray-200 text-lg transition-colors cursor-default bg-[#242424] hover:bg-[#323232] border border-[#484848] hover:border-[#565656];
|
||||
}
|
||||
|
||||
.downloads-entry p.score {
|
||||
@apply font-mono text-blue-500 text-lg;
|
||||
}
|
||||
@@ -2,18 +2,33 @@ import { useEffect } from 'react'
|
||||
import axios from 'axios'
|
||||
import { InstallsProps } from '../types/InstallsProps'
|
||||
import { platform } from '@tauri-apps/plugin-os'
|
||||
import { readNormalConfig } from '../util/BazookaManager'
|
||||
import './Installs.css'
|
||||
import { format } from 'date-fns'
|
||||
import { invoke } from '@tauri-apps/api/core'
|
||||
import { message } from '@tauri-apps/plugin-dialog'
|
||||
|
||||
export default function Installs({ downloadProgress, showPopup, setShowPopup, setPopupMode, setFadeOut, setSelectedVersionList, setVersionList }: InstallsProps) {
|
||||
export default function Installs ({
|
||||
downloadProgress,
|
||||
showPopup,
|
||||
setShowPopup,
|
||||
setPopupMode,
|
||||
setFadeOut,
|
||||
setSelectedVersionList,
|
||||
setVersionList,
|
||||
downloadedVersionsConfig,
|
||||
normalConfig
|
||||
}: InstallsProps) {
|
||||
useEffect(() => {
|
||||
if (!showPopup) return
|
||||
setSelectedVersionList([])
|
||||
setVersionList(null)
|
||||
;(async () => {
|
||||
try {
|
||||
const config = await readNormalConfig()
|
||||
const useWine = config.settings.useWineOnUnixWhenNeeded
|
||||
const res = await axios.get('https://berrydash.lncvrt.xyz/database/launcher/versions.php')
|
||||
while (normalConfig != null) {
|
||||
const useWine = normalConfig.settings.useWineOnUnixWhenNeeded
|
||||
const res = await axios.get(
|
||||
'https://berrydash.lncvrt.xyz/database/launcher/versions.php'
|
||||
)
|
||||
const p = platform()
|
||||
const filtered = res.data.filter((d: { platforms: string[] }) =>
|
||||
p === 'macos' || p === 'linux'
|
||||
@@ -23,6 +38,8 @@ export default function Installs({ downloadProgress, showPopup, setShowPopup, se
|
||||
: d.platforms.includes(p)
|
||||
)
|
||||
setVersionList(filtered)
|
||||
break
|
||||
}
|
||||
} catch {
|
||||
setVersionList([])
|
||||
}
|
||||
@@ -30,15 +47,90 @@ export default function Installs({ downloadProgress, showPopup, setShowPopup, se
|
||||
}, [showPopup])
|
||||
|
||||
return (
|
||||
<div className='flex justify-between items-center mt-4 mx-4'>
|
||||
<p className='text-3xl'>Installs</p>
|
||||
<div className='mx-4 mt-4'>
|
||||
<div className='flex justify-between items-center mb-4'>
|
||||
<p className='text-3xl'>Install</p>
|
||||
<button
|
||||
className='button text-3xl'
|
||||
onClick={() => { setPopupMode(0); setShowPopup(true); setFadeOut(false) }}
|
||||
onClick={() => {
|
||||
setPopupMode(0)
|
||||
setShowPopup(true)
|
||||
setFadeOut(false)
|
||||
}}
|
||||
disabled={downloadProgress.length != 0}
|
||||
>
|
||||
Download new version
|
||||
</button>
|
||||
</div>
|
||||
<div className='downloads-container'>
|
||||
<div className='downloads-scroll'>
|
||||
{downloadedVersionsConfig && downloadedVersionsConfig.list.length ? (
|
||||
downloadedVersionsConfig.list
|
||||
.sort((a, b) => b.version.id - a.version.id)
|
||||
.map((entry, i) => (
|
||||
<div key={i} className='downloads-entry'>
|
||||
<div className='flex flex-col'>
|
||||
<p className='text-2xl'>
|
||||
Berry Dash v{entry.version.displayName}
|
||||
</p>
|
||||
<p className='text-gray-400 text-md'>
|
||||
Installed{' '}
|
||||
{format(new Date(entry.installDate), 'yyyy/MM/dd')}
|
||||
</p>
|
||||
</div>
|
||||
<div className='flex flex-row items-center gap-2'>
|
||||
<button
|
||||
className='button'
|
||||
onClick={async () => {
|
||||
let plat = platform()
|
||||
let willUseWine = false
|
||||
if (plat === 'macos' || plat === 'linux') {
|
||||
if (
|
||||
!entry.version.platforms.includes(plat) &&
|
||||
entry.version.platforms.includes('windows')
|
||||
) {
|
||||
while (normalConfig != null) {
|
||||
if (
|
||||
!normalConfig.settings.useWineOnUnixWhenNeeded
|
||||
) {
|
||||
await message(
|
||||
'Wine support is disabled in settings and this version requires wine',
|
||||
{
|
||||
title:
|
||||
'Wine is needed to load this version',
|
||||
kind: 'error'
|
||||
}
|
||||
)
|
||||
return
|
||||
}
|
||||
break
|
||||
}
|
||||
plat = 'windows'
|
||||
willUseWine = true
|
||||
}
|
||||
}
|
||||
invoke('launch_game', {
|
||||
name: entry.version.version,
|
||||
executable:
|
||||
entry.version.executables[
|
||||
entry.version.platforms.indexOf(plat)
|
||||
],
|
||||
wine: willUseWine
|
||||
})
|
||||
}}
|
||||
>
|
||||
Launch
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
))
|
||||
) : (
|
||||
<div className='flex justify-center items-center h-full'>
|
||||
<p className='text-3xl'>No versions installed</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -16,13 +16,16 @@ export default function Leaderboards () {
|
||||
setLeaderboardData([])
|
||||
try {
|
||||
const launcherVersion = await app.getVersion()
|
||||
const response = await axios.get('https://berrydash.lncvrt.xyz/database/getTopPlayers.php', {
|
||||
const response = await axios.get(
|
||||
'https://berrydash.lncvrt.xyz/database/getTopPlayers.php',
|
||||
{
|
||||
headers: {
|
||||
Requester: 'BerryDashLauncher',
|
||||
LauncherVersion: launcherVersion,
|
||||
ClientPlatform: platform()
|
||||
}
|
||||
})
|
||||
}
|
||||
)
|
||||
const decrypted = await decrypt(response.data)
|
||||
setLeaderboardData(JSON.parse(decrypted))
|
||||
} catch (e) {
|
||||
@@ -72,7 +75,7 @@ export default function Leaderboards () {
|
||||
<div className='leaderboard-scroll'>
|
||||
{leaderboardData.length ? (
|
||||
leaderboardData.map((entry, i) => (
|
||||
<div key={entry.username} className='leaderboard-entry'>
|
||||
<div key={i} className='leaderboard-entry'>
|
||||
<p>
|
||||
#{i + 1} {entry.username}
|
||||
</p>
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import { useEffect, useState } from 'react'
|
||||
import { Setting } from '../componets/Setting'
|
||||
import { readNormalConfig, writeNormalConfig } from '../util/BazookaManager'
|
||||
import { writeNormalConfig } from '../util/BazookaManager'
|
||||
import { platform } from '@tauri-apps/plugin-os'
|
||||
import { SettingsProps } from '../types/SettingsProps'
|
||||
|
||||
export default function Settings () {
|
||||
export default function Settings ({ normalConfig }: SettingsProps) {
|
||||
const [checkForNewVersionOnLoad, setCheckForNewVersionOnLoad] =
|
||||
useState(false)
|
||||
const [useWineOnUnixWhenNeeded, setUseWineOnUnixWhenNeeded] = useState(false)
|
||||
@@ -12,11 +13,17 @@ export default function Settings () {
|
||||
|
||||
useEffect(() => {
|
||||
;(async () => {
|
||||
const config = await readNormalConfig()
|
||||
setCheckForNewVersionOnLoad(config.settings.checkForNewVersionOnLoad)
|
||||
setUseWineOnUnixWhenNeeded(config.settings.useWineOnUnixWhenNeeded)
|
||||
setAllowNotifications(config.settings.allowNotifications)
|
||||
while (normalConfig != null) {
|
||||
setCheckForNewVersionOnLoad(
|
||||
normalConfig.settings.checkForNewVersionOnLoad
|
||||
)
|
||||
setUseWineOnUnixWhenNeeded(
|
||||
normalConfig.settings.useWineOnUnixWhenNeeded
|
||||
)
|
||||
setAllowNotifications(normalConfig.settings.allowNotifications)
|
||||
setLoaded(true)
|
||||
break
|
||||
}
|
||||
})()
|
||||
}, [])
|
||||
|
||||
@@ -29,32 +36,42 @@ export default function Settings () {
|
||||
label='Check for new version on load'
|
||||
value={checkForNewVersionOnLoad}
|
||||
onChange={async () => {
|
||||
while (normalConfig != null) {
|
||||
setCheckForNewVersionOnLoad(!checkForNewVersionOnLoad)
|
||||
const config = await readNormalConfig()
|
||||
config.settings.checkForNewVersionOnLoad = !checkForNewVersionOnLoad
|
||||
await writeNormalConfig(config)
|
||||
normalConfig.settings.checkForNewVersionOnLoad =
|
||||
!checkForNewVersionOnLoad
|
||||
await writeNormalConfig(normalConfig)
|
||||
break
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<Setting
|
||||
label='Allow sending notifications'
|
||||
value={allowNotifications}
|
||||
onChange={async () => {
|
||||
while (normalConfig != null) {
|
||||
setAllowNotifications(!allowNotifications)
|
||||
const config = await readNormalConfig()
|
||||
config.settings.allowNotifications = !allowNotifications
|
||||
await writeNormalConfig(config)
|
||||
normalConfig.settings.allowNotifications = !allowNotifications
|
||||
await writeNormalConfig(normalConfig)
|
||||
break
|
||||
}
|
||||
}}
|
||||
/>
|
||||
<Setting
|
||||
label='Use wine to launch Berry Dash when needed'
|
||||
value={useWineOnUnixWhenNeeded}
|
||||
onChange={async () => {
|
||||
while (normalConfig != null) {
|
||||
setUseWineOnUnixWhenNeeded(!useWineOnUnixWhenNeeded)
|
||||
const config = await readNormalConfig()
|
||||
config.settings.useWineOnUnixWhenNeeded = !useWineOnUnixWhenNeeded
|
||||
await writeNormalConfig(config)
|
||||
normalConfig.settings.useWineOnUnixWhenNeeded =
|
||||
!useWineOnUnixWhenNeeded
|
||||
await writeNormalConfig(normalConfig)
|
||||
break
|
||||
}
|
||||
}}
|
||||
className={platform() == 'linux' || platform() == 'macos' ? '' : 'hidden'}
|
||||
className={
|
||||
platform() == 'linux' || platform() == 'macos' ? '' : 'hidden'
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
12
src/types/DownloadedVersion.ts
Normal file
12
src/types/DownloadedVersion.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { LauncherVersion } from './LauncherVersion'
|
||||
|
||||
export class DownloadedVersion {
|
||||
constructor (
|
||||
public version: LauncherVersion,
|
||||
public installDate: number = Date.now()
|
||||
) {}
|
||||
|
||||
static import (data: LauncherVersion) {
|
||||
return new DownloadedVersion(data)
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
import { DownloadProgress } from './DownloadProgress'
|
||||
import { LauncherVersion } from './LauncherVersion'
|
||||
import { NormalConfig } from './NormalConfig'
|
||||
import { VersionsConfig } from './VersionsConfig'
|
||||
|
||||
export type InstallsProps = {
|
||||
downloadProgress: DownloadProgress[]
|
||||
@@ -9,4 +11,6 @@ export type InstallsProps = {
|
||||
setFadeOut: (v: boolean) => void
|
||||
setSelectedVersionList: (v: LauncherVersion[]) => void
|
||||
setVersionList: (v: null | LauncherVersion[]) => void
|
||||
downloadedVersionsConfig: VersionsConfig | null
|
||||
normalConfig: NormalConfig | null
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ export interface LauncherVersion {
|
||||
version: string
|
||||
displayName: string
|
||||
platforms: string[]
|
||||
downloadUrls: string[],
|
||||
downloadUrls: string[]
|
||||
executables: string[]
|
||||
id: number
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
export type SettingProps = {
|
||||
label: string
|
||||
value: boolean
|
||||
onChange: (val: boolean) => void,
|
||||
onChange: (val: boolean) => void
|
||||
className?: string
|
||||
}
|
||||
|
||||
5
src/types/SettingsProps.ts
Normal file
5
src/types/SettingsProps.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import { NormalConfig } from './NormalConfig'
|
||||
|
||||
export type SettingsProps = {
|
||||
normalConfig: NormalConfig | null
|
||||
}
|
||||
@@ -2,6 +2,6 @@ export class SettingsType {
|
||||
constructor (
|
||||
public checkForNewVersionOnLoad: boolean = true,
|
||||
public allowNotifications: boolean = true,
|
||||
public useWineOnUnixWhenNeeded: boolean = false,
|
||||
public useWineOnUnixWhenNeeded: boolean = false
|
||||
) {}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import { DownloadProgress } from './DownloadProgress'
|
||||
|
||||
export type SidebarProps = {
|
||||
setShowPopup: (v: boolean) => void
|
||||
setPopupMode: (v: null | number) => void
|
||||
setFadeOut: (v: boolean) => void
|
||||
downloadProgress: DownloadProgress[]
|
||||
}
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
import { LauncherVersion } from './LauncherVersion'
|
||||
import { DownloadedVersion } from './DownloadedVersion'
|
||||
|
||||
export class VersionsConfig {
|
||||
constructor (
|
||||
public version: string,
|
||||
public list: LauncherVersion[] = []
|
||||
) {}
|
||||
constructor (public version: string, public list: DownloadedVersion[] = []) {}
|
||||
|
||||
static import (data: any) {
|
||||
const cfg = new VersionsConfig(data.version)
|
||||
|
||||
@@ -36,9 +36,7 @@ export async function readNormalConfig (): Promise<NormalConfig> {
|
||||
return new NormalConfig(version)
|
||||
}
|
||||
const config = await readTextFile('config.dat', options)
|
||||
return NormalConfig.import(
|
||||
JSON.parse(await decrypt(config, await getKey(2)))
|
||||
)
|
||||
return NormalConfig.import(JSON.parse(await decrypt(config, await getKey(2))))
|
||||
}
|
||||
|
||||
export async function writeNormalConfig (data: NormalConfig) {
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import { invoke } from '@tauri-apps/api/core'
|
||||
|
||||
export async function getKey(key: number): Promise<string> {
|
||||
export async function getKey (key: number): Promise<string> {
|
||||
try {
|
||||
const message = await invoke('get_keys_config', { key });
|
||||
return message as string;
|
||||
const message = await invoke('get_keys_config', { key })
|
||||
return message as string
|
||||
} catch (error) {
|
||||
console.error('Failed to get key from Tauri backend', error);
|
||||
return '';
|
||||
console.error('Failed to get key from Tauri backend', error)
|
||||
return ''
|
||||
}
|
||||
}
|
||||
306
yarn.lock
306
yarn.lock
@@ -174,156 +174,156 @@
|
||||
"@babel/helper-validator-identifier" "^7.27.1"
|
||||
|
||||
"@emnapi/core@^1.4.3":
|
||||
version "1.4.4"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.4.tgz#76620673f3033626c6d79b1420d69f06a6bb153c"
|
||||
integrity sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==
|
||||
version "1.4.5"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.5.tgz#bfbb0cbbbb9f96ec4e2c4fd917b7bbe5495ceccb"
|
||||
integrity sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==
|
||||
dependencies:
|
||||
"@emnapi/wasi-threads" "1.0.3"
|
||||
"@emnapi/wasi-threads" "1.0.4"
|
||||
tslib "^2.4.0"
|
||||
|
||||
"@emnapi/runtime@^1.4.3":
|
||||
version "1.4.4"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.4.tgz#19a8f00719c51124e2d0fbf4aaad3fa7b0c92524"
|
||||
integrity sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==
|
||||
version "1.4.5"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.5.tgz#c67710d0661070f38418b6474584f159de38aba9"
|
||||
integrity sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==
|
||||
dependencies:
|
||||
tslib "^2.4.0"
|
||||
|
||||
"@emnapi/wasi-threads@1.0.3", "@emnapi/wasi-threads@^1.0.2":
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.3.tgz#83fa228bde0e71668aad6db1af4937473d1d3ab1"
|
||||
integrity sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==
|
||||
"@emnapi/wasi-threads@1.0.4", "@emnapi/wasi-threads@^1.0.2":
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz#703fc094d969e273b1b71c292523b2f792862bf4"
|
||||
integrity sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==
|
||||
dependencies:
|
||||
tslib "^2.4.0"
|
||||
|
||||
"@esbuild/aix-ppc64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz#164b19122e2ed54f85469df9dea98ddb01d5e79e"
|
||||
integrity sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==
|
||||
"@esbuild/aix-ppc64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz#a1414903bb38027382f85f03dda6065056757727"
|
||||
integrity sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==
|
||||
|
||||
"@esbuild/android-arm64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz#8f539e7def848f764f6432598e51cc3820fde3a5"
|
||||
integrity sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==
|
||||
"@esbuild/android-arm64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz#c859994089e9767224269884061f89dae6fb51c6"
|
||||
integrity sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==
|
||||
|
||||
"@esbuild/android-arm@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.6.tgz#4ceb0f40113e9861169be83e2a670c260dd234ff"
|
||||
integrity sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==
|
||||
"@esbuild/android-arm@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.8.tgz#96a8f2ca91c6cd29ea90b1af79d83761c8ba0059"
|
||||
integrity sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==
|
||||
|
||||
"@esbuild/android-x64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.6.tgz#ad4f280057622c25fe985c08999443a195dc63a8"
|
||||
integrity sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==
|
||||
"@esbuild/android-x64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.8.tgz#a3a626c4fec4a024a9fa8c7679c39996e92916f0"
|
||||
integrity sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==
|
||||
|
||||
"@esbuild/darwin-arm64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz#d1f04027396b3d6afc96bacd0d13167dfd9f01f7"
|
||||
integrity sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==
|
||||
"@esbuild/darwin-arm64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz#a5e1252ca2983d566af1c0ea39aded65736fc66d"
|
||||
integrity sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==
|
||||
|
||||
"@esbuild/darwin-x64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz#2b4a6cedb799f635758d7832d75b23772c8ef68f"
|
||||
integrity sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==
|
||||
"@esbuild/darwin-x64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz#5271b0df2bb12ce8df886704bfdd1c7cc01385d2"
|
||||
integrity sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==
|
||||
|
||||
"@esbuild/freebsd-arm64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz#a26266cc97dd78dc3c3f3d6788b1b83697b1055d"
|
||||
integrity sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==
|
||||
"@esbuild/freebsd-arm64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz#d0a0e7fdf19733b8bb1566b81df1aa0bb7e46ada"
|
||||
integrity sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==
|
||||
|
||||
"@esbuild/freebsd-x64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz#9feb8e826735c568ebfd94859b22a3fbb6a9bdd2"
|
||||
integrity sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==
|
||||
"@esbuild/freebsd-x64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz#2de8b2e0899d08f1cb1ef3128e159616e7e85343"
|
||||
integrity sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==
|
||||
|
||||
"@esbuild/linux-arm64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz#c07cbed8e249f4c28e7f32781d36fc4695293d28"
|
||||
integrity sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==
|
||||
"@esbuild/linux-arm64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz#a4209efadc0c2975716458484a4e90c237c48ae9"
|
||||
integrity sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==
|
||||
|
||||
"@esbuild/linux-arm@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz#d6e2cd8ef3196468065d41f13fa2a61aaa72644a"
|
||||
integrity sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==
|
||||
"@esbuild/linux-arm@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz#ccd9e291c24cd8d9142d819d463e2e7200d25b19"
|
||||
integrity sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==
|
||||
|
||||
"@esbuild/linux-ia32@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz#3e682bd47c4eddcc4b8f1393dfc8222482f17997"
|
||||
integrity sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==
|
||||
"@esbuild/linux-ia32@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz#006ad1536d0c2b28fb3a1cf0b53bcb85aaf92c4d"
|
||||
integrity sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==
|
||||
|
||||
"@esbuild/linux-loong64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz#473f5ea2e52399c08ad4cd6b12e6dbcddd630f05"
|
||||
integrity sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==
|
||||
"@esbuild/linux-loong64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz#127b3fbfb2c2e08b1397e985932f718f09a8f5c4"
|
||||
integrity sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==
|
||||
|
||||
"@esbuild/linux-mips64el@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz#9960631c9fd61605b0939c19043acf4ef2b51718"
|
||||
integrity sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==
|
||||
"@esbuild/linux-mips64el@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz#837d1449517791e3fa7d82675a2d06d9f56cb340"
|
||||
integrity sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==
|
||||
|
||||
"@esbuild/linux-ppc64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz#477cbf8bb04aa034b94f362c32c86b5c31db8d3e"
|
||||
integrity sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==
|
||||
"@esbuild/linux-ppc64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz#aa2e3bd93ab8df084212f1895ca4b03c42d9e0fe"
|
||||
integrity sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==
|
||||
|
||||
"@esbuild/linux-riscv64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz#bcdb46c8fb8e93aa779e9a0a62cd4ac00dcac626"
|
||||
integrity sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==
|
||||
"@esbuild/linux-riscv64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz#a340620e31093fef72767dd28ab04214b3442083"
|
||||
integrity sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==
|
||||
|
||||
"@esbuild/linux-s390x@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz#f412cf5fdf0aea849ff51c73fd817c6c0234d46d"
|
||||
integrity sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==
|
||||
"@esbuild/linux-s390x@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz#ddfed266c8c13f5efb3105a0cd47f6dcd0e79e71"
|
||||
integrity sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==
|
||||
|
||||
"@esbuild/linux-x64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz#d8233c09b5ebc0c855712dc5eeb835a3a3341108"
|
||||
integrity sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==
|
||||
"@esbuild/linux-x64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz#9a4f78c75c051e8c060183ebb39a269ba936a2ac"
|
||||
integrity sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==
|
||||
|
||||
"@esbuild/netbsd-arm64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz#f51ae8dd1474172e73cf9cbaf8a38d1c72dd8f1a"
|
||||
integrity sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==
|
||||
"@esbuild/netbsd-arm64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz#902c80e1d678047926387230bc037e63e00697d0"
|
||||
integrity sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==
|
||||
|
||||
"@esbuild/netbsd-x64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz#a267538602c0e50a858cf41dcfe5d8036f8da8e7"
|
||||
integrity sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==
|
||||
"@esbuild/netbsd-x64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz#2d9eb4692add2681ff05a14ce99de54fbed7079c"
|
||||
integrity sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==
|
||||
|
||||
"@esbuild/openbsd-arm64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz#a51be60c425b85c216479b8c344ad0511635f2d2"
|
||||
integrity sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==
|
||||
"@esbuild/openbsd-arm64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz#89c3b998c6de739db38ab7fb71a8a76b3fa84a45"
|
||||
integrity sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==
|
||||
|
||||
"@esbuild/openbsd-x64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz#7e4a743c73f75562e29223ba69d0be6c9c9008da"
|
||||
integrity sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==
|
||||
"@esbuild/openbsd-x64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz#2f01615cf472b0e48c077045cfd96b5c149365cc"
|
||||
integrity sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==
|
||||
|
||||
"@esbuild/openharmony-arm64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz#2087a5028f387879154ebf44bdedfafa17682e5b"
|
||||
integrity sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==
|
||||
"@esbuild/openharmony-arm64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz#a201f720cd2c3ebf9a6033fcc3feb069a54b509a"
|
||||
integrity sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==
|
||||
|
||||
"@esbuild/sunos-x64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz#56531f861723ea0dc6283a2bb8837304223cb736"
|
||||
integrity sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==
|
||||
"@esbuild/sunos-x64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz#07046c977985a3334667f19e6ab3a01a80862afb"
|
||||
integrity sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==
|
||||
|
||||
"@esbuild/win32-arm64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz#f4989f033deac6fae323acff58764fa8bc01436e"
|
||||
integrity sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==
|
||||
"@esbuild/win32-arm64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz#4a5470caf0d16127c05d4833d4934213c69392d1"
|
||||
integrity sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==
|
||||
|
||||
"@esbuild/win32-ia32@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz#b260e9df71e3939eb33925076d39f63cec7d1525"
|
||||
integrity sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==
|
||||
"@esbuild/win32-ia32@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz#3de3e8470b7b328d99dbc3e9ec1eace207e5bbc4"
|
||||
integrity sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==
|
||||
|
||||
"@esbuild/win32-x64@0.25.6":
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz#4276edd5c105bc28b11c6a1f76fb9d29d1bd25c1"
|
||||
integrity sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==
|
||||
"@esbuild/win32-x64@0.25.8":
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz#610d7ea539d2fcdbe39237b5cc175eb2c4451f9c"
|
||||
integrity sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==
|
||||
|
||||
"@fontsource/roboto@5.2.6":
|
||||
version "5.2.6"
|
||||
@@ -622,16 +622,11 @@
|
||||
postcss "^8.4.41"
|
||||
tailwindcss "4.1.11"
|
||||
|
||||
"@tauri-apps/api@2.7.0":
|
||||
"@tauri-apps/api@2.7.0", "@tauri-apps/api@^2.6.0":
|
||||
version "2.7.0"
|
||||
resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.7.0.tgz#44319e7cd34e898d21cc770961209bd50ac4cefe"
|
||||
integrity sha512-v7fVE8jqBl8xJFOcBafDzXFc8FnicoH3j8o8DNNs0tHuEBmXUDqrCOAzMRX0UkfpwqZLqvrvK0GNQ45DfnoVDg==
|
||||
|
||||
"@tauri-apps/api@^2.6.0":
|
||||
version "2.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.6.0.tgz#efd873bf04b0d72cea81f9397e16218f5deafe0f"
|
||||
integrity sha512-hRNcdercfgpzgFrMXWwNDBN0B7vNzOzRepy6ZAmhxi5mDLVPNrTpo9MGg2tN/F7JRugj4d2aF7E1rtPXAHaetg==
|
||||
|
||||
"@tauri-apps/cli-darwin-arm64@2.7.1":
|
||||
version "2.7.1"
|
||||
resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.7.1.tgz#dc20102b0ef0b515ef8b332e6941249ae70b52cf"
|
||||
@@ -884,6 +879,11 @@ csstype@^3.0.2:
|
||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
|
||||
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
|
||||
|
||||
date-fns@4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14"
|
||||
integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==
|
||||
|
||||
debug@^4.1.0, debug@^4.3.1:
|
||||
version "4.4.1"
|
||||
resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
|
||||
@@ -911,9 +911,9 @@ dunder-proto@^1.0.1:
|
||||
gopd "^1.2.0"
|
||||
|
||||
electron-to-chromium@^1.5.173:
|
||||
version "1.5.187"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.187.tgz#8c58854e065962351dc87e95614dd78d50425966"
|
||||
integrity sha512-cl5Jc9I0KGUoOoSbxvTywTa40uspGJt/BDBoDLoxJRSBpWh4FFXBsjNRHfQrONsV/OoEjDfHUmZQa2d6Ze4YgA==
|
||||
version "1.5.190"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.190.tgz#f0ac8be182291a45e8154dbb12f18d2b2318e4ac"
|
||||
integrity sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw==
|
||||
|
||||
enhanced-resolve@^5.18.1:
|
||||
version "5.18.2"
|
||||
@@ -951,36 +951,36 @@ es-set-tostringtag@^2.1.0:
|
||||
hasown "^2.0.2"
|
||||
|
||||
esbuild@^0.25.0:
|
||||
version "0.25.6"
|
||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.6.tgz#9b82a3db2fa131aec069ab040fd57ed0a880cdcd"
|
||||
integrity sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==
|
||||
version "0.25.8"
|
||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.8.tgz#482d42198b427c9c2f3a81b63d7663aecb1dda07"
|
||||
integrity sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==
|
||||
optionalDependencies:
|
||||
"@esbuild/aix-ppc64" "0.25.6"
|
||||
"@esbuild/android-arm" "0.25.6"
|
||||
"@esbuild/android-arm64" "0.25.6"
|
||||
"@esbuild/android-x64" "0.25.6"
|
||||
"@esbuild/darwin-arm64" "0.25.6"
|
||||
"@esbuild/darwin-x64" "0.25.6"
|
||||
"@esbuild/freebsd-arm64" "0.25.6"
|
||||
"@esbuild/freebsd-x64" "0.25.6"
|
||||
"@esbuild/linux-arm" "0.25.6"
|
||||
"@esbuild/linux-arm64" "0.25.6"
|
||||
"@esbuild/linux-ia32" "0.25.6"
|
||||
"@esbuild/linux-loong64" "0.25.6"
|
||||
"@esbuild/linux-mips64el" "0.25.6"
|
||||
"@esbuild/linux-ppc64" "0.25.6"
|
||||
"@esbuild/linux-riscv64" "0.25.6"
|
||||
"@esbuild/linux-s390x" "0.25.6"
|
||||
"@esbuild/linux-x64" "0.25.6"
|
||||
"@esbuild/netbsd-arm64" "0.25.6"
|
||||
"@esbuild/netbsd-x64" "0.25.6"
|
||||
"@esbuild/openbsd-arm64" "0.25.6"
|
||||
"@esbuild/openbsd-x64" "0.25.6"
|
||||
"@esbuild/openharmony-arm64" "0.25.6"
|
||||
"@esbuild/sunos-x64" "0.25.6"
|
||||
"@esbuild/win32-arm64" "0.25.6"
|
||||
"@esbuild/win32-ia32" "0.25.6"
|
||||
"@esbuild/win32-x64" "0.25.6"
|
||||
"@esbuild/aix-ppc64" "0.25.8"
|
||||
"@esbuild/android-arm" "0.25.8"
|
||||
"@esbuild/android-arm64" "0.25.8"
|
||||
"@esbuild/android-x64" "0.25.8"
|
||||
"@esbuild/darwin-arm64" "0.25.8"
|
||||
"@esbuild/darwin-x64" "0.25.8"
|
||||
"@esbuild/freebsd-arm64" "0.25.8"
|
||||
"@esbuild/freebsd-x64" "0.25.8"
|
||||
"@esbuild/linux-arm" "0.25.8"
|
||||
"@esbuild/linux-arm64" "0.25.8"
|
||||
"@esbuild/linux-ia32" "0.25.8"
|
||||
"@esbuild/linux-loong64" "0.25.8"
|
||||
"@esbuild/linux-mips64el" "0.25.8"
|
||||
"@esbuild/linux-ppc64" "0.25.8"
|
||||
"@esbuild/linux-riscv64" "0.25.8"
|
||||
"@esbuild/linux-s390x" "0.25.8"
|
||||
"@esbuild/linux-x64" "0.25.8"
|
||||
"@esbuild/netbsd-arm64" "0.25.8"
|
||||
"@esbuild/netbsd-x64" "0.25.8"
|
||||
"@esbuild/openbsd-arm64" "0.25.8"
|
||||
"@esbuild/openbsd-x64" "0.25.8"
|
||||
"@esbuild/openharmony-arm64" "0.25.8"
|
||||
"@esbuild/sunos-x64" "0.25.8"
|
||||
"@esbuild/win32-arm64" "0.25.8"
|
||||
"@esbuild/win32-ia32" "0.25.8"
|
||||
"@esbuild/win32-x64" "0.25.8"
|
||||
|
||||
escalade@^3.2.0:
|
||||
version "3.2.0"
|
||||
|
||||
Reference in New Issue
Block a user