Merge commit 'ac9bcabd9c2e6095a3298eedc6d9e2eda704e25d' into feature-clean

This commit is contained in:
2024-10-04 01:09:29 +03:00
36 changed files with 4985 additions and 6964 deletions

View File

@@ -42,9 +42,6 @@ jobs:
with: with:
components: rustfmt, clippy components: rustfmt, clippy
- name: Install Tauri CLI
run: cargo install tauri-cli --git https://github.com/modrinth/tauri.git --rev 5e2942876c2266594ed1db516c1d9975c873c36a
- name: Setup rust cache - name: Setup rust cache
uses: actions/cache@v4 uses: actions/cache@v4
with: with:
@@ -66,7 +63,7 @@ jobs:
!target/release/bundle/msi/*.msi !target/release/bundle/msi/*.msi
!target/release/bundle/msi/*.msi.zip !target/release/bundle/msi/*.msi.zip
!target/release/bundle/msi/*.msi.zip.sig !target/release/bundle/msi/*.msi.zip.sig
!target/release/bundle/nsis/*.exe !target/release/bundle/nsis/*.exe
!target/release/bundle/nsis/*.nsis.zip !target/release/bundle/nsis/*.nsis.zip
!target/release/bundle/nsis/*.nsis.zip.sig !target/release/bundle/nsis/*.nsis.zip.sig
@@ -115,7 +112,6 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
V1_COMPATIBLE_BIN_NAME: true
- name: build app - name: build app
run: pnpm --filter=@modrinth/app run tauri build --config "tauri-release.conf.json" run: pnpm --filter=@modrinth/app run tauri build --config "tauri-release.conf.json"
@@ -125,7 +121,6 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
V1_COMPATIBLE_BIN_NAME: true
- name: upload ${{ matrix.platform }} - name: upload ${{ matrix.platform }}
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
@@ -148,7 +143,7 @@ jobs:
target/release/bundle/msi/*.msi target/release/bundle/msi/*.msi
target/release/bundle/msi/*.msi.zip target/release/bundle/msi/*.msi.zip
target/release/bundle/msi/*.msi.zip.sig target/release/bundle/msi/*.msi.zip.sig
target/release/bundle/nsis/*.exe target/release/bundle/nsis/*.exe
target/release/bundle/nsis/*.nsis.zip target/release/bundle/nsis/*.nsis.zip
target/release/bundle/nsis/*.nsis.zip.sig target/release/bundle/nsis/*.nsis.zip.sig

741
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -18,5 +18,4 @@ strip = true # Remove debug symbols
opt-level = 3 opt-level = 3
[patch.crates-io] [patch.crates-io]
wry = { git = "https://github.com/modrinth/wry", rev = "5840108" } wry = { git = "https://github.com/modrinth/wry", rev = "27fb16b" }
tauri = { git = "https://github.com/modrinth/tauri", rev = "5e29428" }

View File

@@ -1,7 +1,7 @@
{ {
"name": "@modrinth/app-frontend", "name": "@modrinth/app-frontend",
"private": true, "private": true,
"version": "0.8.702", "version": "0.8.801",
"development_build": true, "development_build": true,
"type": "module", "type": "module",
"scripts": { "scripts": {

View File

@@ -230,7 +230,7 @@ const createInstance = async () => {
@click="installModal.hide()" @click="installModal.hide()"
> >
<Avatar <Avatar
:src="profile.icon_path ? tauri.convertFileSrc(profile.icon_path) : null" :src="profile.icon_path ? convertFileSrc(profile.icon_path) : null"
class="profile-image" class="profile-image"
/> />
{{ profile.name }} {{ profile.name }}

View File

@@ -319,6 +319,25 @@ await getBranches()
<span class="label__title size-card-header">Privacy</span> <span class="label__title size-card-header">Privacy</span>
</h3> </h3>
</div> </div>
<div class="adjacent-input">
<label for="opt-out-analytics">
<span class="label__title">Personalized ads</span>
<span class="label__description">
Modrinth's ad provider, Aditude, shows ads based on your preferences. By disabling this
option, you opt out and ads will no longer be shown based on your interests.
</span>
</label>
<Toggle
id="opt-out-analytics"
:model-value="settings.personalized_ads"
:checked="settings.personalized_ads"
@update:model-value="
(e) => {
settings.personalized_ads = e
}
"
/>
</div>
<div class="adjacent-input"> <div class="adjacent-input">
<label for="opt-out-analytics"> <label for="opt-out-analytics">
<span class="label__title">Telemetry</span> <span class="label__title">Telemetry</span>

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "theseus_gui" name = "theseus_gui"
version = "0.8.7" version = "0.8.8"
description = "The Modrinth App is a desktop application for managing your Minecraft mods" description = "The Modrinth App is a desktop application for managing your Minecraft mods"
license = "GPL-3.0-only" license = "GPL-3.0-only"
repository = "https://github.com/modrinth/code/apps/app/" repository = "https://github.com/modrinth/code/apps/app/"
@@ -8,7 +8,7 @@ edition = "2021"
build = "build.rs" build = "build.rs"
[build-dependencies] [build-dependencies]
tauri-build = { git = "https://github.com/modrinth/tauri", features = ["codegen"], rev = "5e29428" } tauri-build = { version = "2.0.0-rc", features = ["codegen"] }
[dependencies] [dependencies]
theseus = { path = "../../packages/app-lib", features = ["tauri"] } theseus = { path = "../../packages/app-lib", features = ["tauri"] }
@@ -16,7 +16,7 @@ theseus = { path = "../../packages/app-lib", features = ["tauri"] }
serde_json = "1.0" serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
tauri = { git = "https://github.com/modrinth/tauri", features = ["devtools", "macos-private-api", "protocol-asset", "unstable"], rev = "5e29428" } tauri = { version = "2.0.0-rc", features = ["devtools", "macos-private-api", "protocol-asset", "unstable"] }
tauri-plugin-window-state = "2.0.0-rc" tauri-plugin-window-state = "2.0.0-rc"
tauri-plugin-deep-link = "2.0.0-rc" tauri-plugin-deep-link = "2.0.0-rc"
tauri-plugin-os = "2.0.0-rc" tauri-plugin-os = "2.0.0-rc"

View File

@@ -22,7 +22,6 @@ Before you begin, ensure you have the following installed on your machine:
Follow these steps to set up your development environment: Follow these steps to set up your development environment:
```bash ```bash
cargo install tauri-cli --git https://github.com/modrinth/tauri.git --rev 5e2942876c2266594ed1db516c1d9975c873c36a
pnpm install pnpm install
pnpm app:dev pnpm app:dev
``` ```

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,346 +0,0 @@
<?if $(sys.BUILDARCH)="x86"?>
<?define Win64 = "no" ?>
<?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
<?elseif $(sys.BUILDARCH)="x64"?>
<?define Win64 = "yes" ?>
<?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
<?else?>
<?error Unsupported value of sys.BUILDARCH=$(sys.BUILDARCH)?>
<?endif?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product
Id="*"
Name="{{product_name}}"
UpgradeCode="{{upgrade_code}}"
Language="!(loc.TauriLanguage)"
Manufacturer="{{manufacturer}}"
Version="{{version}}">
<Package Id="*"
Keywords="Installer"
InstallerVersion="450"
Languages="0"
Compressed="yes"
InstallScope="perMachine"
SummaryCodepage="!(loc.TauriCodepage)"/>
<!-- https://docs.microsoft.com/en-us/windows/win32/msi/reinstallmode -->
<!-- reinstall all files; rewrite all registry entries; reinstall all shortcuts -->
<Property Id="REINSTALLMODE" Value="amus" />
{{#if allow_downgrades}}
<MajorUpgrade Schedule="afterInstallInitialize" AllowDowngrades="yes" />
{{else}}
<MajorUpgrade Schedule="afterInstallInitialize" DowngradeErrorMessage="!(loc.DowngradeErrorMessage)" AllowSameVersionUpgrades="yes" />
{{/if}}
<InstallExecuteSequence>
<RemoveShortcuts>Installed AND NOT UPGRADINGPRODUCTCODE</RemoveShortcuts>
</InstallExecuteSequence>
<Media Id="1" Cabinet="app.cab" EmbedCab="yes" />
{{#if banner_path}}
<WixVariable Id="WixUIBannerBmp" Value="{{banner_path}}" />
{{/if}}
{{#if dialog_image_path}}
<WixVariable Id="WixUIDialogBmp" Value="{{dialog_image_path}}" />
{{/if}}
{{#if license}}
<WixVariable Id="WixUILicenseRtf" Value="{{license}}" />
{{/if}}
<Icon Id="ProductIcon" SourceFile="{{icon_path}}"/>
<Property Id="ARPPRODUCTICON" Value="ProductIcon" />
<Property Id="ARPNOREPAIR" Value="yes" Secure="yes" /> <!-- Remove repair -->
<SetProperty Id="ARPNOMODIFY" Value="1" After="InstallValidate" Sequence="execute"/>
<!-- initialize with previous InstallDir -->
<Property Id="INSTALLDIR">
<RegistrySearch Id="PrevInstallDirReg" Root="HKCU" Key="Software\\{{manufacturer}}\\{{product_name}}" Name="InstallDir" Type="raw"/>
</Property>
<!-- launch app checkbox -->
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOXTEXT" Value="!(loc.LaunchApp)" />
<Property Id="WIXUI_EXITDIALOGOPTIONALCHECKBOX" Value="1"/>
<Property Id="WixShellExecTarget" Value="[!Path]" />
<CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" Impersonate="yes" />
<UI>
<!-- launch app checkbox -->
<Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />
{{#unless license}}
<!-- Skip license dialog -->
<Publish Dialog="WelcomeDlg"
Control="Next"
Event="NewDialog"
Value="InstallDirDlg"
Order="2">1</Publish>
<Publish Dialog="InstallDirDlg"
Control="Back"
Event="NewDialog"
Value="WelcomeDlg"
Order="2">1</Publish>
{{/unless}}
</UI>
<UIRef Id="WixUI_InstallDir" />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="DesktopFolder" Name="Desktop">
<Component Id="ApplicationShortcutDesktop" Guid="*">
<Shortcut Id="ApplicationDesktopShortcut" Name="{{product_name}}" Description="Runs {{product_name}}" Target="[!Path]" WorkingDirectory="INSTALLDIR" />
<RemoveFolder Id="DesktopFolder" On="uninstall" />
<RegistryValue Root="HKCU" Key="Software\\{{manufacturer}}\\{{product_name}}" Name="Desktop Shortcut" Type="integer" Value="1" KeyPath="yes" />
</Component>
</Directory>
<Directory Id="$(var.PlatformProgramFilesFolder)" Name="PFiles">
<Directory Id="INSTALLDIR" Name="{{product_name}}"/>
</Directory>
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="{{product_name}}"/>
</Directory>
</Directory>
<DirectoryRef Id="INSTALLDIR">
<Component Id="RegistryEntries" Guid="*">
<RegistryKey Root="HKCU" Key="Software\\{{manufacturer}}\\{{product_name}}">
<RegistryValue Name="InstallDir" Type="string" Value="[INSTALLDIR]" KeyPath="yes" />
</RegistryKey>
</Component>
<Component Id="Path" Guid="{{path_component_guid}}" Win64="$(var.Win64)">
<File Id="Path" Source="{{app_exe_source}}" KeyPath="yes" Checksum="yes"/>
<!-- THESEUS -->
<ProgId Id="theseus.mrpack.Document" Description="Modrinth File">
<Extension Id="mrpack" ContentType="application/mrpack">
<!-- no flags on argument, so we can hijack deep link library-->
<Verb Id="open" Command="Open" TargetFile="Path" Argument="&quot;%1&quot;" />
</Extension>
</ProgId>
<!-- /THESEUS -->
</Component>
{{#each binaries as |bin| ~}}
<Component Id="{{ bin.id }}" Guid="{{bin.guid}}" Win64="$(var.Win64)">
<File Id="Bin_{{ bin.id }}" Source="{{bin.path}}" KeyPath="yes"/>
</Component>
{{/each~}}
{{#if enable_elevated_update_task}}
<Component Id="UpdateTask" Guid="C492327D-9720-4CD5-8DB8-F09082AF44BE" Win64="$(var.Win64)">
<File Id="UpdateTask" Source="update.xml" KeyPath="yes" Checksum="yes"/>
</Component>
<Component Id="UpdateTaskInstaller" Guid="011F25ED-9BE3-50A7-9E9B-3519ED2B9932" Win64="$(var.Win64)">
<File Id="UpdateTaskInstaller" Source="install-task.ps1" KeyPath="yes" Checksum="yes"/>
</Component>
<Component Id="UpdateTaskUninstaller" Guid="D4F6CC3F-32DC-5FD0-95E8-782FFD7BBCE1" Win64="$(var.Win64)">
<File Id="UpdateTaskUninstaller" Source="uninstall-task.ps1" KeyPath="yes" Checksum="yes"/>
</Component>
{{/if}}
{{resources}}
<Component Id="CMP_UninstallShortcut" Guid="*">
<Shortcut Id="UninstallShortcut"
Name="Uninstall {{product_name}}"
Description="Uninstalls {{product_name}}"
Target="[System64Folder]msiexec.exe"
Arguments="/x [ProductCode]" />
<RemoveFolder Id="INSTALLDIR"
On="uninstall" />
<RegistryValue Root="HKCU"
Key="Software\\{{manufacturer}}\\{{product_name}}"
Name="Uninstaller Shortcut"
Type="integer"
Value="1"
KeyPath="yes" />
</Component>
<!-- THESEUS -->
<Component Id="FileTypeAssociationsReg" Guid="*">
<RegistryValue Root="HKLM" Key="SOFTWARE\modrinth\theseus\Capabilities" Name="ApplicationDescription" Value="theseus" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\modrinth\theseus\Capabilities" Name="ApplicationIcon" Value="[INSTALLDIR]theseus,0" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\modrinth\theseus\Capabilities" Name="ApplicationName" Value="theseus" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\modrinth\theseus\Capabilities\DefaultIcon" Value="[INSTALLDIR]theseus,1" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\modrinth\theseus\Capabilities\FileAssociations" Name=".mrpack" Value="theseus.mrpack.Document" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\modrinth\theseus\Capabilities\MIMEAssociations" Name="application/mrpack" Value="theseus.mrpack.Document" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\modrinth\theseus\Capabilities\shell\Open\command" Value="&quot;[INSTALLDIR]theseus&quot; -e &quot;%1&quot;" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\RegisteredApplications" Name="theseus" Value="SOFTWARE\modrinth\theseus\Capabilities" Type="string" KeyPath="yes" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\theseus.mrpack.Document" Name="MRPACK File" Value="Modrinth Modpack Installer" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.mrpack" Name="Content Type" Value="application/mrpack" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.mrpack\OpenWithList\theseus" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\.mrpack\OpenWithProgids" Name="theseus.mrpack.Document" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\mrpack\SupportedTypes" Name=".mrpack" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="SOFTWARE\Classes\Applications\mrpack\shell\open" Name="FriendlyAppName" Value="theseus" Type="string" />
</Component>
<!-- /THESEUS -->
</DirectoryRef>
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="ApplicationShortcut" Guid="*">
<Shortcut Id="ApplicationStartMenuShortcut"
Name="{{product_name}}"
Description="Runs {{product_name}}"
Target="[!Path]"
Icon="ProductIcon"
WorkingDirectory="INSTALLDIR">
<ShortcutProperty Key="System.AppUserModel.ID" Value="{{bundle_id}}"/>
</Shortcut>
<RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
<RegistryValue Root="HKCU" Key="Software\\{{manufacturer}}\\{{product_name}}" Name="Start Menu Shortcut" Type="integer" Value="1" KeyPath="yes"/>
</Component>
</DirectoryRef>
{{#each merge_modules as |msm| ~}}
<DirectoryRef Id="TARGETDIR">
<Merge Id="{{ msm.name }}" SourceFile="{{ msm.path }}" DiskId="1" Language="!(loc.TauriLanguage)" />
</DirectoryRef>
<Feature Id="{{ msm.name }}" Title="{{ msm.name }}" AllowAdvertise="no" Display="hidden" Level="1">
<MergeRef Id="{{ msm.name }}"/>
</Feature>
{{/each~}}
<Feature
Id="MainProgram"
Title="Application"
Description="!(loc.InstallAppFeature)"
Level="1"
ConfigurableDirectory="INSTALLDIR"
AllowAdvertise="no"
Display="expand"
Absent="disallow">
<ComponentRef Id="RegistryEntries"/>
<!-- THESEUS -->
<ComponentRef Id="FileTypeAssociationsReg" />
<!-- /THESEUS -->
{{#each resource_file_ids as |resource_file_id| ~}}
<ComponentRef Id="{{ resource_file_id }}"/>
{{/each~}}
{{#if enable_elevated_update_task}}
<ComponentRef Id="UpdateTask" />
<ComponentRef Id="UpdateTaskInstaller" />
<ComponentRef Id="UpdateTaskUninstaller" />
{{/if}}
<Feature Id="ShortcutsFeature"
Title="Shortcuts"
Level="1">
<ComponentRef Id="Path"/>
<ComponentRef Id="CMP_UninstallShortcut" />
<ComponentRef Id="ApplicationShortcut" />
<ComponentRef Id="ApplicationShortcutDesktop" />
</Feature>
<Feature
Id="Environment"
Title="PATH Environment Variable"
Description="!(loc.PathEnvVarFeature)"
Level="1"
Absent="allow">
<ComponentRef Id="Path"/>
{{#each binaries as |bin| ~}}
<ComponentRef Id="{{ bin.id }}"/>
{{/each~}}
</Feature>
</Feature>
<Feature Id="External" AllowAdvertise="no" Absent="disallow">
{{#each component_group_refs as |id| ~}}
<ComponentGroupRef Id="{{ id }}"/>
{{/each~}}
{{#each component_refs as |id| ~}}
<ComponentRef Id="{{ id }}"/>
{{/each~}}
{{#each feature_group_refs as |id| ~}}
<FeatureGroupRef Id="{{ id }}"/>
{{/each~}}
{{#each feature_refs as |id| ~}}
<FeatureRef Id="{{ id }}"/>
{{/each~}}
{{#each merge_refs as |id| ~}}
<MergeRef Id="{{ id }}"/>
{{/each~}}
</Feature>
{{#if install_webview}}
<!-- WebView2 -->
<Property Id="WVRTINSTALLED">
<RegistrySearch Id="WVRTInstalledSystem" Root="HKLM" Key="SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" Name="pv" Type="raw" Win64="no" />
<RegistrySearch Id="WVRTInstalledUser" Root="HKCU" Key="SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" Name="pv" Type="raw"/>
</Property>
{{#if download_bootstrapper}}
<CustomAction Id='DownloadAndInvokeBootstrapper' Directory="INSTALLDIR" Execute="deferred" ExeCommand='powershell.exe -NoProfile -windowstyle hidden try [\{] [\[]Net.ServicePointManager[\]]::SecurityProtocol = [\[]Net.SecurityProtocolType[\]]::Tls12 [\}] catch [\{][\}]; Invoke-WebRequest -Uri "https://go.microsoft.com/fwlink/p/?LinkId=2124703" -OutFile "$env:TEMP\MicrosoftEdgeWebview2Setup.exe" ; Start-Process -FilePath "$env:TEMP\MicrosoftEdgeWebview2Setup.exe" -ArgumentList ({{webview_installer_args}} &apos;/install&apos;) -Wait' Return='check'/>
<InstallExecuteSequence>
<Custom Action='DownloadAndInvokeBootstrapper' Before='InstallFinalize'>
<![CDATA[NOT(REMOVE OR WVRTINSTALLED)]]>
</Custom>
</InstallExecuteSequence>
{{/if}}
<!-- Embedded webview bootstrapper mode -->
{{#if webview2_bootstrapper_path}}
<Binary Id="MicrosoftEdgeWebview2Setup.exe" SourceFile="{{webview2_bootstrapper_path}}"/>
<CustomAction Id='InvokeBootstrapper' BinaryKey='MicrosoftEdgeWebview2Setup.exe' Execute="deferred" ExeCommand='{{webview_installer_args}} /install' Return='check' />
<InstallExecuteSequence>
<Custom Action='InvokeBootstrapper' Before='InstallFinalize'>
<![CDATA[NOT(REMOVE OR WVRTINSTALLED)]]>
</Custom>
</InstallExecuteSequence>
{{/if}}
<!-- Embedded offline installer -->
{{#if webview2_installer_path}}
<Binary Id="MicrosoftEdgeWebView2RuntimeInstaller.exe" SourceFile="{{webview2_installer_path}}"/>
<CustomAction Id='InvokeStandalone' BinaryKey='MicrosoftEdgeWebView2RuntimeInstaller.exe' Execute="deferred" ExeCommand='{{webview_installer_args}} /install' Return='check' />
<InstallExecuteSequence>
<Custom Action='InvokeStandalone' Before='InstallFinalize'>
<![CDATA[NOT(REMOVE OR WVRTINSTALLED)]]>
</Custom>
</InstallExecuteSequence>
{{/if}}
{{/if}}
{{#if enable_elevated_update_task}}
<!-- Install an elevated update task within Windows Task Scheduler -->
<CustomAction
Id="CreateUpdateTask"
Return="check"
Directory="INSTALLDIR"
Execute="commit"
Impersonate="yes"
ExeCommand="powershell.exe -WindowStyle hidden .\install-task.ps1" />
<InstallExecuteSequence>
<Custom Action='CreateUpdateTask' Before='InstallFinalize'>
NOT(REMOVE)
</Custom>
</InstallExecuteSequence>
<!-- Remove elevated update task during uninstall -->
<CustomAction
Id="DeleteUpdateTask"
Return="check"
Directory="INSTALLDIR"
ExeCommand="powershell.exe -WindowStyle hidden .\uninstall-task.ps1" />
<InstallExecuteSequence>
<Custom Action="DeleteUpdateTask" Before='InstallFinalize'>
(REMOVE = "ALL") AND NOT UPGRADINGPRODUCTCODE
</Custom>
</InstallExecuteSequence>
{{/if}}
<SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLDIR]" After="CostFinalize"/>
</Product>
</Wix>

View File

@@ -1,13 +1,16 @@
{ {
"name": "@modrinth/app", "name": "@modrinth/app",
"scripts": { "scripts": {
"build": "cargo tauri build", "build": "tauri build",
"tauri": "cargo tauri", "tauri": "tauri",
"dev": "cargo tauri dev", "dev": "tauri dev",
"test": "cargo test", "test": "cargo test",
"lint": "cargo fmt --check && cargo clippy -- -D warnings", "lint": "cargo fmt --check && cargo clippy -- -D warnings",
"fix": "cargo fmt && cargo clippy --fix" "fix": "cargo fmt && cargo clippy --fix"
}, },
"devDependencies": {
"@tauri-apps/cli": "2.0.0-rc.16"
},
"dependencies": { "dependencies": {
"@modrinth/app-frontend": "workspace:*", "@modrinth/app-frontend": "workspace:*",
"@modrinth/app-lib": "workspace:*" "@modrinth/app-lib": "workspace:*"

View File

@@ -21,9 +21,6 @@
"certificateThumbprint": null, "certificateThumbprint": null,
"digestAlgorithm": "sha256", "digestAlgorithm": "sha256",
"timestampUrl": "http://timestamp.digicert.com", "timestampUrl": "http://timestamp.digicert.com",
"wix": {
"template": "./msi/main.wxs"
},
"nsis": { "nsis": {
"installMode": "perMachine", "installMode": "perMachine",
"installerHooks": "./nsis/hooks.nsi" "installerHooks": "./nsis/hooks.nsi"
@@ -52,8 +49,9 @@
] ]
}, },
"productName": "AstralRinth App", "productName": "AstralRinth App",
"version": "0.8.7", "version": "0.8.8",
"identifier": "AstralRinthApp", "identifier": "AstralRinthApp",
"mainBinaryName": "AstralRinth App",
"plugins": { "plugins": {
"deep-link": { "deep-link": {
"desktop": { "desktop": {

View File

@@ -0,0 +1,3 @@
{
"mainBinaryName": "ModrinthApp"
}

View File

@@ -57,7 +57,7 @@ export function createDisplayNames(
try { try {
return dict.of(lookup); return dict.of(lookup);
} catch (err) { } catch {
console.warn( console.warn(
`Failed to get display name for ${lookup} using dictionary for ${ `Failed to get display name for ${lookup} using dictionary for ${
this.resolvedOptions().locale this.resolvedOptions().locale

View File

@@ -1,21 +1,21 @@
import hljs from "highlight.js/lib/core"; import hljs from "highlight.js/lib/core";
// Scripting // Scripting
import javascript from "highlight.js/lib/languages/javascript"; import javascript from "highlight.js/lib/languages/javascript";
import python from "highlight.js/lib/languages/python";
import lua from "highlight.js/lib/languages/lua"; import lua from "highlight.js/lib/languages/lua";
import python from "highlight.js/lib/languages/python";
// Coding // Coding
import groovy from "highlight.js/lib/languages/groovy";
import java from "highlight.js/lib/languages/java"; import java from "highlight.js/lib/languages/java";
import kotlin from "highlight.js/lib/languages/kotlin"; import kotlin from "highlight.js/lib/languages/kotlin";
import scala from "highlight.js/lib/languages/scala"; import scala from "highlight.js/lib/languages/scala";
import groovy from "highlight.js/lib/languages/groovy";
// Configs // Configs
import { configuredXss, md } from "@modrinth/utils";
import gradle from "highlight.js/lib/languages/gradle"; import gradle from "highlight.js/lib/languages/gradle";
import json from "highlight.js/lib/languages/json";
import ini from "highlight.js/lib/languages/ini"; import ini from "highlight.js/lib/languages/ini";
import yaml from "highlight.js/lib/languages/yaml"; import json from "highlight.js/lib/languages/json";
import xml from "highlight.js/lib/languages/xml";
import properties from "highlight.js/lib/languages/properties"; import properties from "highlight.js/lib/languages/properties";
import { md, configuredXss } from "@modrinth/utils"; import xml from "highlight.js/lib/languages/xml";
import yaml from "highlight.js/lib/languages/yaml";
/* REGISTRATION */ /* REGISTRATION */
// Scripting // Scripting
@@ -54,7 +54,7 @@ export const renderHighlightedString = (string) =>
if (lang && hljs.getLanguage(lang)) { if (lang && hljs.getLanguage(lang)) {
try { try {
return hljs.highlight(str, { language: lang }).value; return hljs.highlight(str, { language: lang }).value;
} catch (__) { } catch {
/* empty */ /* empty */
} }
} }

View File

@@ -1398,7 +1398,7 @@ try {
versions = shallowRef(toRaw(versions)); versions = shallowRef(toRaw(versions));
featuredVersions = shallowRef(toRaw(featuredVersions)); featuredVersions = shallowRef(toRaw(featuredVersions));
} catch (error) { } catch {
throw createError({ throw createError({
fatal: true, fatal: true,
statusCode: 404, statusCode: 404,

View File

@@ -95,7 +95,7 @@ const props = defineProps<{
members: User[]; members: User[];
currentMember: User; currentMember: User;
dependencies: Dependency[]; dependencies: Dependency[];
resetProject: Function; resetProject: (opts?: { dedupe?: "cancel" | "defer" }) => Promise<void>;
}>(); }>();
const version = computed(() => { const version = computed(() => {

View File

@@ -27,6 +27,7 @@ const windowsLink = ref(null);
const linuxLinks = { const linuxLinks = {
appImage: null, appImage: null,
deb: null, deb: null,
rpm: null,
thirdParty: "https://support.modrinth.com/en/articles/9298760", thirdParty: "https://support.modrinth.com/en/articles/9298760",
}; };
const macLinks = { const macLinks = {
@@ -57,6 +58,7 @@ macLinks.intel = launcherUpdates.value.platforms["darwin-x86_64"].install_urls[0
windowsLink.value = launcherUpdates.value.platforms["windows-x86_64"].install_urls[0]; windowsLink.value = launcherUpdates.value.platforms["windows-x86_64"].install_urls[0];
linuxLinks.appImage = launcherUpdates.value.platforms["linux-x86_64"].install_urls[1]; linuxLinks.appImage = launcherUpdates.value.platforms["linux-x86_64"].install_urls[1];
linuxLinks.deb = launcherUpdates.value.platforms["linux-x86_64"].install_urls[0]; linuxLinks.deb = launcherUpdates.value.platforms["linux-x86_64"].install_urls[0];
linuxLinks.rpm = launcherUpdates.value.platforms["linux-x86_64"].install_urls[2];
onMounted(() => { onMounted(() => {
os.value = navigator?.platform.toString(); os.value = navigator?.platform.toString();
@@ -879,7 +881,11 @@ useSeoMeta({
</a> </a>
<a :href="linuxLinks.deb" download=""> <a :href="linuxLinks.deb" download="">
<DownloadIcon /> <DownloadIcon />
<span> Download the Deb </span> <span> Download the DEB </span>
</a>
<a :href="linuxLinks.rpm" download="">
<DownloadIcon />
<span> Download the RPM </span>
</a> </a>
<a :href="linuxLinks.thirdParty" download=""> <a :href="linuxLinks.thirdParty" download="">
<LinkIcon /> <LinkIcon />

View File

@@ -195,7 +195,7 @@ const onAuthorize = async () => {
} }
throw new Error(formatMessage(messages.noRedirectUrlError)); throw new Error(formatMessage(messages.noRedirectUrlError));
} catch (error) { } catch {
data.$notify({ data.$notify({
group: "main", group: "main",
title: formatMessage(commonMessages.errorNotificationTitle), title: formatMessage(commonMessages.errorNotificationTitle),
@@ -222,7 +222,7 @@ const onReject = async () => {
} }
throw new Error(formatMessage(messages.noRedirectUrlError)); throw new Error(formatMessage(messages.noRedirectUrlError));
} catch (error) { } catch {
data.$notify({ data.$notify({
group: "main", group: "main",
title: formatMessage(commonMessages.errorNotificationTitle), title: formatMessage(commonMessages.errorNotificationTitle),

View File

@@ -145,7 +145,7 @@ if (route.query.flow) {
await useAuth(auth.value.token); await useAuth(auth.value.token);
} }
} }
} catch (err) { } catch {
success.value = false; success.value = false;
} }
} }

View File

@@ -371,6 +371,22 @@
</div> </div>
</section> </section>
<section id="data-export" class="universal-card">
<h2>Data export</h2>
<p>
Request a copy of all your personal data you have uploaded to Modrinth. This may take
several minutes to complete.
</p>
<a v-if="generated" class="iconified-button" :href="generated" download="export.json">
<DownloadIcon />
Download export
</a>
<button v-else class="iconified-button" :disabled="generatingExport" @click="exportData">
<template v-if="generatingExport"> <UpdatedIcon /> Generating export... </template>
<template v-else> <UpdatedIcon /> Generate export </template>
</button>
</section>
<section id="delete-account" class="universal-card"> <section id="delete-account" class="universal-card">
<h2>Delete account</h2> <h2>Delete account</h2>
<p> <p>
@@ -391,16 +407,18 @@
<script setup> <script setup>
import { import {
EditIcon,
SaveIcon,
TrashIcon,
PlusIcon,
SettingsIcon,
XIcon,
LeftArrowIcon,
RightArrowIcon,
CheckIcon, CheckIcon,
EditIcon,
ExternalIcon, ExternalIcon,
LeftArrowIcon,
PlusIcon,
RightArrowIcon,
SaveIcon,
SettingsIcon,
TrashIcon,
UpdatedIcon,
XIcon,
DownloadIcon,
} from "@modrinth/assets"; } from "@modrinth/assets";
import QrcodeVue from "qrcode.vue"; import QrcodeVue from "qrcode.vue";
import GitHubIcon from "assets/icons/auth/sso-github.svg"; import GitHubIcon from "assets/icons/auth/sso-github.svg";
@@ -538,7 +556,7 @@ async function verifyTwoFactorCode() {
backupCodes.value = res.backup_codes; backupCodes.value = res.backup_codes;
twoFactorStep.value = 2; twoFactorStep.value = 2;
await useAuth(auth.value.token); await useAuth(auth.value.token);
} catch (err) { } catch {
twoFactorIncorrect.value = true; twoFactorIncorrect.value = true;
} }
stopLoading(); stopLoading();
@@ -555,7 +573,7 @@ async function removeTwoFactor() {
}); });
manageTwoFactorModal.value.hide(); manageTwoFactorModal.value.hide();
await useAuth(auth.value.token); await useAuth(auth.value.token);
} catch (err) { } catch {
twoFactorIncorrect.value = true; twoFactorIncorrect.value = true;
} }
stopLoading(); stopLoading();
@@ -614,6 +632,34 @@ async function deleteAccount() {
stopLoading(); stopLoading();
} }
const generatingExport = ref(false);
const generated = ref();
async function exportData() {
startLoading();
generatingExport.value = true;
try {
const res = await useBaseFetch("gdpr/export", {
method: "POST",
internal: true,
});
const jsonString = JSON.stringify(res, null, 2);
const blob = new Blob([jsonString], { type: "application/json" });
generated.value = URL.createObjectURL(blob);
} catch (err) {
data.$notify({
group: "main",
title: "An error occurred",
text: err.data.description,
type: "error",
});
}
generatingExport.value = false;
stopLoading();
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
canvas { canvas {

View File

@@ -301,7 +301,7 @@ const canSubmit = computed(() => {
const url = new URL(uri); const url = new URL(uri);
return !!url; return !!url;
}); });
} catch (err) { } catch {
allValid = false; allValid = false;
} }
return filledIn && (oneValid || allValid); return filledIn && (oneValid || allValid);

View File

@@ -226,7 +226,7 @@ async function changeLocale(value: string) {
try { try {
await vintl.changeLocale(value); await vintl.changeLocale(value);
$failedLocale.value = undefined; $failedLocale.value = undefined;
} catch (err) { } catch {
$failedLocale.value = value; $failedLocale.value = value;
} finally { } finally {
$changingTo.value = undefined; $changingTo.value = undefined;

View File

@@ -1,89 +1,110 @@
<!doctype html> <!doctype html>
<html> <html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Modrinth App Ad</title> <title>Modrinth App Ad</title>
<script <script
src="https://dn0qt3r0xannq.cloudfront.net/modrinth-7JfmkEIXEp/modrinth-longform/prebid-load.js" src="https://dn0qt3r0xannq.cloudfront.net/modrinth-7JfmkEIXEp/modrinth-longform/prebid-load.js"
async async
></script> ></script>
<link rel="preload" href="https://www.googletagservices.com/tag/js/gpt.js" as="script" /> <link rel="preload" href="https://www.googletagservices.com/tag/js/gpt.js" as="script" />
<style> <style>
* { * {
margin: 0; margin: 0;
padding: 0; padding: 0;
overflow: hidden; overflow: hidden;
cursor: pointer; cursor: pointer;
}
.ads-container {
width: 100vw;
height: 100vh;
overflow: hidden;
position: relative;
}
#plus-link {
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
z-index: 0;
}
#modrinth-rail-1 {
border-radius: 1rem;
position: absolute;
left: 0;
top: 0;
z-index: 2;
}
</style>
</head>
<body>
<div class="ads-container">
<a id="plus-link" href="https://modrinth.com/plus" target="_blank"></a>
<div id="modrinth-rail-1" />
</div>
<script>
window.tude = window.tude || { cmd: [] };
tude.cmd.push(function () {
tude.refreshAdsViaDivMappings([
{
divId: "modrinth-rail-1",
baseDivId: "pb-slot-square-2",
},
]);
});
window.addEventListener(
"message",
(event) => {
if (event.data.modrinthAdClick && window.__TAURI_INTERNALS__) {
window.__TAURI_INTERNALS__.invoke("plugin:ads|record_ads_click", {});
} }
if (event.data.modrinthOpenUrl && window.__TAURI_INTERNALS__) { .ads-container {
window.__TAURI_INTERNALS__.invoke("plugin:ads|open_link", { width: 100vw;
path: event.data.modrinthOpenUrl, height: 100vh;
origin: event.origin, overflow: hidden;
position: relative;
}
#plus-link {
width: 100vw;
height: 100vh;
position: absolute;
top: 0;
left: 0;
z-index: 0;
}
#modrinth-rail-1 {
border-radius: 1rem;
position: absolute;
left: 0;
top: 0;
z-index: 2;
}
</style>
</head>
<body>
<div class="ads-container">
<div id="plus-link"></div>
<div id="modrinth-rail-1" />
</div>
<script>
function initAds(personalized) {
window.tude = window.tude || { cmd: [] };
tude.cmd.push(function () {
tude.refreshAdsViaDivMappings([
{
divId: "modrinth-rail-1",
baseDivId: "pb-slot-square-2",
},
]);
tude.setPrivacySettings({
personalizedAds: personalized ?? true,
});
}); });
} }
},
false,
);
window.addEventListener("mousewheel", (event) => { window.__TAURI_INTERNALS__
if (window.__TAURI_INTERNALS__) { .invoke("plugin:ads|get_ads_personalization", {})
window.__TAURI_INTERNALS__.invoke("plugin:ads|scroll_ads_window", { .then(initAds)
scroll: event.deltaY, .catch(() => initAds(true));
window.addEventListener(
"message",
(event) => {
if (event.data.modrinthAdClick && window.__TAURI_INTERNALS__) {
window.__TAURI_INTERNALS__.invoke("plugin:ads|record_ads_click", {});
}
if (event.data.modrinthOpenUrl && window.__TAURI_INTERNALS__) {
window.__TAURI_INTERNALS__.invoke("plugin:ads|open_link", {
path: event.data.modrinthOpenUrl,
origin: event.origin,
});
}
},
false,
);
window.addEventListener("mousewheel", (event) => {
if (window.__TAURI_INTERNALS__) {
window.__TAURI_INTERNALS__.invoke("plugin:ads|scroll_ads_window", {
scroll: event.deltaY,
});
}
}); });
}
});
document.addEventListener("contextmenu", (event) => event.preventDefault()); document.addEventListener("contextmenu", (event) => event.preventDefault());
</script>
</body> const plusLink = document.getElementById("plus-link");
plusLink.addEventListener("click", function () {
window.__TAURI_INTERNALS__.invoke("plugin:ads|record_ads_click", {});
window.__TAURI_INTERNALS__.invoke("plugin:ads|open_link", {
path: "https://modrinth.com/plus",
origin: "https://modrinth.com",
});
});
</script>
</body>
</html> </html>

View File

@@ -0,0 +1,12 @@
{
"db_name": "SQLite",
"query": "\n UPDATE settings\n SET\n max_concurrent_writes = $1,\n max_concurrent_downloads = $2,\n\n theme = $3,\n default_page = $4,\n collapsed_navigation = $5,\n advanced_rendering = $6,\n native_decorations = $7,\n\n discord_rpc = $8,\n developer_mode = $9,\n telemetry = $10,\n personalized_ads = $11,\n\n onboarded = $12,\n\n extra_launch_args = jsonb($13),\n custom_env_vars = jsonb($14),\n mc_memory_max = $15,\n mc_force_fullscreen = $16,\n mc_game_resolution_x = $17,\n mc_game_resolution_y = $18,\n hide_on_process_start = $19,\n\n hook_pre_launch = $20,\n hook_wrapper = $21,\n hook_post_exit = $22,\n\n custom_dir = $23,\n prev_custom_dir = $24,\n migrated = $25\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 25
},
"nullable": []
},
"hash": "26e3ed8680f6c492b03b458aabfb3f94fddc753b343ef705263188945d0e578d"
}

View File

@@ -1,6 +1,6 @@
{ {
"db_name": "SQLite", "db_name": "SQLite",
"query": "\n SELECT\n max_concurrent_writes, max_concurrent_downloads,\n theme, default_page, collapsed_navigation, advanced_rendering, native_decorations,\n discord_rpc, developer_mode, telemetry,\n onboarded,\n json(extra_launch_args) extra_launch_args, json(custom_env_vars) custom_env_vars,\n mc_memory_max, mc_force_fullscreen, mc_game_resolution_x, mc_game_resolution_y, hide_on_process_start,\n hook_pre_launch, hook_wrapper, hook_post_exit,\n custom_dir, prev_custom_dir, migrated\n FROM settings\n ", "query": "\n SELECT\n max_concurrent_writes, max_concurrent_downloads,\n theme, default_page, collapsed_navigation, advanced_rendering, native_decorations,\n discord_rpc, developer_mode, telemetry, personalized_ads,\n onboarded,\n json(extra_launch_args) extra_launch_args, json(custom_env_vars) custom_env_vars,\n mc_memory_max, mc_force_fullscreen, mc_game_resolution_x, mc_game_resolution_y, hide_on_process_start,\n hook_pre_launch, hook_wrapper, hook_post_exit,\n custom_dir, prev_custom_dir, migrated\n FROM settings\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@@ -54,73 +54,78 @@
"type_info": "Integer" "type_info": "Integer"
}, },
{ {
"name": "onboarded", "name": "personalized_ads",
"ordinal": 10, "ordinal": 10,
"type_info": "Integer" "type_info": "Integer"
}, },
{ {
"name": "extra_launch_args", "name": "onboarded",
"ordinal": 11, "ordinal": 11,
"type_info": "Text" "type_info": "Integer"
}, },
{ {
"name": "custom_env_vars", "name": "extra_launch_args",
"ordinal": 12, "ordinal": 12,
"type_info": "Text" "type_info": "Text"
}, },
{ {
"name": "mc_memory_max", "name": "custom_env_vars",
"ordinal": 13, "ordinal": 13,
"type_info": "Integer" "type_info": "Text"
}, },
{ {
"name": "mc_force_fullscreen", "name": "mc_memory_max",
"ordinal": 14, "ordinal": 14,
"type_info": "Integer" "type_info": "Integer"
}, },
{ {
"name": "mc_game_resolution_x", "name": "mc_force_fullscreen",
"ordinal": 15, "ordinal": 15,
"type_info": "Integer" "type_info": "Integer"
}, },
{ {
"name": "mc_game_resolution_y", "name": "mc_game_resolution_x",
"ordinal": 16, "ordinal": 16,
"type_info": "Integer" "type_info": "Integer"
}, },
{ {
"name": "hide_on_process_start", "name": "mc_game_resolution_y",
"ordinal": 17, "ordinal": 17,
"type_info": "Integer" "type_info": "Integer"
}, },
{ {
"name": "hook_pre_launch", "name": "hide_on_process_start",
"ordinal": 18, "ordinal": 18,
"type_info": "Text" "type_info": "Integer"
}, },
{ {
"name": "hook_wrapper", "name": "hook_pre_launch",
"ordinal": 19, "ordinal": 19,
"type_info": "Text" "type_info": "Text"
}, },
{ {
"name": "hook_post_exit", "name": "hook_wrapper",
"ordinal": 20, "ordinal": 20,
"type_info": "Text" "type_info": "Text"
}, },
{ {
"name": "custom_dir", "name": "hook_post_exit",
"ordinal": 21, "ordinal": 21,
"type_info": "Text" "type_info": "Text"
}, },
{ {
"name": "prev_custom_dir", "name": "custom_dir",
"ordinal": 22, "ordinal": 22,
"type_info": "Text" "type_info": "Text"
}, },
{ {
"name": "migrated", "name": "prev_custom_dir",
"ordinal": 23, "ordinal": 23,
"type_info": "Text"
},
{
"name": "migrated",
"ordinal": 24,
"type_info": "Integer" "type_info": "Integer"
} }
], ],
@@ -139,6 +144,7 @@
false, false,
false, false,
false, false,
false,
null, null,
null, null,
false, false,
@@ -154,5 +160,5 @@
false false
] ]
}, },
"hash": "03d1aeddf7788320530c447a82342aecdb4099ce183dd9106c4bcc47604cb080" "hash": "8e19c9cdb0aaa48509724e82f6e8f212c9cd2112fdba77cfeee206025af47761"
} }

View File

@@ -1,12 +0,0 @@
{
"db_name": "SQLite",
"query": "\n UPDATE settings\n SET\n max_concurrent_writes = $1,\n max_concurrent_downloads = $2,\n\n theme = $3,\n default_page = $4,\n collapsed_navigation = $5,\n advanced_rendering = $6,\n native_decorations = $7,\n\n discord_rpc = $8,\n developer_mode = $9,\n telemetry = $10,\n\n onboarded = $11,\n\n extra_launch_args = jsonb($12),\n custom_env_vars = jsonb($13),\n mc_memory_max = $14,\n mc_force_fullscreen = $15,\n mc_game_resolution_x = $16,\n mc_game_resolution_y = $17,\n hide_on_process_start = $18,\n\n hook_pre_launch = $19,\n hook_wrapper = $20,\n hook_post_exit = $21,\n\n custom_dir = $22,\n prev_custom_dir = $23,\n migrated = $24\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 24
},
"nullable": []
},
"hash": "d645daf951ff6fead3c86df685d99bacc81cb0a999c0f8d2ff7755b0089a79d8"
}

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "theseus" name = "theseus"
version = "0.8.7" version = "0.8.8"
authors = ["Jai A <jaiagr+gpg@pm.me>"] authors = ["Jai A <jaiagr+gpg@pm.me>"]
edition = "2021" edition = "2021"
@@ -36,7 +36,7 @@ tracing-error = "0.2.0"
paste = { version = "1.0" } paste = { version = "1.0" }
tauri = { git = "https://github.com/modrinth/tauri", rev = "5e29428", optional = true } tauri = { version = "2.0.0-rc", optional = true }
indicatif = { version = "0.17.3", optional = true } indicatif = { version = "0.17.3", optional = true }
async-tungstenite = { version = "0.27.0", features = ["tokio-runtime", "tokio-rustls-webpki-roots"] } async-tungstenite = { version = "0.27.0", features = ["tokio-runtime", "tokio-rustls-webpki-roots"] }

View File

@@ -0,0 +1 @@
ALTER TABLE settings ADD COLUMN personalized_ads INTEGER NOT NULL DEFAULT TRUE;

View File

@@ -17,6 +17,7 @@ pub struct Settings {
pub telemetry: bool, pub telemetry: bool,
pub discord_rpc: bool, pub discord_rpc: bool,
pub developer_mode: bool, pub developer_mode: bool,
pub personalized_ads: bool,
pub onboarded: bool, pub onboarded: bool,
@@ -42,7 +43,7 @@ impl Settings {
SELECT SELECT
max_concurrent_writes, max_concurrent_downloads, max_concurrent_writes, max_concurrent_downloads,
theme, default_page, collapsed_navigation, advanced_rendering, native_decorations, theme, default_page, collapsed_navigation, advanced_rendering, native_decorations,
discord_rpc, developer_mode, telemetry, discord_rpc, developer_mode, telemetry, personalized_ads,
onboarded, onboarded,
json(extra_launch_args) extra_launch_args, json(custom_env_vars) custom_env_vars, json(extra_launch_args) extra_launch_args, json(custom_env_vars) custom_env_vars,
mc_memory_max, mc_force_fullscreen, mc_game_resolution_x, mc_game_resolution_y, hide_on_process_start, mc_memory_max, mc_force_fullscreen, mc_game_resolution_x, mc_game_resolution_y, hide_on_process_start,
@@ -65,6 +66,7 @@ impl Settings {
telemetry: res.telemetry == 1, telemetry: res.telemetry == 1,
discord_rpc: res.discord_rpc == 1, discord_rpc: res.discord_rpc == 1,
developer_mode: res.developer_mode == 1, developer_mode: res.developer_mode == 1,
personalized_ads: res.personalized_ads == 1,
onboarded: res.onboarded == 1, onboarded: res.onboarded == 1,
extra_launch_args: res extra_launch_args: res
.extra_launch_args .extra_launch_args
@@ -123,24 +125,25 @@ impl Settings {
discord_rpc = $8, discord_rpc = $8,
developer_mode = $9, developer_mode = $9,
telemetry = $10, telemetry = $10,
personalized_ads = $11,
onboarded = $11, onboarded = $12,
extra_launch_args = jsonb($12), extra_launch_args = jsonb($13),
custom_env_vars = jsonb($13), custom_env_vars = jsonb($14),
mc_memory_max = $14, mc_memory_max = $15,
mc_force_fullscreen = $15, mc_force_fullscreen = $16,
mc_game_resolution_x = $16, mc_game_resolution_x = $17,
mc_game_resolution_y = $17, mc_game_resolution_y = $18,
hide_on_process_start = $18, hide_on_process_start = $19,
hook_pre_launch = $19, hook_pre_launch = $20,
hook_wrapper = $20, hook_wrapper = $21,
hook_post_exit = $21, hook_post_exit = $22,
custom_dir = $22, custom_dir = $23,
prev_custom_dir = $23, prev_custom_dir = $24,
migrated = $24 migrated = $25
", ",
max_concurrent_writes, max_concurrent_writes,
max_concurrent_downloads, max_concurrent_downloads,
@@ -152,6 +155,7 @@ impl Settings {
self.discord_rpc, self.discord_rpc,
self.developer_mode, self.developer_mode,
self.telemetry, self.telemetry,
self.personalized_ads,
self.onboarded, self.onboarded,
extra_launch_args, extra_launch_args,
custom_env_vars, custom_env_vars,

View File

@@ -1,21 +1,21 @@
import hljs from 'highlight.js/lib/core' import hljs from 'highlight.js/lib/core'
// Scripting // Scripting
import javascript from 'highlight.js/lib/languages/javascript' import javascript from 'highlight.js/lib/languages/javascript'
import python from 'highlight.js/lib/languages/python'
import lua from 'highlight.js/lib/languages/lua' import lua from 'highlight.js/lib/languages/lua'
import python from 'highlight.js/lib/languages/python'
// Coding // Coding
import groovy from 'highlight.js/lib/languages/groovy'
import java from 'highlight.js/lib/languages/java' import java from 'highlight.js/lib/languages/java'
import kotlin from 'highlight.js/lib/languages/kotlin' import kotlin from 'highlight.js/lib/languages/kotlin'
import scala from 'highlight.js/lib/languages/scala' import scala from 'highlight.js/lib/languages/scala'
import groovy from 'highlight.js/lib/languages/groovy'
// Configs // Configs
import gradle from 'highlight.js/lib/languages/gradle' import gradle from 'highlight.js/lib/languages/gradle'
import json from 'highlight.js/lib/languages/json'
import ini from 'highlight.js/lib/languages/ini' import ini from 'highlight.js/lib/languages/ini'
import yaml from 'highlight.js/lib/languages/yaml' import json from 'highlight.js/lib/languages/json'
import xml from 'highlight.js/lib/languages/xml'
import properties from 'highlight.js/lib/languages/properties' import properties from 'highlight.js/lib/languages/properties'
import { md, configuredXss } from './parse' import xml from 'highlight.js/lib/languages/xml'
import yaml from 'highlight.js/lib/languages/yaml'
import { configuredXss, md } from './parse'
/* REGISTRATION */ /* REGISTRATION */
// Scripting // Scripting
@@ -54,7 +54,7 @@ export const renderHighlightedString = (string) =>
if (lang && hljs.getLanguage(lang)) { if (lang && hljs.getLanguage(lang)) {
try { try {
return hljs.highlight(str, { language: lang }).value return hljs.highlight(str, { language: lang }).value
} catch (__) { } catch {
/* empty */ /* empty */
} }
} }

View File

@@ -1,4 +1,4 @@
const BASE62_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' as const export const BASE62_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
type Base62Char = (typeof BASE62_CHARS)[number] type Base62Char = (typeof BASE62_CHARS)[number]
declare global { declare global {

View File

@@ -77,7 +77,11 @@ export const configuredXss = new FilterXSS({
} }
}, },
safeAttrValue(tag, name, value, cssFilter) { safeAttrValue(tag, name, value, cssFilter) {
if (tag === 'img' && name === 'src' && !value.startsWith('data:')) { if (
(tag === 'img' || tag === 'video' || tag === 'audio' || tag === 'source') &&
(name === 'src' || name === 'srcset') &&
!value.startsWith('data:')
) {
try { try {
const url = new URL(value) const url = new URL(value)
@@ -112,7 +116,7 @@ export const configuredXss = new FilterXSS({
) )
} }
return safeAttrValue(tag, name, url.toString(), cssFilter) return safeAttrValue(tag, name, url.toString(), cssFilter)
} catch (err) { } catch {
/* empty */ /* empty */
} }
} }
@@ -149,7 +153,7 @@ export const md = (options = {}) => {
if (allowedHostnames.includes(url.hostname)) { if (allowedHostnames.includes(url.hostname)) {
return defaultLinkOpenRenderer(tokens, idx, options, env, self) return defaultLinkOpenRenderer(tokens, idx, options, env, self)
} }
} catch (err) { } catch {
/* empty */ /* empty */
} }
} }

2978
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff