From 028c9d8e930c1fe889fa2467b2996e1cd95604d7 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 12:32:13 -0300 Subject: [PATCH 01/90] feat: publish native wrappers --- .github/workflows/publish-apps.yml | 106 + .gitignore | 1 + README.md | 21 + frontend/android/.gitignore | 101 + frontend/android/app/.gitignore | 2 + frontend/android/app/build.gradle | 54 + frontend/android/app/capacitor.build.gradle | 19 + frontend/android/app/proguard-rules.pro | 21 + .../myapp/ExampleInstrumentedTest.java | 26 + .../android/app/src/main/AndroidManifest.xml | 42 + .../java/com/mailflow/app/MainActivity.java | 5 + .../main/res/drawable-land-hdpi/splash.png | Bin 0 -> 7705 bytes .../main/res/drawable-land-mdpi/splash.png | Bin 0 -> 4040 bytes .../main/res/drawable-land-xhdpi/splash.png | Bin 0 -> 9251 bytes .../main/res/drawable-land-xxhdpi/splash.png | Bin 0 -> 13984 bytes .../main/res/drawable-land-xxxhdpi/splash.png | Bin 0 -> 17683 bytes .../main/res/drawable-port-hdpi/splash.png | Bin 0 -> 7934 bytes .../main/res/drawable-port-mdpi/splash.png | Bin 0 -> 4096 bytes .../main/res/drawable-port-xhdpi/splash.png | Bin 0 -> 9875 bytes .../main/res/drawable-port-xxhdpi/splash.png | Bin 0 -> 13346 bytes .../main/res/drawable-port-xxxhdpi/splash.png | Bin 0 -> 17489 bytes .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable/ic_launcher_background.xml | 170 + .../app/src/main/res/drawable/splash.png | Bin 0 -> 4040 bytes .../app/src/main/res/layout/activity_main.xml | 12 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2786 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 3450 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4341 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1869 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2110 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2725 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3981 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 5036 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6593 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6644 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 9793 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10455 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9441 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 15529 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15916 bytes .../res/values/ic_launcher_background.xml | 4 + .../app/src/main/res/values/strings.xml | 7 + .../app/src/main/res/values/styles.xml | 22 + .../app/src/main/res/xml/file_paths.xml | 5 + .../getcapacitor/myapp/ExampleUnitTest.java | 18 + frontend/android/build.gradle | 29 + frontend/android/capacitor.settings.gradle | 3 + frontend/android/gradle.properties | 22 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43764 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + frontend/android/gradlew | 251 + frontend/android/gradlew.bat | 94 + frontend/android/settings.gradle | 5 + frontend/android/variables.gradle | 16 + frontend/capacitor.config.json | 10 + frontend/electron/main.cjs | 134 + frontend/electron/preload.cjs | 7 + frontend/native-shell/index.html | 184 + frontend/package-lock.json | 4958 +++++++++++++++-- frontend/package.json | 45 +- frontend/scripts/build-android.cjs | 14 + frontend/scripts/prepare-native-shell.cjs | 9 + 64 files changed, 6143 insertions(+), 325 deletions(-) create mode 100644 .github/workflows/publish-apps.yml create mode 100644 frontend/android/.gitignore create mode 100644 frontend/android/app/.gitignore create mode 100644 frontend/android/app/build.gradle create mode 100644 frontend/android/app/capacitor.build.gradle create mode 100644 frontend/android/app/proguard-rules.pro create mode 100644 frontend/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java create mode 100644 frontend/android/app/src/main/AndroidManifest.xml create mode 100644 frontend/android/app/src/main/java/com/mailflow/app/MainActivity.java create mode 100644 frontend/android/app/src/main/res/drawable-land-hdpi/splash.png create mode 100644 frontend/android/app/src/main/res/drawable-land-mdpi/splash.png create mode 100644 frontend/android/app/src/main/res/drawable-land-xhdpi/splash.png create mode 100644 frontend/android/app/src/main/res/drawable-land-xxhdpi/splash.png create mode 100644 frontend/android/app/src/main/res/drawable-land-xxxhdpi/splash.png create mode 100644 frontend/android/app/src/main/res/drawable-port-hdpi/splash.png create mode 100644 frontend/android/app/src/main/res/drawable-port-mdpi/splash.png create mode 100644 frontend/android/app/src/main/res/drawable-port-xhdpi/splash.png create mode 100644 frontend/android/app/src/main/res/drawable-port-xxhdpi/splash.png create mode 100644 frontend/android/app/src/main/res/drawable-port-xxxhdpi/splash.png create mode 100644 frontend/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 frontend/android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 frontend/android/app/src/main/res/drawable/splash.png create mode 100644 frontend/android/app/src/main/res/layout/activity_main.xml create mode 100644 frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 frontend/android/app/src/main/res/values/ic_launcher_background.xml create mode 100644 frontend/android/app/src/main/res/values/strings.xml create mode 100644 frontend/android/app/src/main/res/values/styles.xml create mode 100644 frontend/android/app/src/main/res/xml/file_paths.xml create mode 100644 frontend/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java create mode 100644 frontend/android/build.gradle create mode 100644 frontend/android/capacitor.settings.gradle create mode 100644 frontend/android/gradle.properties create mode 100644 frontend/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 frontend/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 frontend/android/gradlew create mode 100644 frontend/android/gradlew.bat create mode 100644 frontend/android/settings.gradle create mode 100644 frontend/android/variables.gradle create mode 100644 frontend/capacitor.config.json create mode 100644 frontend/electron/main.cjs create mode 100644 frontend/electron/preload.cjs create mode 100644 frontend/native-shell/index.html create mode 100644 frontend/scripts/build-android.cjs create mode 100644 frontend/scripts/prepare-native-shell.cjs diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml new file mode 100644 index 00000000..1f9ff74a --- /dev/null +++ b/.github/workflows/publish-apps.yml @@ -0,0 +1,106 @@ +name: Publish Apps + +on: + push: + tags: + - 'v*.*.*' + workflow_dispatch: + +permissions: + contents: write + +jobs: + desktop: + name: Electron (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + os: + - windows-latest + - macos-latest + - ubuntu-latest + + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-node@v6 + with: + node-version: "22" + cache: "npm" + cache-dependency-path: frontend/package-lock.json + + - name: Install dependencies + working-directory: frontend + run: npm ci + + - name: Build Electron package + working-directory: frontend + run: npm run electron:dist + env: + CSC_IDENTITY_AUTO_DISCOVERY: "false" + + - name: Upload Electron artifacts + uses: actions/upload-artifact@v4 + with: + name: mailflow-electron-${{ matrix.os }} + path: | + frontend/release/*.AppImage + frontend/release/*.deb + frontend/release/*.dmg + frontend/release/*.exe + frontend/release/*.zip + + android: + name: Android + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-node@v6 + with: + node-version: "22" + cache: "npm" + cache-dependency-path: frontend/package-lock.json + + - uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: "21" + + - uses: android-actions/setup-android@v3 + + - name: Install dependencies + working-directory: frontend + run: npm ci + + - name: Build Android package + working-directory: frontend + run: npm run android:dist + + - name: Upload Android artifact + uses: actions/upload-artifact@v4 + with: + name: mailflow-android + path: frontend/android/app/build/outputs/apk/release/*.apk + + release: + name: Attach to GitHub Release + needs: + - desktop + - android + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + + steps: + - name: Download artifacts + uses: actions/download-artifact@v4 + with: + path: artifacts + + - name: Publish release files + uses: softprops/action-gh-release@v2 + with: + files: artifacts/**/* diff --git a/.gitignore b/.gitignore index eebffc65..98316bb6 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ node_modules/ # Build output frontend/dist/ frontend/.vite/ +frontend/release/ # TLS certs (generated locally or via Let's Encrypt) certs/ diff --git a/README.md b/README.md index c057cbad..ba5e3a38 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,27 @@ There are three ways to run MailFlow. The pre-built image method is recommended --- +## Desktop and Android apps + +MailFlow remains a self-hosted web app, but release builds can also publish native wrappers for users who prefer an installed app alongside the PWA. + +- Windows, macOS, and Linux use Electron packages. +- Android uses a Capacitor WebView package, because Electron does not support Android. +- On first launch, the wrapper asks for the MailFlow host, such as `https://mail.your-domain.com`, stores it locally, and opens that server. + +To build locally: + +```bash +cd frontend +npm ci +npm run electron:dist +npm run android:dist +``` + +Android builds require a local JDK and Android SDK. The `.github/workflows/publish-apps.yml` workflow installs those tools in CI and attaches app artifacts to tagged releases. + +--- + ## Option A — Pre-built images (recommended) No cloning or building required. Docker pulls the pre-built images directly from GHCR. diff --git a/frontend/android/.gitignore b/frontend/android/.gitignore new file mode 100644 index 00000000..48354a3d --- /dev/null +++ b/frontend/android/.gitignore @@ -0,0 +1,101 @@ +# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore + +# Built application files +*.apk +*.aar +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +# Uncomment the following line in case you need and you don't have the release build type files in your app +# release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild +.cxx/ + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + +# Android Profiling +*.hprof + +# Cordova plugins for Capacitor +capacitor-cordova-android-plugins + +# Copied web assets +app/src/main/assets/public + +# Generated Config files +app/src/main/assets/capacitor.config.json +app/src/main/assets/capacitor.plugins.json +app/src/main/res/xml/config.xml diff --git a/frontend/android/app/.gitignore b/frontend/android/app/.gitignore new file mode 100644 index 00000000..043df802 --- /dev/null +++ b/frontend/android/app/.gitignore @@ -0,0 +1,2 @@ +/build/* +!/build/.npmkeep diff --git a/frontend/android/app/build.gradle b/frontend/android/app/build.gradle new file mode 100644 index 00000000..6437d7b9 --- /dev/null +++ b/frontend/android/app/build.gradle @@ -0,0 +1,54 @@ +apply plugin: 'com.android.application' + +android { + namespace = "com.mailflow.app" + compileSdk = rootProject.ext.compileSdkVersion + defaultConfig { + applicationId "com.mailflow.app" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + aaptOptions { + // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. + // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 + ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' + } + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +repositories { + flatDir{ + dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" + implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" + implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" + implementation project(':capacitor-android') + testImplementation "junit:junit:$junitVersion" + androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" + androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" + implementation project(':capacitor-cordova-android-plugins') +} + +apply from: 'capacitor.build.gradle' + +try { + def servicesJSON = file('google-services.json') + if (servicesJSON.text) { + apply plugin: 'com.google.gms.google-services' + } +} catch(Exception e) { + logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") +} diff --git a/frontend/android/app/capacitor.build.gradle b/frontend/android/app/capacitor.build.gradle new file mode 100644 index 00000000..bbfb44fa --- /dev/null +++ b/frontend/android/app/capacitor.build.gradle @@ -0,0 +1,19 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN + +android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 + } +} + +apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" +dependencies { + + +} + + +if (hasProperty('postBuildExtras')) { + postBuildExtras() +} diff --git a/frontend/android/app/proguard-rules.pro b/frontend/android/app/proguard-rules.pro new file mode 100644 index 00000000..f1b42451 --- /dev/null +++ b/frontend/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/frontend/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/frontend/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java new file mode 100644 index 00000000..f2c2217e --- /dev/null +++ b/frontend/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.getcapacitor.myapp; + +import static org.junit.Assert.*; + +import android.content.Context; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.getcapacitor.app", appContext.getPackageName()); + } +} diff --git a/frontend/android/app/src/main/AndroidManifest.xml b/frontend/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..de737252 --- /dev/null +++ b/frontend/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/android/app/src/main/java/com/mailflow/app/MainActivity.java b/frontend/android/app/src/main/java/com/mailflow/app/MainActivity.java new file mode 100644 index 00000000..abc14e91 --- /dev/null +++ b/frontend/android/app/src/main/java/com/mailflow/app/MainActivity.java @@ -0,0 +1,5 @@ +package com.mailflow.app; + +import com.getcapacitor.BridgeActivity; + +public class MainActivity extends BridgeActivity {} diff --git a/frontend/android/app/src/main/res/drawable-land-hdpi/splash.png b/frontend/android/app/src/main/res/drawable-land-hdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..e31573b4fc93e60d171f4046c0220e1463075d9e GIT binary patch literal 7705 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 wKmFJ0_JHhk1&0B>;%YXATM literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/drawable-land-mdpi/splash.png b/frontend/android/app/src/main/res/drawable-land-mdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..f7a64923ea1a0565d25fa139c176d6bf42184e48 GIT binary patch literal 4040 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 XyOn+%7f`N3b2T^T3uj5+eShz7v)7qy literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/drawable-land-xhdpi/splash.png b/frontend/android/app/src/main/res/drawable-land-xhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..807725501bdd92e94e51e7b2b0006f69e0083a0b GIT binary patch literal 9251 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 literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/frontend/android/app/src/main/res/drawable-land-xxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..14c6c8fe39fcd51a0414866ad28cbe8ff3acb060 GIT binary patch literal 13984 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®q@N z14_H8ofW)l{|J8q+a)eH)I0r)>WXdzV%7J>PA~6_J)KLT90iYa^K=Wz7D!OybzqSru=f4?|KFl;Y)gP_H6V4x`~kZ6fE(xM1&;?72-TZNk+0 zr+Crr5yl%Iy@vfmt3eYFl!jIvPGFz^8Ek+2`48O1_pCX3xNWh-zBa{rIcc%+=|XVj zANYTg&s}TKb#OztQrCW(Xk?V^i{`q~%HtcveTxq(_HKeC9GzrtguMT4Nvs@KakPTA z9>*8bBZmLz`lK5=l)=b|=dT3a5ag^a1^znZyx5QKfUb1b9yacArRp%3@QWo(hrsCU z-K!-=jDmv!zb7XT>)r|-Z0Ry}lk2;dk-ECqMwr_nKN#x*X6~B5hVIN>6$1HwBz3Of z=Pk){AL5*=d90f17_qZEJLm;Q%WMdX=*N&!ki@E&cy7?>{1ssAH(tACtp*r@d^til z)x(1#6(kPD+joSF&J3sxJU@{-sWCS+pZq{Gsx=?z4wP;>?)1yHv0?X?VP{}cX4~aH zxeBPKw_rgW8rvewS1W2#^y+c>-183iMbJCqc38RN_o~__9-n|jcd&oA`m7*&Fqqpc z;Tev*0LS-ZK47Sq1unfvP1S43uA12P?PJmI8BeTYPr~R*tYUm^0;U%Hmu?bSZHEK6 zPjsW=E67Kq-&trmf;)UkmRABH2U)V)-eRT$j(%G12lLMsThSsU10iP#{)ZnvjzN$d z*K%P3`}oqyvpWP~venr>3viH8^`)Ma*=B31hw*Q+tqE>i2y7w!(o^lI^Yss^=tHW( z;cnCT(%B1gLz+TRGW9roFjI1EQTu-u`(f#RmZ8;FSN(bsC1J;+(i_R6mrW=yYx$cy z#%QKVrEx~kVMg~yo?^N28Wnk6x%L;J8i|*|ANEiNjq(Vhzuzl3ikpA*G!Z}kLAzAI z9qnySo%D|AuJj12%h;Otqjs(>LPj?rNdeU8so>P(C>XMzlho94ZD#w=cCOOU;=3&^ zsqAG!i{~lY271D|m>ztPV`)X@FO_;`wPjppYNQpM+ncvtz1lZjN>!Q^*I}T%uP78Z7tbV2$q3W_)14=kLFyJ z1GqL6T>ClgeZorL!}xP4f%OB_EsmJ`uw7dGWNV9OLlhb|UMpVhc{4@Bhh`tO!ZqzD zhusd<=K^ah!L@gQ?6dOpI-ge^e>S5W9eII57Zu16eU?GRbgKTeVk9yS{iK|O(zLR> zheb?;jwGCHS80NCn=jKxgJ>}qu4l%5NPihjzazGv#J?Jcyl;<#IW&x4mm>nrW8>}C z3U@aeD~)*F(0o^2{GnKVm$Jr#aZE ztl~TOkM^SdzJapQ((!-i8b!RkVQBKkL`2ZCBuy!qI1L{3Er526plVols~68U-^9Px zR(3{j;Z9RHX^muc0dUywJ|`yyZFf=k&-Gb#m4u73Lm5Ks%BfHj%2|gjn#i> zLC5pO$2Em9H;qoKQmMtl<@wgtPF1%2HariD5O~u>8=^*J&au~JH%Ih@&2Uging3U_ z0bzfKucW$ZHSx}!#buB?+-J)%RQbbXM-!BJTS&#dU_@lxU6>te2O+9 z@F{F{Nb!;{Cd`Gx+$G?11aB~S#wIH%D=*=7f7H@D@%B1)&bF$@t3JDq4l*%(wJTlh zo`?uMq{YilKUewPNaC)GuOr<8j9&ofqRU__BRUX^x8Cj3a;a$rXzgXqW>LR#CUn%~m)t zYC&ol(gAkbc^fd`xWU&bk5vT6KbFmsR=O78Bn%t7 znbw&=c+|T&#r+bls5rU6D#HMvqA<|;)BV%jOMonkm^p$7Vcel-Wwn$=uAJv&(8W>% z9))Fxpl*(%E#wFm_m!U~2HqgZs^2vaGeY(UfYKrSHV}w^D0N6!se5Ewy)Yy-!(2

aKj2hWG7>znxs|SE zN4rHtiSPqLskWp(?(_YYwgq+1@8v+~8As|(bC>$D(atG3ZE8-ZM3SVcg|vHQz$I=!(A`k`5= zOqR>&%G)$)k*QLz7MTB9wleWpv&N9Sta64wy}3Ytd?x!Ja8z>(z~(3UNFu^eFmn#6 zw!!gUxOuZi$PQIs*ixfZR3iLyADJ z5&s%tPfk>V!x|A-;oq%1!yk9H$UBP0ToA*EDtz(^!_AnF1bBQ7joj|? z5b)gSI8c8O$PYFE!vXJ<4gebg*9G9P2wcB{#kv0FItc5T@PDNo)}Rh4Us}L{e}xzW zhwt`)j`M)mP=G6H0;^&q=I0{jU%bIRkF#uLF;{vVC&H|_uc literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/frontend/android/app/src/main/res/drawable-land-xxxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..244ca2506dbe0fd8f6a05520ac7d1a629ea81438 GIT binary patch literal 17683 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 literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/frontend/android/app/src/main/res/drawable-port-xxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..bfabe6871a17a5e95b78fb30d49b7d2b4d2fe4c0 GIT binary patch literal 13346 zcmeHtX;_kJ`#04zO^aDmjwzz0HD;w|?h8>vW;LZ_?k1X=Ywq9%s7(u2rcRUQj;W;? z?mObrqFADUxi4r+2(G9IiVOaMW}f$Xp8tG#kK;X#_lqCy1MZvqIbjq1vUA2JAITZDzbJ0jFM$PIA*mcNVJ z;mf|x9&Xp&oNt8(esVJc05qE}UpQ|WHZV==FL$$wcsoBbd4YA2bV*k$^@^gYO5yc; zKa3?@Xom{!>s@%ZBVys0UhavwM=&Xqu&2r=6VK;t+=sq7*rZbW`w7y+eb2JbU-(TX z?dxnhoY#*kcFxS5n1!>5l)Ns(5rP?NYM2eHVMt=0Eb^}0h|-R{uA}z@BV#o#XpM@y}tclg8zH4>c0g4yD0JN z|68lS2k#c^`1jqvFT#FvNt<5!D~3h!u^D*Za(XkD#1`0uhfNUwdyCtIhySz5Z^FYS zJZ#o@|4{*N!o&Y(czAojH#2JM9bW=7YxylVaQb)n@)0z@aV)|q#za8bNC8;C*iz+0 ziGo9i_~+z|AaQj+W4T@MGVF$cXuDQhGySLDLUf?Oe>qBO9~Iz}k5zCi0;^BrH_TD2 zwdFp150!)zSU+hzsb*M^wPlNthzO;rkUwFHCh<{6Wo1Pq=w=Mp!ETKTuGkpzWaVR5 zoep||sJoM3awdXH&}~~~?`Yak6zZH`Gu0Nh4>g>p2!dJ0;3%{eg@%~GIRU-a3xYj` zJ8l4Rk`L8wD%~LsagJG;wmw-yD@jG^j94r)GMifbpVW`GT09rf6%n@4-wW$Ck2hF0 zy5!;bLnNr0-BAu#H*unnDw!1m;9;xYOg5uruY{1LndV_3Xs8_O_`)?{w`9K`Yog(r zr2Ipr;T1~9`X8wfK(5WPDXNg`eMy+&r+sK(7MyMIbc8&6+?#GS zMRnqTnk;%(@Ad3r!!0avN+C3Gk9w-4c#csVvnhp30K|YWOl=%T^ff9uGP-#UI2~ zGR+++d~f6}!>pKIZ?S#;VxtA;F_r3@|ow{wHe0y zaN0+HjLP7;93yj=xw?7dbO8FQ*mFIU)k-FMghNeN8LZpSI9k)6wp(dXzut!hD}<^~ z@}G^^wGZ{x;qhcf&~sQNv^MHqe~8e6FL)&S{5xP?CG+gD7#am?ARSX<_tKg(y^z^V z=qHsHF#TH`pRdvx?E;rWOJOhjRXfc0uxi!<&||?3*X}6iMF@5ROy6~4f23>_PBeE( zEp>5=C!PiIM=Hou2^eZyYI&4~#D-lR6D--hqbS~0(r139vDO|nTg$Z>vZOTA{-7<^ z)Y?k^XeSNlf035tm}SyY--UfH+bR+8m{+?zeQiG0)!5}H$aTW&>Yx0>qSXeaG^{6h z<3UfjMv>gE@u05VllgebAf#vi$X%4VMv@3FTpYWukP6YJPKG4m2;tP z;{P+U*{uli#7NPtQ{d~%qXiZK@L)Gv8l6*uR~3X9rf15i8)EYJ*&-02HQNL zdXf)O%k#SX% zOtSeJu0oPT!2uvNDbuAdE_ zU7b%C+c_%Ko;eGF_U<9$FkW9xo)#D5jcy0nqZ-Z(-yG2txw>2;Lm}(>u?2(F!AEla z(YMsi)a8d1OyqBakam<2;8|b3j84Qra$0#uJIK62y?NEqc}8rf4$Q2_AY(U$uHOd( zk>I4ycD{L9r{r5Mw=-h75XK5TG7}z*9rO!(Z49oXhoYZ;8Js4LsJz?pK0~bVWve)JakPbq(zO_*afxQ-uAjn@JM1 zM8cy%{ZNe|X3`EstE6@t`+~zK;L3>gZAv-Z$mIvtYtx^mtKo>?ViRt6=fbazOS`yx zgx0Z+RlTyL80 zilZ5)T54~jT9>9U6AlfnUP7-y#_(qG)r|o$67`PJamc!hiDa&(xiqiha7LjVWL;&R zWWv<3rECwiVt3wNXrAyf{W!*Di*-L-%p@q-|Mc~wdVdg90j7-zSHF2nIkBR8UCJ2f zcA#ZwU%Vj4g`QCRF~kkg**jdKPbg+4;XH&PdAf_E+@Ju72zX4wsXYp<3m~ENXOAoU ze?{fsP`j80HLz0Cv~izXRv9hxS^-L^%#?aXoN6z-{*2=Wp}|7f1bq7&B^2UNHNCed zD-FJ@B@EoLUzt7`sI#y3SBBxsQ}1w6jE`qaeC9v0L2cH>(h4islVjW->=xljONyk# zy8Wzo7-KYSHKr=kY_uXhJvLlk{WZ>1ahe`BO&@LM5*e1Kbn=ofPx6=%h7XbJkDH%G zkTQVZB-COd;aZU^ziIGlQt4GQ!L0nOm=ua8?){8j+ywu~O3e0YqquVBRKG0$(u78i z5X29%8-4+A`@!>078X+Zni)N1I5&V9=0&n1)lAHZAHHJ=WUm(xKVLiIknWkhUU)zT!5Et9Ihsy5;!~M zXF$<3%onWJ>^yGvTBh<$OsJE5v4tqwUKBIUMkz2SHlb@t;z0)qB72EJ9 zJdCp}_iF8U*c>pN z0|CS<-JRW6Yd=~iF-^7PmZ@2~AE=@@cJh7{n`<9pZR*awASyf1KMzUJqVrJ*)dk)sTQOkc?; z52Lj^#;p{+TT8{o%J63}8c{LMrATnPTa5$CTI__-8P)j@PJ3qh+D+hu&kk~KKLTyw z)x%U1Ixy5-`VaNz{;8y=4B_WVP!}XXH14^yhk%Wre`MU znFTL*zC9mV>(gF=)F{L*ZlLI}dA!1@UqeqqQZ4E@ujU6lgc6_cPsd~qsYu1&u6_S{ zO5d96U>i}Dmnq#CmBrqF$HIBLY}gsX>S)dQb748dJ<<)sbsZr`w3oy+N*%o zo*p=I_x^j_S2~b^7D)vKTGsk}X>U_Gc5?7Lp}P_!B4*l2gq^q{ximeirLV!7zBIi?alCqXbHixk4jyVr}W&mfH%^T zNpA7hu5=f_vx{nEmA2k2QuJwvoI#?px@nR_re|0{W3XspCHO4Y5VJXqMHwe{U-wLl1;9W=FY(ObYu& zRy2GUXUvS&W`OW!4#i5si--1rjY{`Q2se#!;L5;_v0;sSQA`pw9^Q36zy|+Rctm4MxL$m#6>gE+w|CUYoTOwnO}JE z@Upq#jp*Sp>=?Dld^U2nZ1hNXEo#pJBegQ|eC|Nx0I8$h*XyCzD}0}~gD>xR^jK_h z|B4SG60*45oF;<~*Qkc-U&nSZ9

VwO4Hu8X}%XHUAz_J@50rzbkIsat>4oWtQt< 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 literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/frontend/android/app/src/main/res/drawable-port-xxxhdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..6929071268eb03ee0f088142b6523566b78550e2 GIT binary patch literal 17489 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 KR&><$`~L^lv%S~= literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/frontend/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 00000000..c7bd21db --- /dev/null +++ b/frontend/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/frontend/android/app/src/main/res/drawable/ic_launcher_background.xml b/frontend/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..d5fccc53 --- /dev/null +++ b/frontend/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/android/app/src/main/res/drawable/splash.png b/frontend/android/app/src/main/res/drawable/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..f7a64923ea1a0565d25fa139c176d6bf42184e48 GIT binary patch literal 4040 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 XyOn+%7f`N3b2T^T3uj5+eShz7v)7qy literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/layout/activity_main.xml b/frontend/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..b5ad1387 --- /dev/null +++ b/frontend/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..036d09bc --- /dev/null +++ b/frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..036d09bc --- /dev/null +++ b/frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c023e50595074292c7361183a64de08cf9686c9c GIT binary patch literal 2786 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 literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..2127973b2d318df7085734d236d0ec649a2b0292 GIT binary patch literal 3450 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 literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d1e077104cd61e6a4c3707e87363b523077245a GIT binary patch literal 3981 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 nm0GElTB(&OnKI&V600000NkvXXu0mjff+~0a literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..df0f15880bee46332dfc6622583215194f948b0f GIT binary patch literal 5036 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 literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..6cdf97c1196d48e9833487ff6de7c4cfc4e1232d GIT binary patch literal 6644 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 literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..2960cbb6104b915c84760f889deed9bff2b3e17a GIT binary patch literal 9793 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 y3vD~Wi9;mL_v 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 literal 0 HcmV?d00001 diff --git a/frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..a40d73e9c68ea638c28c7b13e4bcd1e179a3a102 GIT binary patch literal 15916 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 + + #FFFFFF + \ No newline at end of file diff --git a/frontend/android/app/src/main/res/values/strings.xml b/frontend/android/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..9f88ad71 --- /dev/null +++ b/frontend/android/app/src/main/res/values/strings.xml @@ -0,0 +1,7 @@ + + + MailFlow + MailFlow + com.mailflow.app + com.mailflow.app + diff --git a/frontend/android/app/src/main/res/values/styles.xml b/frontend/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..be874e54 --- /dev/null +++ b/frontend/android/app/src/main/res/values/styles.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/android/app/src/main/res/xml/file_paths.xml b/frontend/android/app/src/main/res/xml/file_paths.xml new file mode 100644 index 00000000..bd0c4d80 --- /dev/null +++ b/frontend/android/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/frontend/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/frontend/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java new file mode 100644 index 00000000..02973278 --- /dev/null +++ b/frontend/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java @@ -0,0 +1,18 @@ +package com.getcapacitor.myapp; + +import static org.junit.Assert.*; + +import org.junit.Test; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +} diff --git a/frontend/android/build.gradle b/frontend/android/build.gradle new file mode 100644 index 00000000..f8f0e43b --- /dev/null +++ b/frontend/android/build.gradle @@ -0,0 +1,29 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.13.0' + classpath 'com.google.gms:google-services:4.4.4' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +apply from: "variables.gradle" + +allprojects { + repositories { + google() + mavenCentral() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/frontend/android/capacitor.settings.gradle b/frontend/android/capacitor.settings.gradle new file mode 100644 index 00000000..9a5fa872 --- /dev/null +++ b/frontend/android/capacitor.settings.gradle @@ -0,0 +1,3 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN +include ':capacitor-android' +project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') diff --git a/frontend/android/gradle.properties b/frontend/android/gradle.properties new file mode 100644 index 00000000..2e87c52f --- /dev/null +++ b/frontend/android/gradle.properties @@ -0,0 +1,22 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true diff --git a/frontend/android/gradle/wrapper/gradle-wrapper.jar b/frontend/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..1b33c55baabb587c669f562ae36f953de2481846 GIT binary patch literal 43764 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/frontend/android/gradlew.bat b/frontend/android/gradlew.bat new file mode 100644 index 00000000..db3a6ac2 --- /dev/null +++ b/frontend/android/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/frontend/android/settings.gradle b/frontend/android/settings.gradle new file mode 100644 index 00000000..3b4431d7 --- /dev/null +++ b/frontend/android/settings.gradle @@ -0,0 +1,5 @@ +include ':app' +include ':capacitor-cordova-android-plugins' +project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') + +apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/frontend/android/variables.gradle b/frontend/android/variables.gradle new file mode 100644 index 00000000..ee4ba41c --- /dev/null +++ b/frontend/android/variables.gradle @@ -0,0 +1,16 @@ +ext { + minSdkVersion = 24 + compileSdkVersion = 36 + targetSdkVersion = 36 + androidxActivityVersion = '1.11.0' + androidxAppCompatVersion = '1.7.1' + androidxCoordinatorLayoutVersion = '1.3.0' + androidxCoreVersion = '1.17.0' + androidxFragmentVersion = '1.8.9' + coreSplashScreenVersion = '1.2.0' + androidxWebkitVersion = '1.14.0' + junitVersion = '4.13.2' + androidxJunitVersion = '1.3.0' + androidxEspressoCoreVersion = '3.7.0' + cordovaAndroidVersion = '14.0.1' +} \ No newline at end of file diff --git a/frontend/capacitor.config.json b/frontend/capacitor.config.json new file mode 100644 index 00000000..1faf8b68 --- /dev/null +++ b/frontend/capacitor.config.json @@ -0,0 +1,10 @@ +{ + "appId": "com.mailflow.app", + "appName": "MailFlow", + "webDir": "dist", + "server": { + "allowNavigation": [ + "*" + ] + } +} diff --git a/frontend/electron/main.cjs b/frontend/electron/main.cjs new file mode 100644 index 00000000..e7f1375b --- /dev/null +++ b/frontend/electron/main.cjs @@ -0,0 +1,134 @@ +const { app, BrowserWindow, Menu, ipcMain, shell } = require('electron'); +const fs = require('fs'); +const path = require('path'); + +const CONFIG_FILE = 'mailflow-host.json'; + +let mainWindow; + +function getConfigPath() { + return path.join(app.getPath('userData'), CONFIG_FILE); +} + +function readHost() { + try { + const config = JSON.parse(fs.readFileSync(getConfigPath(), 'utf8')); + return normalizeHost(config.host); + } catch { + return null; + } +} + +function writeHost(host) { + const normalized = normalizeHost(host); + fs.mkdirSync(app.getPath('userData'), { recursive: true }); + fs.writeFileSync(getConfigPath(), JSON.stringify({ host: normalized }, null, 2)); + return normalized; +} + +function clearHost() { + try { + fs.rmSync(getConfigPath(), { force: true }); + } catch {} +} + +function normalizeHost(value) { + const input = String(value || '').trim(); + const url = new URL(input); + + if (!['https:', 'http:'].includes(url.protocol)) { + throw new Error('Host must start with https:// or http://'); + } + + url.username = ''; + url.password = ''; + url.hash = ''; + url.search = ''; + url.pathname = '/'; + + return url.toString().replace(/\/$/, ''); +} + +function setupMenu() { + const template = [ + ...(process.platform === 'darwin' ? [{ role: 'appMenu' }] : []), + { + label: 'MailFlow', + submenu: [ + { + label: 'Change MailFlow Host', + click: () => { + clearHost(); + loadSetup(); + }, + }, + { type: 'separator' }, + { role: 'reload' }, + { role: 'toggleDevTools' }, + { type: 'separator' }, + { role: 'quit' }, + ], + }, + ]; + + Menu.setApplicationMenu(Menu.buildFromTemplate(template)); +} + +function createWindow() { + mainWindow = new BrowserWindow({ + width: 1280, + height: 860, + minWidth: 900, + minHeight: 620, + title: 'MailFlow', + webPreferences: { + preload: path.join(__dirname, 'preload.cjs'), + contextIsolation: true, + nodeIntegration: false, + sandbox: false, + }, + }); + + mainWindow.webContents.setWindowOpenHandler(({ url }) => { + shell.openExternal(url); + return { action: 'deny' }; + }); + + const host = readHost(); + if (host) { + mainWindow.loadURL(host); + } else { + loadSetup(); + } +} + +function loadSetup() { + if (!mainWindow) return; + mainWindow.loadFile(path.join(__dirname, '..', 'native-shell', 'index.html')); +} + +ipcMain.handle('mailflow:getHost', () => readHost()); + +ipcMain.handle('mailflow:saveHost', async (_event, host) => { + const normalized = writeHost(host); + await mainWindow.loadURL(normalized); + return normalized; +}); + +ipcMain.handle('mailflow:resetHost', () => { + clearHost(); + loadSetup(); +}); + +app.whenReady().then(() => { + setupMenu(); + createWindow(); + + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) createWindow(); + }); +}); + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') app.quit(); +}); diff --git a/frontend/electron/preload.cjs b/frontend/electron/preload.cjs new file mode 100644 index 00000000..d0f822d3 --- /dev/null +++ b/frontend/electron/preload.cjs @@ -0,0 +1,7 @@ +const { contextBridge, ipcRenderer } = require('electron'); + +contextBridge.exposeInMainWorld('mailflowNative', { + getHost: () => ipcRenderer.invoke('mailflow:getHost'), + saveHost: (host) => ipcRenderer.invoke('mailflow:saveHost', host), + resetHost: () => ipcRenderer.invoke('mailflow:resetHost'), +}); diff --git a/frontend/native-shell/index.html b/frontend/native-shell/index.html new file mode 100644 index 00000000..02c039db --- /dev/null +++ b/frontend/native-shell/index.html @@ -0,0 +1,184 @@ + + + + + + MailFlow Setup + + + +

+

Connect MailFlow

+

Enter the host for your MailFlow server.

+ +
+ + + +
+
+ + + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 3546eec6..fab0bd7d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,6 +8,8 @@ "name": "mailflow-frontend", "version": "1.0.7", "dependencies": { + "@capacitor/android": "^8.3.4", + "@capacitor/core": "^8.3.4", "@emoji-mart/data": "^1.2.1", "@emoji-mart/react": "^1.1.1", "@tiptap/extension-image": "^3.23.1", @@ -30,8 +32,11 @@ "zustand": "^4.5.0" }, "devDependencies": { + "@capacitor/cli": "^8.3.4", "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.18", + "electron": "^42.1.0", + "electron-builder": "^26.8.1", "postcss": "^8.4.35", "tailwindcss": "^3.4.1", "vite": "^5.1.4" @@ -341,6 +346,411 @@ "node": ">=6.9.0" } }, + "node_modules/@capacitor/android": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@capacitor/android/-/android-8.3.4.tgz", + "integrity": "sha512-7gJjrG3X32Am1QMLqgMztWTYMLMVNE+VZwhekNxhvYizH4mOV05vH+rC9B+f17bCkYZfyu/qXQX6hoY7kLeVZw==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^8.3.0" + } + }, + "node_modules/@capacitor/cli": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-8.3.4.tgz", + "integrity": "sha512-QEmyNdiDDVNYl0Mahm7YTVA/3t2tKcy7FWYDapeKGavS6HDNHZSjyTVwQpUXQbDZrrs/PS2Wau3Aii+LIFwm/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/cli-framework-output": "^2.2.8", + "@ionic/utils-subprocess": "^3.0.1", + "@ionic/utils-terminal": "^2.3.5", + "commander": "^12.1.0", + "debug": "^4.4.0", + "env-paths": "^2.2.0", + "fs-extra": "^11.2.0", + "kleur": "^4.1.5", + "native-run": "^2.0.3", + "open": "^8.4.0", + "plist": "^3.1.0", + "prompts": "^2.4.2", + "rimraf": "^6.0.1", + "semver": "^7.6.3", + "tar": "^7.5.3", + "tslib": "^2.8.1", + "xml2js": "^0.6.2" + }, + "bin": { + "cap": "bin/capacitor", + "capacitor": "bin/capacitor" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@capacitor/cli/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@capacitor/cli/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@capacitor/core": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.3.4.tgz", + "integrity": "sha512-CqRQCkb6HXxcx/N7s+hHTN6ef2CmamFiRMITwm4qB840ph56mS42bzUgn6tKCP+RZjdDweiRHj9ytDDeN6jFag==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@develar/schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/asar/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/asar/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@electron/asar/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@electron/asar/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/get": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.0.0.tgz", + "integrity": "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^3.0.0", + "graceful-fs": "^4.2.11", + "progress": "^2.0.3", + "semver": "^7.6.3", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=22.12.0" + }, + "optionalDependencies": { + "undici": "^7.24.4" + } + }, + "node_modules/@electron/get/node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@electron/get/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.4.tgz", + "integrity": "sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@electron/universal/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@electron/universal/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/@emoji-mart/data": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.2.1.tgz", @@ -776,74 +1186,290 @@ "license": "MIT", "optional": true }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@ionic/cli-framework-output": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", + "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "node_modules/@ionic/utils-array": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", + "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@ionic/utils-fs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", + "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", "dev": true, "license": "MIT", + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, "engines": { - "node": ">=6.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@ionic/utils-fs/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@ionic/utils-object": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", + "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "debug": "^4.0.0", + "tslib": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">=16.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@ionic/utils-process": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", + "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-object": "2.1.6", + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz", + "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-subprocess": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", + "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-process": "2.1.12", + "@ionic/utils-stream": "3.1.7", + "@ionic/utils-terminal": "2.3.5", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", + "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -1230,6 +1856,32 @@ "win32" ] }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@tiptap/core": { "version": "3.23.1", "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.23.1.tgz", @@ -1808,6 +2460,29 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1815,6 +2490,62 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.0.tgz", + "integrity": "sha512-AOQwYUNolgy3VosiRqXrACUXTN8nJUtPl7FJXMqZVyxiiCLhQuG3jXKvCS1ALr+Y2OmZhzzLVlYPEqJaiqkaJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "xmlbuilder": ">=11.0.1" + } + }, "node_modules/@types/react": { "version": "19.2.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", @@ -1835,6 +2566,23 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -1848,6 +2596,25 @@ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, + "node_modules/@types/verror": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", + "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", @@ -1869,326 +2636,1699 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "node_modules/@xmldom/xmldom": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", + "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.6" + } + }, + "node_modules/7zip-bin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", + "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", "dev": true, "license": "MIT" }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "dev": true, "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, "engines": { - "node": ">= 8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 14" + } }, - "node_modules/autoprefixer": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", - "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.2", - "caniuse-lite": "^1.0.30001787", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", - "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">= 8" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "node_modules/app-builder-bin": { + "version": "5.0.0-alpha.12", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", + "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/app-builder-lib": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.8.1.tgz", + "integrity": "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==", "dev": true, "license": "MIT", + "dependencies": { + "@develar/schema-utils": "~2.6.5", + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.3", + "@electron/universal": "2.0.3", + "@malept/flatpak-bundler": "^0.4.0", + "@types/fs-extra": "9.0.13", + "async-exit-hook": "^2.0.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.8.1", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.0.3", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "which": "^5.0.0" + }, "engines": { - "node": ">= 6" + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.8.1", + "electron-builder-squirrel-windows": "26.8.1" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001790", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", - "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=14" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "global-agent": "^3.0.0" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">= 6" + "node": ">=6 <7 || >=8" } }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 6" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, "engines": { - "node": ">=4" + "node": ">= 4.0.0" } }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "node_modules/app-builder-lib/node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, "license": "MIT", - "peer": true + "dependencies": { + "@types/node": "*" + } }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "node_modules/app-builder-lib/node_modules/@xmldom/xmldom": { + "version": "0.8.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", + "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", + "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" + "engines": { + "node": ">=10.0.0" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "node_modules/app-builder-lib/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, - "license": "Apache-2.0" + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "node_modules/app-builder-lib/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", "dev": true, - "license": "MIT" - }, - "node_modules/dompurify": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz", - "integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.344", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", - "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "node_modules/app-builder-lib/node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "dev": true, - "license": "ISC" - }, - "node_modules/emoji-mart": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz", - "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==", "license": "MIT", - "peer": true + "bin": { + "jiti": "lib/jiti-cli.mjs" + } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/app-builder-lib/node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=10.4.0" } }, - "node_modules/esbuild": { + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", + "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.8.1.tgz", + "integrity": "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "7zip-bin": "~5.2.0", + "app-builder-bin": "5.0.0-alpha.12", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", + "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/builder-util/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001790", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", + "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT", + "peer": true + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dir-compare/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-compare/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/dir-compare/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dmg-builder": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.8.1.tgz", + "integrity": "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "fs-extra": "^10.1.0", + "iconv-lite": "^0.6.2", + "js-yaml": "^4.1.0" + }, + "optionalDependencies": { + "dmg-license": "^1.0.11" + } + }, + "node_modules/dmg-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dmg-license": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", + "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "@types/plist": "^3.0.1", + "@types/verror": "^1.10.3", + "ajv": "^6.10.0", + "crc": "^3.8.0", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", + "smart-buffer": "^4.0.2", + "verror": "^1.10.0" + }, + "bin": { + "dmg-license": "bin/dmg-license.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dompurify": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz", + "integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "42.1.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-42.1.0.tgz", + "integrity": "sha512-0szNwC/0dWtkvNce5j3ThiuL0TxBNrZN/BZhdOiGwbLreiD/+u3MGpkct4hA5Ycagb8MXjpEr5/oosi+FwuKRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/get": "^5.0.0", + "@types/node": "^24.9.0", + "extract-zip": "^2.0.1" + }, + "bin": { + "electron": "cli.js", + "install-electron": "install.js" + }, + "engines": { + "node": ">= 22.12.0" + } + }, + "node_modules/electron-builder": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.8.1.tgz", + "integrity": "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.8.1", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.8.1.tgz", + "integrity": "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.8.1", + "builder-util": "26.8.1", + "electron-winstaller": "5.4.0" + } + }, + "node_modules/electron-builder/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-publish": { + "version": "26.8.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.8.1.tgz", + "integrity": "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "builder-util": "26.8.1", + "builder-util-runtime": "9.5.1", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-publish/node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/electron-publish/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.344", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", + "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "dev": true, + "license": "ISC" + }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/electron/node_modules/@types/node": { + "version": "24.12.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.4.tgz", + "integrity": "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/electron/node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/elementtree/node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-mart": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz", + "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==", + "license": "MIT", + "peer": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", @@ -2237,6 +4377,66 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "optional": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-equals": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", @@ -2263,27 +4463,84 @@ "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "balanced-match": "^1.0.0" } }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { - "reusify": "^1.0.4" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/fill-range": { @@ -2299,6 +4556,23 @@ "node": ">=8" } }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fraction.js": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", @@ -2313,6 +4587,28 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/fs-extra": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz", + "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2348,39 +4644,389 @@ "node": ">=6.9.0" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/global-agent/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true, - "license": "ISC", + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=10.13.0" + "node": ">= 14" } }, - "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10.19.0" } }, - "node_modules/html-parse-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, "license": "MIT", "dependencies": { - "void-elements": "3.1.0" + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/i18next": { @@ -2411,6 +5057,88 @@ } } }, + "node_modules/iconv-corefoundation": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "cli-truncate": "^2.1.0", + "node-addon-api": "^1.6.3" + }, + "engines": { + "node": "^8.11.2 || >=10" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2440,6 +5168,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2450,6 +5194,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2473,6 +5227,57 @@ "node": ">=0.12.0" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -2489,6 +5294,19 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -2502,6 +5320,28 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2515,6 +5355,46 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -2541,6 +5421,13 @@ "integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==", "license": "MIT" }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -2553,6 +5440,16 @@ "loose-envify": "cli.js" } }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2563,6 +5460,30 @@ "yallist": "^3.0.2" } }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2580,11 +5501,120 @@ "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" }, - "engines": { - "node": ">=8.6" + "bin": { + "mkdirp": "bin/cmd.js" } }, "node_modules/ms": { @@ -2625,6 +5655,163 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/native-run": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.3.tgz", + "integrity": "sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ionic/utils-fs": "^3.1.7", + "@ionic/utils-terminal": "^2.3.4", + "bplist-parser": "^0.3.2", + "debug": "^4.3.4", + "elementtree": "^0.1.7", + "ini": "^4.1.1", + "plist": "^3.1.0", + "split2": "^4.2.0", + "through2": "^4.0.2", + "tslib": "^2.6.2", + "yauzl": "^2.10.0" + }, + "bin": { + "native-run": "bin/native-run" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/node-abi": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.31.0.tgz", + "integrity": "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", + "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-api-version/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.3.0.tgz", + "integrity": "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/undici": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", + "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/node-releases": { "version": "2.0.38", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", @@ -2632,6 +5819,22 @@ "dev": true, "license": "MIT" }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2642,6 +5845,19 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2662,12 +5878,104 @@ "node": ">= 6" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/orderedmap": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", "license": "MIT" }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -2675,6 +5983,55 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.4.0.tgz", + "integrity": "sha512-W+R+kFL4HgVxONq2bhXPi3bGpzGe/yEhVOp233qw9wCRtgncJ15P3bC+e4zZMu4Cq7d+WAJjXGW0uUkifhcatA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -2715,6 +6072,21 @@ "node": ">= 6" } }, + "node_modules/plist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", + "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.9.10", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, "node_modules/postcss": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", @@ -2878,6 +6250,106 @@ "dev": true, "license": "MIT" }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "node_modules/prosemirror-changeset": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.1.tgz", @@ -3007,6 +6479,27 @@ "prosemirror-transform": "^1.1.0" } }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -3028,6 +6521,19 @@ ], "license": "MIT" }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", @@ -3122,6 +6628,19 @@ "react-dom": ">=16.8" } }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -3132,6 +6651,21 @@ "pify": "^2.3.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3145,6 +6679,34 @@ "node": ">=8.10.0" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, "node_modules/resolve": { "version": "1.22.12", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", @@ -3167,6 +6729,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -3178,6 +6770,63 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/rollup": { "version": "4.60.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", @@ -3249,37 +6898,290 @@ } ], "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" } }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/sucrase": { @@ -3305,6 +7207,32 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -3356,6 +7284,89 @@ "node": ">=14.0.0" } }, + "node_modules/tar": { + "version": "7.5.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp-file/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -3379,6 +7390,36 @@ "node": ">=0.8" } }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/tinyglobby": { "version": "0.2.16", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", @@ -3427,6 +7468,26 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3440,6 +7501,26 @@ "node": ">=8.0" } }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -3447,6 +7528,64 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", + "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -3478,6 +7617,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/use-sync-external-store": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", @@ -3487,6 +7636,13 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3494,6 +7650,22 @@ "dev": true, "license": "MIT" }, + "node_modules/verror": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/vite": { "version": "5.4.21", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", @@ -3569,6 +7741,91 @@ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "license": "MIT" }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -3576,6 +7833,59 @@ "dev": true, "license": "ISC" }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zustand": { "version": "4.5.7", "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", diff --git a/frontend/package.json b/frontend/package.json index 73a65dca..fc2a1dcf 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -2,12 +2,52 @@ "name": "mailflow-frontend", "version": "1.4.0", "type": "module", + "main": "electron/main.cjs", "scripts": { "dev": "vite", "build": "vite build", - "preview": "vite preview" + "preview": "vite preview", + "electron:dev": "electron .", + "electron:dist": "electron-builder --publish never", + "native:prepare": "npm run build && node scripts/prepare-native-shell.cjs", + "android:sync": "npm run native:prepare && cap sync android", + "android:dist": "npm run android:sync && node scripts/build-android.cjs" + }, + "build": { + "appId": "com.mailflow.app", + "productName": "MailFlow", + "directories": { + "output": "release" + }, + "files": [ + "electron/**/*", + "native-shell/**/*", + "package.json" + ], + "win": { + "signAndEditExecutable": false, + "target": [ + "nsis", + "portable" + ] + }, + "mac": { + "target": [ + "dmg", + "zip" + ] + }, + "linux": { + "target": [ + "AppImage", + "deb" + ], + "category": "Network" + } }, "dependencies": { + "@capacitor/android": "^8.3.4", + "@capacitor/core": "^8.3.4", "@emoji-mart/data": "^1.2.1", "@emoji-mart/react": "^1.1.1", "@tiptap/extension-image": "^3.23.1", @@ -30,8 +70,11 @@ "zustand": "^4.5.0" }, "devDependencies": { + "@capacitor/cli": "^8.3.4", "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.18", + "electron": "^42.1.0", + "electron-builder": "^26.8.1", "postcss": "^8.4.35", "tailwindcss": "^3.4.1", "vite": "^5.1.4" diff --git a/frontend/scripts/build-android.cjs b/frontend/scripts/build-android.cjs new file mode 100644 index 00000000..7b615789 --- /dev/null +++ b/frontend/scripts/build-android.cjs @@ -0,0 +1,14 @@ +const { spawnSync } = require('child_process'); +const path = require('path'); + +const root = path.join(__dirname, '..'); +const androidDir = path.join(root, 'android'); +const gradle = process.platform === 'win32' ? 'gradlew.bat' : './gradlew'; + +const result = spawnSync(gradle, ['assembleRelease'], { + cwd: androidDir, + stdio: 'inherit', + shell: process.platform === 'win32', +}); + +process.exit(result.status || 0); diff --git a/frontend/scripts/prepare-native-shell.cjs b/frontend/scripts/prepare-native-shell.cjs new file mode 100644 index 00000000..19238ef2 --- /dev/null +++ b/frontend/scripts/prepare-native-shell.cjs @@ -0,0 +1,9 @@ +const fs = require('fs'); +const path = require('path'); + +const root = path.join(__dirname, '..'); +const shellIndex = path.join(root, 'native-shell', 'index.html'); +const distIndex = path.join(root, 'dist', 'index.html'); + +fs.copyFileSync(shellIndex, distIndex); +console.log('Prepared native shell in dist/index.html'); From 6ac421ecaec131f31cd515acfcfd3b9ffe46a061 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 12:54:18 -0300 Subject: [PATCH 02/90] fix: nested native app scripts under frontend/packages --- .github/workflows/publish-apps.yml | 12 +++++------ .gitignore | 2 +- README.md | 1 + frontend/package.json | 14 ++++++------ frontend/{ => packages}/android/.gitignore | 0 .../{ => packages}/android/app/.gitignore | 0 .../{ => packages}/android/app/build.gradle | 0 .../android/app/capacitor.build.gradle | 0 .../android/app/proguard-rules.pro | 0 .../myapp/ExampleInstrumentedTest.java | 0 .../android/app/src/main/AndroidManifest.xml | 0 .../java/com/mailflow/app/MainActivity.java | 0 .../main/res/drawable-land-hdpi/splash.png | Bin .../main/res/drawable-land-mdpi/splash.png | Bin .../main/res/drawable-land-xhdpi/splash.png | Bin .../main/res/drawable-land-xxhdpi/splash.png | Bin .../main/res/drawable-land-xxxhdpi/splash.png | Bin .../main/res/drawable-port-hdpi/splash.png | Bin .../main/res/drawable-port-mdpi/splash.png | Bin .../main/res/drawable-port-xhdpi/splash.png | Bin .../main/res/drawable-port-xxhdpi/splash.png | Bin .../main/res/drawable-port-xxxhdpi/splash.png | Bin .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../app/src/main/res/drawable/splash.png | Bin .../app/src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../mipmap-hdpi/ic_launcher_foreground.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../mipmap-mdpi/ic_launcher_foreground.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../mipmap-xhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../res/values/ic_launcher_background.xml | 0 .../app/src/main/res/values/strings.xml | 0 .../app/src/main/res/values/styles.xml | 0 .../app/src/main/res/xml/file_paths.xml | 0 .../getcapacitor/myapp/ExampleUnitTest.java | 0 frontend/{ => packages}/android/build.gradle | 0 .../android/capacitor.settings.gradle | 2 +- .../{ => packages}/android/gradle.properties | 0 .../android/gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 frontend/{ => packages}/android/gradlew | 0 frontend/{ => packages}/android/gradlew.bat | 0 .../{ => packages}/android/settings.gradle | 0 .../{ => packages}/android/variables.gradle | 0 frontend/{ => packages}/capacitor.config.json | 5 ++++- frontend/{ => packages}/electron/main.cjs | 0 frontend/{ => packages}/electron/preload.cjs | 0 .../{ => packages}/native-shell/index.html | 0 frontend/packages/package.json | 4 ++++ .../{ => packages}/scripts/build-android.cjs | 4 ++-- .../scripts/prepare-native-shell.cjs | 4 ++-- frontend/packages/scripts/sync-android.cjs | 20 ++++++++++++++++++ 65 files changed, 48 insertions(+), 20 deletions(-) rename frontend/{ => packages}/android/.gitignore (100%) rename frontend/{ => packages}/android/app/.gitignore (100%) rename frontend/{ => packages}/android/app/build.gradle (100%) rename frontend/{ => packages}/android/app/capacitor.build.gradle (100%) rename frontend/{ => packages}/android/app/proguard-rules.pro (100%) rename frontend/{ => packages}/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java (100%) rename frontend/{ => packages}/android/app/src/main/AndroidManifest.xml (100%) rename frontend/{ => packages}/android/app/src/main/java/com/mailflow/app/MainActivity.java (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable-land-hdpi/splash.png (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable-land-mdpi/splash.png (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable-land-xhdpi/splash.png (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable-land-xxhdpi/splash.png (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable-land-xxxhdpi/splash.png (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable-port-hdpi/splash.png (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable-port-mdpi/splash.png (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable-port-xhdpi/splash.png (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable-port-xxhdpi/splash.png (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable-port-xxxhdpi/splash.png (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable/ic_launcher_background.xml (100%) rename frontend/{ => packages}/android/app/src/main/res/drawable/splash.png (100%) rename frontend/{ => packages}/android/app/src/main/res/layout/activity_main.xml (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png (100%) rename frontend/{ => packages}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename frontend/{ => packages}/android/app/src/main/res/values/ic_launcher_background.xml (100%) rename frontend/{ => packages}/android/app/src/main/res/values/strings.xml (100%) rename frontend/{ => packages}/android/app/src/main/res/values/styles.xml (100%) rename frontend/{ => packages}/android/app/src/main/res/xml/file_paths.xml (100%) rename frontend/{ => packages}/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java (100%) rename frontend/{ => packages}/android/build.gradle (100%) rename frontend/{ => packages}/android/capacitor.settings.gradle (50%) rename frontend/{ => packages}/android/gradle.properties (100%) rename frontend/{ => packages}/android/gradle/wrapper/gradle-wrapper.jar (100%) rename frontend/{ => packages}/android/gradle/wrapper/gradle-wrapper.properties (100%) rename frontend/{ => packages}/android/gradlew (100%) rename frontend/{ => packages}/android/gradlew.bat (100%) rename frontend/{ => packages}/android/settings.gradle (100%) rename frontend/{ => packages}/android/variables.gradle (100%) rename frontend/{ => packages}/capacitor.config.json (64%) rename frontend/{ => packages}/electron/main.cjs (100%) rename frontend/{ => packages}/electron/preload.cjs (100%) rename frontend/{ => packages}/native-shell/index.html (100%) create mode 100644 frontend/packages/package.json rename frontend/{ => packages}/scripts/build-android.cjs (75%) rename frontend/{ => packages}/scripts/prepare-native-shell.cjs (62%) create mode 100644 frontend/packages/scripts/sync-android.cjs diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index 1f9ff74a..a009b644 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -46,11 +46,11 @@ jobs: with: name: mailflow-electron-${{ matrix.os }} path: | - frontend/release/*.AppImage - frontend/release/*.deb - frontend/release/*.dmg - frontend/release/*.exe - frontend/release/*.zip + frontend/packages/release/*.AppImage + frontend/packages/release/*.deb + frontend/packages/release/*.dmg + frontend/packages/release/*.exe + frontend/packages/release/*.zip android: name: Android @@ -84,7 +84,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: mailflow-android - path: frontend/android/app/build/outputs/apk/release/*.apk + path: frontend/packages/android/app/build/outputs/apk/release/*.apk release: name: Attach to GitHub Release diff --git a/.gitignore b/.gitignore index 98316bb6..4a933a1f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ node_modules/ # Build output frontend/dist/ frontend/.vite/ -frontend/release/ +frontend/packages/release/ # TLS certs (generated locally or via Let's Encrypt) certs/ diff --git a/README.md b/README.md index ba5e3a38..efa9402c 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,7 @@ MailFlow remains a self-hosted web app, but release builds can also publish nati - Windows, macOS, and Linux use Electron packages. - Android uses a Capacitor WebView package, because Electron does not support Android. - On first launch, the wrapper asks for the MailFlow host, such as `https://mail.your-domain.com`, stores it locally, and opens that server. +- Native package sources live under `frontend/packages`. To build locally: diff --git a/frontend/package.json b/frontend/package.json index fc2a1dcf..ce103c17 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -2,26 +2,26 @@ "name": "mailflow-frontend", "version": "1.4.0", "type": "module", - "main": "electron/main.cjs", + "main": "packages/electron/main.cjs", "scripts": { "dev": "vite", "build": "vite build", "preview": "vite preview", "electron:dev": "electron .", "electron:dist": "electron-builder --publish never", - "native:prepare": "npm run build && node scripts/prepare-native-shell.cjs", - "android:sync": "npm run native:prepare && cap sync android", - "android:dist": "npm run android:sync && node scripts/build-android.cjs" + "native:prepare": "npm run build && node packages/scripts/prepare-native-shell.cjs", + "android:sync": "npm run native:prepare && node packages/scripts/sync-android.cjs", + "android:dist": "npm run android:sync && node packages/scripts/build-android.cjs" }, "build": { "appId": "com.mailflow.app", "productName": "MailFlow", "directories": { - "output": "release" + "output": "packages/release" }, "files": [ - "electron/**/*", - "native-shell/**/*", + "packages/electron/**/*", + "packages/native-shell/**/*", "package.json" ], "win": { diff --git a/frontend/android/.gitignore b/frontend/packages/android/.gitignore similarity index 100% rename from frontend/android/.gitignore rename to frontend/packages/android/.gitignore diff --git a/frontend/android/app/.gitignore b/frontend/packages/android/app/.gitignore similarity index 100% rename from frontend/android/app/.gitignore rename to frontend/packages/android/app/.gitignore diff --git a/frontend/android/app/build.gradle b/frontend/packages/android/app/build.gradle similarity index 100% rename from frontend/android/app/build.gradle rename to frontend/packages/android/app/build.gradle diff --git a/frontend/android/app/capacitor.build.gradle b/frontend/packages/android/app/capacitor.build.gradle similarity index 100% rename from frontend/android/app/capacitor.build.gradle rename to frontend/packages/android/app/capacitor.build.gradle diff --git a/frontend/android/app/proguard-rules.pro b/frontend/packages/android/app/proguard-rules.pro similarity index 100% rename from frontend/android/app/proguard-rules.pro rename to frontend/packages/android/app/proguard-rules.pro diff --git a/frontend/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/frontend/packages/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java similarity index 100% rename from frontend/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java rename to frontend/packages/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java diff --git a/frontend/android/app/src/main/AndroidManifest.xml b/frontend/packages/android/app/src/main/AndroidManifest.xml similarity index 100% rename from frontend/android/app/src/main/AndroidManifest.xml rename to frontend/packages/android/app/src/main/AndroidManifest.xml diff --git a/frontend/android/app/src/main/java/com/mailflow/app/MainActivity.java b/frontend/packages/android/app/src/main/java/com/mailflow/app/MainActivity.java similarity index 100% rename from frontend/android/app/src/main/java/com/mailflow/app/MainActivity.java rename to frontend/packages/android/app/src/main/java/com/mailflow/app/MainActivity.java diff --git a/frontend/android/app/src/main/res/drawable-land-hdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-land-hdpi/splash.png similarity index 100% rename from frontend/android/app/src/main/res/drawable-land-hdpi/splash.png rename to frontend/packages/android/app/src/main/res/drawable-land-hdpi/splash.png diff --git a/frontend/android/app/src/main/res/drawable-land-mdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-land-mdpi/splash.png similarity index 100% rename from frontend/android/app/src/main/res/drawable-land-mdpi/splash.png rename to frontend/packages/android/app/src/main/res/drawable-land-mdpi/splash.png diff --git a/frontend/android/app/src/main/res/drawable-land-xhdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-land-xhdpi/splash.png similarity index 100% rename from frontend/android/app/src/main/res/drawable-land-xhdpi/splash.png rename to frontend/packages/android/app/src/main/res/drawable-land-xhdpi/splash.png diff --git a/frontend/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-land-xxhdpi/splash.png similarity index 100% rename from frontend/android/app/src/main/res/drawable-land-xxhdpi/splash.png rename to frontend/packages/android/app/src/main/res/drawable-land-xxhdpi/splash.png diff --git a/frontend/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-land-xxxhdpi/splash.png similarity index 100% rename from frontend/android/app/src/main/res/drawable-land-xxxhdpi/splash.png rename to frontend/packages/android/app/src/main/res/drawable-land-xxxhdpi/splash.png diff --git a/frontend/android/app/src/main/res/drawable-port-hdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-port-hdpi/splash.png similarity index 100% rename from frontend/android/app/src/main/res/drawable-port-hdpi/splash.png rename to frontend/packages/android/app/src/main/res/drawable-port-hdpi/splash.png diff --git a/frontend/android/app/src/main/res/drawable-port-mdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-port-mdpi/splash.png similarity index 100% rename from frontend/android/app/src/main/res/drawable-port-mdpi/splash.png rename to frontend/packages/android/app/src/main/res/drawable-port-mdpi/splash.png diff --git a/frontend/android/app/src/main/res/drawable-port-xhdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-port-xhdpi/splash.png similarity index 100% rename from frontend/android/app/src/main/res/drawable-port-xhdpi/splash.png rename to frontend/packages/android/app/src/main/res/drawable-port-xhdpi/splash.png diff --git a/frontend/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-port-xxhdpi/splash.png similarity index 100% rename from frontend/android/app/src/main/res/drawable-port-xxhdpi/splash.png rename to frontend/packages/android/app/src/main/res/drawable-port-xxhdpi/splash.png diff --git a/frontend/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-port-xxxhdpi/splash.png similarity index 100% rename from frontend/android/app/src/main/res/drawable-port-xxxhdpi/splash.png rename to frontend/packages/android/app/src/main/res/drawable-port-xxxhdpi/splash.png diff --git a/frontend/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/frontend/packages/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from frontend/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to frontend/packages/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/frontend/android/app/src/main/res/drawable/ic_launcher_background.xml b/frontend/packages/android/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from frontend/android/app/src/main/res/drawable/ic_launcher_background.xml rename to frontend/packages/android/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/frontend/android/app/src/main/res/drawable/splash.png b/frontend/packages/android/app/src/main/res/drawable/splash.png similarity index 100% rename from frontend/android/app/src/main/res/drawable/splash.png rename to frontend/packages/android/app/src/main/res/drawable/splash.png diff --git a/frontend/android/app/src/main/res/layout/activity_main.xml b/frontend/packages/android/app/src/main/res/layout/activity_main.xml similarity index 100% rename from frontend/android/app/src/main/res/layout/activity_main.xml rename to frontend/packages/android/app/src/main/res/layout/activity_main.xml diff --git a/frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/frontend/packages/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to frontend/packages/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/frontend/packages/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from frontend/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to frontend/packages/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/frontend/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to frontend/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/frontend/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png rename to frontend/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png diff --git a/frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/frontend/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to frontend/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/frontend/packages/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to frontend/packages/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/frontend/packages/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png rename to frontend/packages/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png diff --git a/frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/frontend/packages/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to frontend/packages/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/frontend/packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to frontend/packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/frontend/packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png rename to frontend/packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png diff --git a/frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/frontend/packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to frontend/packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/frontend/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to frontend/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/frontend/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png rename to frontend/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png diff --git a/frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/frontend/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to frontend/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/frontend/packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to frontend/packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/frontend/packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png rename to frontend/packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png diff --git a/frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/frontend/packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to frontend/packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/frontend/android/app/src/main/res/values/ic_launcher_background.xml b/frontend/packages/android/app/src/main/res/values/ic_launcher_background.xml similarity index 100% rename from frontend/android/app/src/main/res/values/ic_launcher_background.xml rename to frontend/packages/android/app/src/main/res/values/ic_launcher_background.xml diff --git a/frontend/android/app/src/main/res/values/strings.xml b/frontend/packages/android/app/src/main/res/values/strings.xml similarity index 100% rename from frontend/android/app/src/main/res/values/strings.xml rename to frontend/packages/android/app/src/main/res/values/strings.xml diff --git a/frontend/android/app/src/main/res/values/styles.xml b/frontend/packages/android/app/src/main/res/values/styles.xml similarity index 100% rename from frontend/android/app/src/main/res/values/styles.xml rename to frontend/packages/android/app/src/main/res/values/styles.xml diff --git a/frontend/android/app/src/main/res/xml/file_paths.xml b/frontend/packages/android/app/src/main/res/xml/file_paths.xml similarity index 100% rename from frontend/android/app/src/main/res/xml/file_paths.xml rename to frontend/packages/android/app/src/main/res/xml/file_paths.xml diff --git a/frontend/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/frontend/packages/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java similarity index 100% rename from frontend/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java rename to frontend/packages/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java diff --git a/frontend/android/build.gradle b/frontend/packages/android/build.gradle similarity index 100% rename from frontend/android/build.gradle rename to frontend/packages/android/build.gradle diff --git a/frontend/android/capacitor.settings.gradle b/frontend/packages/android/capacitor.settings.gradle similarity index 50% rename from frontend/android/capacitor.settings.gradle rename to frontend/packages/android/capacitor.settings.gradle index 9a5fa872..874b109a 100644 --- a/frontend/android/capacitor.settings.gradle +++ b/frontend/packages/android/capacitor.settings.gradle @@ -1,3 +1,3 @@ // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN include ':capacitor-android' -project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') +project(':capacitor-android').projectDir = new File('../../node_modules/@capacitor/android/capacitor') diff --git a/frontend/android/gradle.properties b/frontend/packages/android/gradle.properties similarity index 100% rename from frontend/android/gradle.properties rename to frontend/packages/android/gradle.properties diff --git a/frontend/android/gradle/wrapper/gradle-wrapper.jar b/frontend/packages/android/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from frontend/android/gradle/wrapper/gradle-wrapper.jar rename to frontend/packages/android/gradle/wrapper/gradle-wrapper.jar diff --git a/frontend/android/gradle/wrapper/gradle-wrapper.properties b/frontend/packages/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from frontend/android/gradle/wrapper/gradle-wrapper.properties rename to frontend/packages/android/gradle/wrapper/gradle-wrapper.properties diff --git a/frontend/android/gradlew b/frontend/packages/android/gradlew similarity index 100% rename from frontend/android/gradlew rename to frontend/packages/android/gradlew diff --git a/frontend/android/gradlew.bat b/frontend/packages/android/gradlew.bat similarity index 100% rename from frontend/android/gradlew.bat rename to frontend/packages/android/gradlew.bat diff --git a/frontend/android/settings.gradle b/frontend/packages/android/settings.gradle similarity index 100% rename from frontend/android/settings.gradle rename to frontend/packages/android/settings.gradle diff --git a/frontend/android/variables.gradle b/frontend/packages/android/variables.gradle similarity index 100% rename from frontend/android/variables.gradle rename to frontend/packages/android/variables.gradle diff --git a/frontend/capacitor.config.json b/frontend/packages/capacitor.config.json similarity index 64% rename from frontend/capacitor.config.json rename to frontend/packages/capacitor.config.json index 1faf8b68..230ca6d9 100644 --- a/frontend/capacitor.config.json +++ b/frontend/packages/capacitor.config.json @@ -1,7 +1,10 @@ { "appId": "com.mailflow.app", "appName": "MailFlow", - "webDir": "dist", + "webDir": "../dist", + "android": { + "path": "android" + }, "server": { "allowNavigation": [ "*" diff --git a/frontend/electron/main.cjs b/frontend/packages/electron/main.cjs similarity index 100% rename from frontend/electron/main.cjs rename to frontend/packages/electron/main.cjs diff --git a/frontend/electron/preload.cjs b/frontend/packages/electron/preload.cjs similarity index 100% rename from frontend/electron/preload.cjs rename to frontend/packages/electron/preload.cjs diff --git a/frontend/native-shell/index.html b/frontend/packages/native-shell/index.html similarity index 100% rename from frontend/native-shell/index.html rename to frontend/packages/native-shell/index.html diff --git a/frontend/packages/package.json b/frontend/packages/package.json new file mode 100644 index 00000000..046ea70c --- /dev/null +++ b/frontend/packages/package.json @@ -0,0 +1,4 @@ +{ + "private": true, + "name": "mailflow-native-packages" +} diff --git a/frontend/scripts/build-android.cjs b/frontend/packages/scripts/build-android.cjs similarity index 75% rename from frontend/scripts/build-android.cjs rename to frontend/packages/scripts/build-android.cjs index 7b615789..cec5cfa9 100644 --- a/frontend/scripts/build-android.cjs +++ b/frontend/packages/scripts/build-android.cjs @@ -1,8 +1,8 @@ const { spawnSync } = require('child_process'); const path = require('path'); -const root = path.join(__dirname, '..'); -const androidDir = path.join(root, 'android'); +const root = path.join(__dirname, '..', '..'); +const androidDir = path.join(root, 'packages', 'android'); const gradle = process.platform === 'win32' ? 'gradlew.bat' : './gradlew'; const result = spawnSync(gradle, ['assembleRelease'], { diff --git a/frontend/scripts/prepare-native-shell.cjs b/frontend/packages/scripts/prepare-native-shell.cjs similarity index 62% rename from frontend/scripts/prepare-native-shell.cjs rename to frontend/packages/scripts/prepare-native-shell.cjs index 19238ef2..c55f422c 100644 --- a/frontend/scripts/prepare-native-shell.cjs +++ b/frontend/packages/scripts/prepare-native-shell.cjs @@ -1,8 +1,8 @@ const fs = require('fs'); const path = require('path'); -const root = path.join(__dirname, '..'); -const shellIndex = path.join(root, 'native-shell', 'index.html'); +const root = path.join(__dirname, '..', '..'); +const shellIndex = path.join(root, 'packages', 'native-shell', 'index.html'); const distIndex = path.join(root, 'dist', 'index.html'); fs.copyFileSync(shellIndex, distIndex); diff --git a/frontend/packages/scripts/sync-android.cjs b/frontend/packages/scripts/sync-android.cjs new file mode 100644 index 00000000..1a4c9623 --- /dev/null +++ b/frontend/packages/scripts/sync-android.cjs @@ -0,0 +1,20 @@ +const { spawnSync } = require('child_process'); +const path = require('path'); + +const root = path.join(__dirname, '..', '..'); +const packagesDir = path.join(root, 'packages'); +const cap = path.join( + root, + 'node_modules', + '@capacitor', + 'cli', + 'bin', + 'capacitor', +); + +const result = spawnSync(process.execPath, [cap, 'sync', 'android'], { + cwd: packagesDir, + stdio: 'inherit', +}); + +process.exit(result.status || 0); From 9bb958fe09c76906a6fce673477302e5b1b99e07 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 13:05:53 -0300 Subject: [PATCH 03/90] update appid to actual domain --- frontend/package.json | 2 +- frontend/packages/android/app/build.gradle | 4 ++-- .../src/main/java/{com => sh}/mailflow/app/MainActivity.java | 2 +- frontend/packages/android/app/src/main/res/values/strings.xml | 4 ++-- frontend/packages/capacitor.config.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) rename frontend/packages/android/app/src/main/java/{com => sh}/mailflow/app/MainActivity.java (78%) diff --git a/frontend/package.json b/frontend/package.json index ce103c17..1c6d2d2c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,7 +14,7 @@ "android:dist": "npm run android:sync && node packages/scripts/build-android.cjs" }, "build": { - "appId": "com.mailflow.app", + "appId": "sh.mailflow.app", "productName": "MailFlow", "directories": { "output": "packages/release" diff --git a/frontend/packages/android/app/build.gradle b/frontend/packages/android/app/build.gradle index 6437d7b9..d928d4ba 100644 --- a/frontend/packages/android/app/build.gradle +++ b/frontend/packages/android/app/build.gradle @@ -1,10 +1,10 @@ apply plugin: 'com.android.application' android { - namespace = "com.mailflow.app" + namespace = "sh.mailflow.app" compileSdk = rootProject.ext.compileSdkVersion defaultConfig { - applicationId "com.mailflow.app" + applicationId "sh.mailflow.app" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 diff --git a/frontend/packages/android/app/src/main/java/com/mailflow/app/MainActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java similarity index 78% rename from frontend/packages/android/app/src/main/java/com/mailflow/app/MainActivity.java rename to frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java index abc14e91..4e5d95aa 100644 --- a/frontend/packages/android/app/src/main/java/com/mailflow/app/MainActivity.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java @@ -1,4 +1,4 @@ -package com.mailflow.app; +package sh.mailflow.app; import com.getcapacitor.BridgeActivity; diff --git a/frontend/packages/android/app/src/main/res/values/strings.xml b/frontend/packages/android/app/src/main/res/values/strings.xml index 9f88ad71..121ec6f3 100644 --- a/frontend/packages/android/app/src/main/res/values/strings.xml +++ b/frontend/packages/android/app/src/main/res/values/strings.xml @@ -2,6 +2,6 @@ MailFlow MailFlow - com.mailflow.app - com.mailflow.app + sh.mailflow.app + sh.mailflow.app diff --git a/frontend/packages/capacitor.config.json b/frontend/packages/capacitor.config.json index 230ca6d9..31b08ea8 100644 --- a/frontend/packages/capacitor.config.json +++ b/frontend/packages/capacitor.config.json @@ -1,5 +1,5 @@ { - "appId": "com.mailflow.app", + "appId": "sh.mailflow.app", "appName": "MailFlow", "webDir": "../dist", "android": { From eda90de5af70ee11137dfb60c9284fba03242fc8 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 13:57:01 -0300 Subject: [PATCH 04/90] replace capacitor default icons --- .../main/res/drawable-land-hdpi/splash.png | Bin 7705 -> 18998 bytes .../main/res/drawable-land-mdpi/splash.png | Bin 4040 -> 12992 bytes .../main/res/drawable-land-xhdpi/splash.png | Bin 9251 -> 29247 bytes .../main/res/drawable-land-xxhdpi/splash.png | Bin 13984 -> 50360 bytes .../main/res/drawable-land-xxxhdpi/splash.png | Bin 17683 -> 66916 bytes .../main/res/drawable-port-hdpi/splash.png | Bin 7934 -> 19312 bytes .../main/res/drawable-port-mdpi/splash.png | Bin 4096 -> 13233 bytes .../main/res/drawable-port-xhdpi/splash.png | Bin 9875 -> 28946 bytes .../main/res/drawable-port-xxhdpi/splash.png | Bin 13346 -> 50506 bytes .../main/res/drawable-port-xxxhdpi/splash.png | Bin 17489 -> 68328 bytes .../app/src/main/res/drawable/splash.png | Bin 4040 -> 12992 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2786 -> 6317 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 3450 -> 10767 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 4341 -> 6317 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1869 -> 4216 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 2110 -> 7161 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2725 -> 4216 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 3981 -> 8716 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 5036 -> 13916 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 6593 -> 8716 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 6644 -> 12662 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 9793 -> 21985 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10455 -> 12662 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 9441 -> 15734 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 15529 -> 32974 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 15916 -> 15734 bytes .../res/values/ic_launcher_background.xml | 4 ++-- 27 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/packages/android/app/src/main/res/drawable-land-hdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-land-hdpi/splash.png index e31573b4fc93e60d171f4046c0220e1463075d9e..5b7b0d04adf1dd326c0e8dc75e01ad3b9c7fa4a5 100644 GIT binary patch literal 18998 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 S%KQixRFYSFSR(uE-Twpjl3iy2 literal 7705 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 wKmFJ0_JHhk1&0B>;%YXATM diff --git a/frontend/packages/android/app/src/main/res/drawable-land-mdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-land-mdpi/splash.png index f7a64923ea1a0565d25fa139c176d6bf42184e48..1e2132f542718fe739adec1fe9cdc5ce806a1335 100644 GIT binary patch literal 12992 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 ZqLj0c;BR*if2+cxt7Uk<=-$&;{|CeJBm)2d literal 4040 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 XyOn+%7f`N3b2T^T3uj5+eShz7v)7qy diff --git a/frontend/packages/android/app/src/main/res/drawable-land-xhdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-land-xhdpi/splash.png index 807725501bdd92e94e51e7b2b0006f69e0083a0b..01595d2d697ca726338f3ed634bcb018a39ec180 100644 GIT binary patch literal 29247 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 wviW<){+=)84K0e9chTmS$7 literal 9251 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 diff --git a/frontend/packages/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-land-xxhdpi/splash.png index 14c6c8fe39fcd51a0414866ad28cbe8ff3acb060..2dcdebd5eb5e40336b83982e04a319d971fc07d4 100644 GIT binary patch literal 50360 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

d9*Kp?6yz;GQfgkwx`Q~yu!*2Dsqj0v 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 I&MBb@09tdLh5!Hn literal 13984 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®q@N z14_H8ofW)l{|J8q+a)eH)I0r)>WXdzV%7J>PA~6_J)KLT90iYa^K=Wz7D!OybzqSru=f4?|KFl;Y)gP_H6V4x`~kZ6fE(xM1&;?72-TZNk+0 zr+Crr5yl%Iy@vfmt3eYFl!jIvPGFz^8Ek+2`48O1_pCX3xNWh-zBa{rIcc%+=|XVj zANYTg&s}TKb#OztQrCW(Xk?V^i{`q~%HtcveTxq(_HKeC9GzrtguMT4Nvs@KakPTA z9>*8bBZmLz`lK5=l)=b|=dT3a5ag^a1^znZyx5QKfUb1b9yacArRp%3@QWo(hrsCU z-K!-=jDmv!zb7XT>)r|-Z0Ry}lk2;dk-ECqMwr_nKN#x*X6~B5hVIN>6$1HwBz3Of z=Pk){AL5*=d90f17_qZEJLm;Q%WMdX=*N&!ki@E&cy7?>{1ssAH(tACtp*r@d^til z)x(1#6(kPD+joSF&J3sxJU@{-sWCS+pZq{Gsx=?z4wP;>?)1yHv0?X?VP{}cX4~aH zxeBPKw_rgW8rvewS1W2#^y+c>-183iMbJCqc38RN_o~__9-n|jcd&oA`m7*&Fqqpc z;Tev*0LS-ZK47Sq1unfvP1S43uA12P?PJmI8BeTYPr~R*tYUm^0;U%Hmu?bSZHEK6 zPjsW=E67Kq-&trmf;)UkmRABH2U)V)-eRT$j(%G12lLMsThSsU10iP#{)ZnvjzN$d z*K%P3`}oqyvpWP~venr>3viH8^`)Ma*=B31hw*Q+tqE>i2y7w!(o^lI^Yss^=tHW( z;cnCT(%B1gLz+TRGW9roFjI1EQTu-u`(f#RmZ8;FSN(bsC1J;+(i_R6mrW=yYx$cy z#%QKVrEx~kVMg~yo?^N28Wnk6x%L;J8i|*|ANEiNjq(Vhzuzl3ikpA*G!Z}kLAzAI z9qnySo%D|AuJj12%h;Otqjs(>LPj?rNdeU8so>P(C>XMzlho94ZD#w=cCOOU;=3&^ zsqAG!i{~lY271D|m>ztPV`)X@FO_;`wPjppYNQpM+ncvtz1lZjN>!Q^*I}T%uP78Z7tbV2$q3W_)14=kLFyJ z1GqL6T>ClgeZorL!}xP4f%OB_EsmJ`uw7dGWNV9OLlhb|UMpVhc{4@Bhh`tO!ZqzD zhusd<=K^ah!L@gQ?6dOpI-ge^e>S5W9eII57Zu16eU?GRbgKTeVk9yS{iK|O(zLR> zheb?;jwGCHS80NCn=jKxgJ>}qu4l%5NPihjzazGv#J?Jcyl;<#IW&x4mm>nrW8>}C z3U@aeD~)*F(0o^2{GnKVm$Jr#aZE ztl~TOkM^SdzJapQ((!-i8b!RkVQBKkL`2ZCBuy!qI1L{3Er526plVols~68U-^9Px zR(3{j;Z9RHX^muc0dUywJ|`yyZFf=k&-Gb#m4u73Lm5Ks%BfHj%2|gjn#i> zLC5pO$2Em9H;qoKQmMtl<@wgtPF1%2HariD5O~u>8=^*J&au~JH%Ih@&2Uging3U_ z0bzfKucW$ZHSx}!#buB?+-J)%RQbbXM-!BJTS&#dU_@lxU6>te2O+9 z@F{F{Nb!;{Cd`Gx+$G?11aB~S#wIH%D=*=7f7H@D@%B1)&bF$@t3JDq4l*%(wJTlh zo`?uMq{YilKUewPNaC)GuOr<8j9&ofqRU__BRUX^x8Cj3a;a$rXzgXqW>LR#CUn%~m)t zYC&ol(gAkbc^fd`xWU&bk5vT6KbFmsR=O78Bn%t7 znbw&=c+|T&#r+bls5rU6D#HMvqA<|;)BV%jOMonkm^p$7Vcel-Wwn$=uAJv&(8W>% z9))Fxpl*(%E#wFm_m!U~2HqgZs^2vaGeY(UfYKrSHV}w^D0N6!se5Ewy)Yy-!(2

aKj2hWG7>znxs|SE zN4rHtiSPqLskWp(?(_YYwgq+1@8v+~8As|(bC>$D(atG3ZE8-ZM3SVcg|vHQz$I=!(A`k`5= zOqR>&%G)$)k*QLz7MTB9wleWpv&N9Sta64wy}3Ytd?x!Ja8z>(z~(3UNFu^eFmn#6 zw!!gUxOuZi$PQIs*ixfZR3iLyADJ z5&s%tPfk>V!x|A-;oq%1!yk9H$UBP0ToA*EDtz(^!_AnF1bBQ7joj|? z5b)gSI8c8O$PYFE!vXJ<4gebg*9G9P2wcB{#kv0FItc5T@PDNo)}Rh4Us}L{e}xzW zhwt`)j`M)mP=G6H0;^&q=I0{jU%bIRkF#uLF;{vVC&H|_uc diff --git a/frontend/packages/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-land-xxxhdpi/splash.png index 244ca2506dbe0fd8f6a05520ac7d1a629ea81438..75037778428dfc03d918ff52a6083418eaae3da6 100644 GIT binary patch literal 66916 zcmeEvi$9cU|Nm60lcW-g&{;Wlkg1&3c2Ehma@q-NC0Q{_8X8Q=AqiW;marXAiAWje zaaIXMA;XLz=fli64#xO>u6xwB&+~o$g5N%`muJ};bI*NUpU>xgy6z1=W^5p~SY|N} zhZ8$|X#dYR+=9zEoCt2=eE2tsp(c3v#~k;c4SvFSIfjDj~BbW!U9a4y{YOk2*!~^&PqN)aH}q{fmF~dRLp4#kj}Kw9oKorZeEu z(Ekeg!^y4t_b>i?d(a*DcT@aZ z3jcNrtQY)S3jdbEzoqbRDWE&>FF^ViKVp^eFF^XY6#gxRe@g+o1OGpl!f`%J@!+nRWv

  • ;b9YYd#7pt5oSnx$HA!0U%!*AO)6BGg8fg~S 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 aUi)d;BhjZEXi8{lZQ9_yKL7I_NB$2N%prdO literal 17683 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%0D+Vjb?(rG# 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 literal 7934 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 M%?BFAx1R?8A13d_-T(jq literal 4096 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 I{-1vSFGfM-5dZ)H literal 9875 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 diff --git a/frontend/packages/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-port-xxhdpi/splash.png index bfabe6871a17a5e95b78fb30d49b7d2b4d2fe4c0..6a2ba60ed7a484a6c8ed83ed91240c65cc539d9d 100644 GIT binary patch literal 50506 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 Ci90?3 literal 13346 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

    VwO4Hu8X}%XHUAz_J@50rzbkIsat>4oWtQt< zIO?tf?{oTz>?^ zcs#99X^>a=*D4${xG>cbA~mO3ZB$EhO>H1&*Qy(>+hed@=A`jR^=cJ!Z`3E3@Q919 z2|Hx$qrVsGlLkcgkxI#|*OEWCg`R(Dc|W-FsVh3ffkA6Wv&KS*mI`Jy*shMmL7i+p zTFI~6ZFWUah0_YM!qjNfUerrcYR5kNd~_l?c|YSYK1lXrX5Jvyw-?I=YZ@JeEE%@9 zjRTcK5e%p8vf?4Sh{hzPvSvD(2@OVsjP%1al3iOnJ&B_;o}k*g_q;O$pCZhIqr&H| zY#=4Rd9@be`U)0}1?QdC*8SRC^1=|6G+G5*sZD$CQBd)0LT4s=)~2U7>V#!lV~)IP z(A=7y3q%qKn8bQyn==u2VP>MVj74-!pq6>dfw`-qSu zWt_c|DI&(Tu?wK=$0|DMG5AVR%fnRhsvGt>gVq>qQa-a%jIS1C(_O;l7xOdTCCy}G zdpgQnJk@syL$7a$8c)vb)|K+W-^e*><2yLWb@AY2#TUsMB(~%vT!S2o)HZqn)MBf z)}?AORn^g2%th^rZhz+$aKGTi!3gbXBhzmj%2d+Rk-s$D9?SlyV17a;D!N`yL_J>0 z))rDiB6LyF=wahV7f`<^zHiirz#5k(xz3JFDY=&Uk(aE}#H?1HkkvW#9$wiT-o{Yt zHUV6OZzYk*Do;k^-may;=hZA^=cR?>o|n#u**Hf8z=8hdNlLAD{wj_40-)Fs24)PV zvxo#<4(|Fjyy!~saI035lJ#JIOY|Q!IWLf~cK~S9MFbMBTwPVX-jg~rRILU)2m>uw z@9A+)Ui2fckc;0eUpp15 z82@-Mfp#!sUH^ef6tiN@>@in!eX92e0Xd!)+RThBIYld6W0}p9lbUWv5m;Zi%?0wt zvTA1twcT+E6@F9mi7KmaJHV1H9*yk3_~l$p#Hz=<*@m6j@bO&RTXq8sLbmIPY40^- zLZ?zlKu>7ZUJxUa<%J5xJ4TM(lR_mKX~)%_*bAD=*eWDQ z*YOO3v-{8j_Wg%>p0qDME8dN{n~0f_W26%vD&}^JNYU}ha6B))EXB`_J5EUFl=^9w zXS>>$`kCB#;;)*jT`0TqK*&TE`V!VC_Y#bww3?$HiRno=c!N|((tv9Qr>P#Mm|6^n z(P7%Zh4Vg;n4zUfbX%SjVWC62B{W`|*S2lGTFf`Ua)*Ww+WPast=FQY*$&$gS`^AP&tW@ge3GVsSaZvqVk7pPkhna!(6vsXlIzmtuPGAi5^za!%%`rg9Iop%cjweBc{ z7H6WieGAC$BIP0+!GX?)pnH~%NjF71Wr?Y?Eu~t!deImju;fD{V+{`}8%!CFbjks% zOnO@|Nuk_AiptP}!8dYVG|4}Qz69R3Rrt@LCD#a56{6i#==cjc&m&Y%K~yzjv@~=A+lR=i4=}^>X-7 zZ%5RZ(@Cy-7>!})9abu8c;huoVe3bL@fMeZul7P27`sq{zAHmuLZ4vrO}7XU#SLuI zPu&mqN;3)85rn&U5#Jz3cz1yuaH{!3nwUSj|br7tX(-WErI zH_*1IBI|HYZ-OqrGVj&PWF6O+qsQ5T^L5K#+=c_DF@OfPy$OhtS zE(9E}A<7){-2x7LgEy{&9oEl!k`JfI4XDU|98-8pT$) zx~;Oy!G+AhazhR#k!~r!>rm-@+YDa@w9aB3=z(`ryPdyy@s7SPpb*Agi1DqIfDWpt zO1s*_k@i=(TbXXAi&FoBXuYWmR-i|-ulY~bbHn4!DX!4?)hrACs~9<985~ogu1Khz zphk*H$bj)l{p^9~8mc3?E6Z=SP?xS$&84dY8@c?z=B#J+$tmm9Zu|*1RVEzrxR638 zxM`2ri3^rICyG;TggrGwb)5HP*7JLajV7BYLyZ#DwU|?^pk|#pEoNyh>Vt_Ia2bBq zqwbxjKHSz4Sw^oL*`V8i7(8)#P`=&Tm*Yz{PIhNINO;XUaeA0UlDa|SZk)%UwlW^U zn0W*fIL;)noS}=zU#l^qLMiV$Wqkmyg*y7Vf~#+3_{aiO%!eWQ1l3-wG#Ab4Quptt zRyRe&x3Py_D_;+VN5`6k*E-t`^TY*x%jgI@R(;qSTSa5e_odFLA~keDhV{RW5=p`MF`GuPop&b^MlArKeA=|b_?XN634nxovcGmBpJZ2bk6PYcoQhSGvN zScz+-z32@xSX~sd>|}kNSL_MzE|~UJgAL7d-$uS+)}K0Q;jLp(9Ci32cUx(U!7ZGw z>e;WV9!1zZj65?4(LO#tO}P^o;8Q}J?SZeDOX%T|YEXmJPY4ymP89tR!75Qr zz-*`VUja)?MAWGWMqO44`(QR~#z$t*B5t~zDeLWd$D)b?*)n&Fn}Hgi!jt^u+O`GN z9|afa=dBg4yFaQxPEAHs*;95)v*U42a?(O;A0s0FxHOsDypRC7?^pBjkULCr^Qwh+DuZ|wU!jOpY$GJ$OO$a5A)bUlIx0a`Cec%iHu@s zymUiv!Bd--1_U=>Lt0GG0}LcGMuKg$5rlX2_N230xJDyXw_`TNDS{IpH;htFsZm*g~T=o?zN1$j~IJ zcM8cIb`I$WL>idBdc2P3Q-xMsdM)Zx1w59h4~HOtIWgZw(EH6P7Eno#2#P6E-UR;S zhM{;JeOI8;+#yN(v!uyzZ&n}(+4sJ5qGVpE(&{mBFT*DdK-LZo>AEOYJX zFX9ef)gYA*An2Z5Jypnjlg0E`beI_mOG1hgY0!_=aCRhY!VV@(*QMT}So#IUy&~V1 z8SIo3k;`t(EL#@c|A0w^9`DJDUI%_NRY@A=Z1p7Go5flJXBLawU8b@t4h2H_>ca|A zT$gVXk5D(3=`~|ieLErgM2+?=lcbw8#mo86gLcCG{I4T*|8??h^9LbVZrbYGam>wN z*bD|?p|cqb|8Kx@aijc3i|B+l;NDu{Qf&5d;rH)E*8PWTpXikFKV0WT!2J&w;CCTv z{nPbN!bQ*iNx10QKM5B-`$yrT2{$MB+hm(2`d3u_ZIb`~+%(aqiT*caY+}*B^5Xv% eO>gcz4Y;lHQ)5=gT!Uz5xom8Dq3D;JcmD@1>d%<~ diff --git a/frontend/packages/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/frontend/packages/android/app/src/main/res/drawable-port-xxxhdpi/splash.png index 6929071268eb03ee0f088142b6523566b78550e2..7f5afca04ec9983d7f536e278e81bcc59ac5b7c9 100644 GIT binary patch literal 68328 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

    w5 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 E2KUz!jQ{`u literal 17489 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 KR&><$`~L^lv%S~= diff --git a/frontend/packages/android/app/src/main/res/drawable/splash.png b/frontend/packages/android/app/src/main/res/drawable/splash.png index f7a64923ea1a0565d25fa139c176d6bf42184e48..1e2132f542718fe739adec1fe9cdc5ce806a1335 100644 GIT binary patch literal 12992 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 ZqLj0c;BR*if2+cxt7Uk<=-$&;{|CeJBm)2d literal 4040 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 XyOn+%7f`N3b2T^T3uj5+eShz7v)7qy diff --git a/frontend/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/frontend/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index c023e50595074292c7361183a64de08cf9686c9c..2bb26e1bb42d3704f9572bf59482423de8dd7636 100644 GIT binary patch literal 6317 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 delta 2779 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 diff --git a/frontend/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/frontend/packages/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png index 2127973b2d318df7085734d236d0ec649a2b0292..7f4c70eb80947fef53c8a70fde96314cd57a551b 100644 GIT binary patch literal 10767 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 R@en78wz@vL3S}SqzW}`&-5me` literal 3450 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 literal 4341 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 delta 2098 zcmaKrYd8}O8^wD~IBdl0#8>e0i?-+xz?Szd!u1`?~)3b^m`@v?<*>Ncscl>}c;DKejk= zHd+Ox0(kcmWes-CWBkiaXo=5SFo!OC`d(jc0FeXt(w!@BBgMuqpL?kT;4aBR-#=$u1Y zXQZ9Do6&h3Ks_#>9`@{SUyO<-cF;LPks9`Tnf$?5U6;jm zMuoveht%}$fMGXTC0Xg{aQCLt2?ilw8>)s~3|So|{pYvEVP)q8O|(61ueiyOlnIil z;^q`^E65y0+&^btI3Bl^n-dWCvkL$205 zEqW6%TeXa=-8}rI!zFZkAumE{PY#%#YVQ!<^ls_UwR(_D)B12b+XB1$J{Yu}uU7_1 z!Z_-00pd479o*-pM`~e;Qh9+pTi9L{ap|QnwC|~kh`aygl?trf(pJav0sJJuG21+1 z39emQqYd!o?X~2+{6S(9PKaGtXma+BE>Ij3+euBT!8-ztg^uno+Gq1tTTfW&c7PxH zl(U2N?hX|a89U2GHBlp_+C#J*bE~AU@0U?DB^*2l!d(~u9-+dqW(%hNKZYZpj<2xN z?rY?^gX(t)c{@tojCR##qn4~{?X7i^@@{5c(v1$wDqbF5VKsi)n9=DtyXQACGj@7h zt4Kzn{QwDfKEDm~yRx&IR|==LzV5=_5b6Vmgi9}P4NJokALOJ@9V{qb-XxWxj|e-i0pn=^tx0a+dmnvc!n+s>1ssXWeQqOyD2wR z677toTdjd#Rw>}Y=Psm&qP&1f;I_%f)iI(6$LRM606AU_gF2>ZoO21{+65$YMJP&J zxx{CGtrbGdF=kULR9J=$Cv7eVBnL>xyE|;oHvgtejGV&jU3E(GlpnAo+O?nDYU0;Vp4}Nj`s$z|P0JTi3sI$FS zcEL0X@rc|I_S#HO2PuWMnIlkSZkJ**>^1$ogTCjlbh{|KSrDoQ%B)3r3U+f_`RJ1eeKdGgy6 z&icU(bCRYR6*gpFK5=%H?=tTyTlOPZ(?GrCFTch3b9ziL?|%D|?EP~QRRFm(^eDA6 zI$z-aTb5weQxZa3UU>hP9pDf_%9grMLp=}|uCZaRDaH@%RcNqP=1KU>ZZV4X39ep} zcu$UpOk^M}2<)=H<1*h@LZ#x~DCc_3*sY%;5o8tmZQlRjdl0M|jouhFm~_^okhP-b zgdk}LUUWXx$cMFT?j(!8R?;IAiLDqUT$C>6VEmzoVv(uxF3b#{wAE#{ShWvC{pnl2 zqdeGCs1&}Em)sJtZE20V$aMP=t8!)jv}L(h2KHBuX9~NP8MFPT*r12(Gb^SLl6v4V ze@>mqDixHjNS$XYbSL3fDcVDXZ>S}8ajB#j+r4aWZk!b`5JSpDGC%kyby&XiQ{slV zwV>zL%O%63dQH; zO=K)XI^%Ko6TqXb+7mSREC~Ts1uCo$eyI-|pQSq>-C>E?<|iS@BnHyf`k4dIvQJfz z8u#8W1%n>{mKG|;E45!bf4d)VQbU@cfU_4~5aZdwi={X1$Y-Kotnv-JnSweZ$Fk-` z_V?*$i}USuI%FG#ITjo9$L@Ap7D@ z{l`W0s#znb-=J?Wqz@vH?Q7;jsTVw5?Xzv4!iRO+a3)0h7))qjEgwsCuH_wVG8?IW z@G=tI;&JiHN77o<@59^+_p(&C9^_3HWE(19w#+@xc|{-JK16178vh2PywQ#U9sRDM zd1hjIU~#($f3o8HV~9u1Ls&|4Kc{IL9Gi*a8H%bNZi06FtNy!U)%jYT$&ux)H%ir9 zx5G=+-SR#x-Ts&$_mPoa79_GTR#gkDfKfJ_vMrn;;h{Qa+r`T5HHo!|M6T43@yyN0 zZ{TxKKQDrn-(uW4eestbtrKfn=>*wGDd`n ZSz7>RL^{K2Ty6odjWg=BW1T|~`5(R-{NDfo diff --git a/frontend/packages/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/frontend/packages/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index 9502e47a2c575c50c925b987f397bc5244c57b90..9e3b2525312dc777b9b1618dbeaba04080f020fe 100644 GIT binary patch literal 4216 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 literal 3981 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 nm0GElTB(&OnKI&V600000NkvXXu0mjff+~0a diff --git a/frontend/packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/frontend/packages/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png index df0f15880bee46332dfc6622583215194f948b0f..ba0a1a968c404aeb6b4a3f272a1a480812a4400a 100644 GIT binary patch literal 13916 zcmcgz^;cA1w3lw_l14g)l15?x>4u>O7+NJAT1toRZt0RP1&4G9VL(7ZX(?wgXpj`} zUA{lO_5Ol4i#x+z>(0IB?6dc0e?I%{Nia6lq9DCTdgsm^3LR|?Q{Z#q_8=w%-V-=Q zcYzNaKT|F6o#rXlU%&~zyPAR8ojYx5WLJ&^z&VMpwzc1#J9md}51dh-*DiPNNFVBG zsF?@b?-slJvswoJ7(JC|FYWk#y=fOZ5VCu?C%fFE_@wXj@go{PL+%VI94byYC!B{{ z?M{_IBAuoQjizp4hJdL#AFr;|y@Z)$jfBLHBzLI0safP#9-j3*x7hEi_x8t&S=f)9 z+J6vF^4NTy@~q#ot0D3LkN*GRl_Ni%BxZQ^6&*hGZyR};kWNeSJ+$PTV&G-)_4$bV zY3fRFjrZ{3&Z@}|sesCD*xVdi1osH;+XX-+Pe zW=@{2Rs1b`ND_-TrLN?9JvAyCoV;F<-TjKlMK@i!SSx9AM{F-(PfT*by&}$ZVSB~$ z)Az>$JN=)n7DC(FTL1pJspwz2yqapo8)=RVZ}Z-4!OZKp;$VaOwg;}=)-*mHr+gnZ zl1a5w`7Dl8%T5%GrFuU>gcIR+XFcZn4nGTyq0F6EkH5Tc*~TgHpppk2diD+57mx%K z*3pJMpT<|RQ*8E2Hc<~rG0DkiiEkk&P~_>|!JJ zTbFM@T|s?U&l^6PmNYV7mWu7MsKjgw(rpJ{%TZ78Sbk$tQZM6{@GpO=wUM97XGSs3 z1E+J%JcNMy3FxBlMGwVWkXd=dp8oaB)T2Wu3z&*M;3gn9sTZ8cStbZjlGm11vQc{U zdOD~NTCn;@1vBs9O6b=fA+k4e{e5aS?in5e(umBSuyVLag1Vu?yvV*yd?g5lE072* zIrHA32*FET+S#+ZP%>_lk84o;cZ`lb{Nei@H|S1C26=(Y%7iQNmKw;8CyKv;saKoZ zh_g@|LWPt=DUDmW-5Rlq<1STjhKRuL*^H4R2uO&gx*nW;{)i-PkKzz|~#esi7dV=1VCw2~K=Z zVvzzq49-pRh6d;AF(!;@$ZM=?ZVFT$a2H7Uw5hl);ucc72x$~(Xk!Loc*m-fM$oP_9&luD9n>33Q=cs`=ZWS`l14&b!9rxvBP3fU%_8cc zDxq1Nl#5E^yj?iNZRH;_tpD|SdTj%L#OYxFvmZW`cf2nCt@eZ& z=_kM-1K_*rt##u8FKG30^>PzCqZ#1z`VP%~4DheWEWNef{3^Js^;pi6G0ic5uthB1 zy`xx1qtuCVp+!2sD)_-DKg$POdoc3UcU#DNXb^rpSTFjg9i9M$hPmW}4F3Y2K+4}g zopQ{A+rplZrJUp-b=lH2xh=+VS@oRCtY}KGn{!sLtQ3Ghc{H?) zC{-wR{NvrnV;nCFcS^R7suceTl&T1^AGu5pr=`xPgopetOM|1GCflK5BZcP8IzoBh zfKvkyBmGAY^hgr#M2r`=X~8OBqwmJWive|f4d1nnLaH|TroW_? zD1~c#kntihy1ZR45XN7X%o}U#AFaP0&dM3$3q}shd|DUh_Ow4}TIW;zA032u!SLxee7@WdQEDWp+QFiK@g10c-K`h{e?6jV>wd?OZaV4A zW$sFt7L_^m^F=tp9r`D1{Fr0y5pJXTWY5~3nD587&EFW{zvz?DKv<+eyREXuU5WXU zq{Xl^!|e{BSlW9>d}Z8C4|SDG&EK&$-MfmTJ#l_GE&H^I%T!T!T^3Zb6%FT~H(_g{ z&?w*`&mb>(4LcAmBhJu!j3YfRpwT#k!)78x8hM>q?l9W^80VK;Oh|*>qsKVMlMgT_ zq*Uc_X1DU+!G9RiqvF4M)tgHvi?Gk(n%0L%`W}PvMV(!+y#|zl= zf!up48`Tu>O5=go5ZD_>hehDci@sJyG}ckHOpQ(52S>hLFzm0Tuz3UMHM)ve(lroF zPf43t$z43E)|M&!R-I>(B(y!w@oehU;^+c9F9?bq2nI&27v_xd$5c2O7=gIw%z^0o z0?tTsaL{oI5w^_b$>YnFg(rB3khS%uH@wQ2!3k}TEq_qAo5bi4t&%q_H89y$xWU=G zs=4~e!TB@cxa5?O z^a$h}E=}-XG(2eQ&6o(geo6}0`7cP4^Yj>#vh)}x7?3l?_&r!518;tFcM3Hf)9unb zs>{dzT`X)iF?dItNT<^^pN6Bn4X| z>VH2^M_dO;J$h80lK)L^rU^?UoO2D&;WK&K@uAGcecA8mV#`wgUG4q=djs>ff;|y~ zQv%!o^48_n48^cq_%9DpSqnX?36VU|Tvd)oAogg1;i(e|{8tfU{{%0Y3_UX53Ic!P z#Ko(#Yg{rzF_PeAH}a$}@_uPhL{_E65NcqN(l>bp&p1nWmE_C8n-Db@AhR}0W{grh z9wVAM1a?XyEA;Vv%f{YQp{>aGJ|h=icVE zEbgwC7P$+b7;56PxmLCa=YvLulPpmAC;=3+-yO8 zHUR$BK?`BIP8WQ6(CS7E4St6n$Xdi<37lnRmYu{X;*3ukw4wq62A$!oc`yVZoA<*m zOIl#{Z5>FO$~4J>U1Z03oZ?-4UnirIc)?AknncCaC2!3%hdD6NifdFBe&y80pkHq7!Ldwv>?JbkNX=; zQbe!MW3;?ep`WAlgwBMI`7cIDEzlHzGunD$9dQBu$CW#(OXb`F#H4|52q%85RZM?Q z+~{UxaWqAK+!mH4PWRmGs83($plviTkYY(TxfRU z8yLk3Ok8ntH7053Ry=pPXKA(S}6F(dIMhz81V_|+gdEdM?oHF%jJ^LqOviW<; zIQvg3!fr$_S?idPhx(#FCD9*qp|SeeTDMqAKp3k{m;%@=6|#c1_gL%8yI82IOv$&mhSy*U%$#=f2!VaBex%#n68 zAX0m#0If{QA{%ikgULq-S}n#O*Xh0(a=m|VPLwNWV)I^ZZ)bb@_8o2? z`}6@^2T>j1bsfBx-#jO<8@O#EbNXY|mLk@T*6G5dr38vlna!|v zT=D`DTh$JIq9o17WCCE!jE$;eiiK*q6UE@o6%GPqQGz3ulLLK2fEjy+vS;h;mvr{V z(*#&^***07Z9=ENO(CX&V6rh1P3;=uo|l7$Wwhgg3dCE*s?W4OJwFDQyc3TWTL0|& zH10|cFacR-*Y7g(=zPf7=dmY2a(m1u9QcIPMp zWmh8&k*B0?$nwAutX6`6d5<19m0>S+OWw6EkYvk>I8gv(4bCiK&ev~))#w@o4Tcx@ z?i!Az{&7aRS%3^%V?^=<@(lo=6Ac4|OvRph^8o2-@L}t*Hc}wJx1YPIZ1tv~Yas?= zZ10c(NpDYk-}QnONeB4G^H@-(Hrq=doJnFY&T$^D=9cGWq&n^ZEfj&s&f~(Xj4{#- zw2A2&)XS=LiCVcNYqlem=qfLBCKd*^L22ReA?{Re&xYe7`d8)vPTqGLdev?5ZyBmeLfjpcU2Dp=QH zhpkU4!E24_T}#y|Wc$s|hyNLKqY}CZx(b8U5j+44Sw%sYv8>8%evgtCU52>jLNnTK z@sc^#us1KVY1sMbj1YK<{==fDf@o|FMYgQ)FvCHAs&y4Z)EL9q=2*fr)#r~p{*jzM z#-Z0|(950peGh;m5D;j+AKEPeC1@>@1y9%Q=RXSVcvGnh!k?learJE%x}!eXp-)h(}UDZyA@WR6g>4M;Xw z!f{}p@oGuw9dP-jV+$dW7|;X()^sL3c&9#mCQbHr@$RG_UU*b~fWFvJt%<#Y~FkT?tbSC$qwco zfmkAE{PH+0+Mn@DRZp2hALY{-lM3b6hTBo~4=%L__F~4(Ge`@v*%u~FQhB7hDKg2& znG}17tCKaNXt<5|vw4gYnH8A~1)PQz%LS%LVh&lK-4#dZ35Gk?C2d|(A)O@Sv7A#yv&;@p5>I@4U=Ox`T1n~&BtDuPs_* z^Kib&6cZ`kr*hghmG;qZOitJMeZ|4sY!GesLk%u~7>{u%6dBBBNf z58g$-8>jz_TR_9SF{w}>U~NUj<9TR?x=W|Ozz=8=PR6c~mq0WJ_y%!=oqneJbCRMK z`A^^v@=v$nsfimnhGIal=J#;mZ&6-cV&_dZ0&=#T#8TO$YhG-I`oJ( z#i=vu^oIoM{3Is^3MUijdYRkvg797Jpxyf)?EA5n4)FJ(K0#`Jv*LeFlV8qC)aR=m zFnw=}_*d*L_qUxk^?^TCMr-&Ay{6g*afUfxIeqdw$^v}D8sBUko`;Q#8c!cf@ep;Y z4?-g8L_EfjVnMj4SOYVVp?DB{qmRhpc_*2D=m?Ix1AMUV2iw7=aIx=?t@KP!LX>mp z-z}=%i25v6Kc!Qjl4pa*TF=7g37H*N$ANN3HS|gOWID|Xxem^5dMmc%AL(5BkVZRa z(2Mu`q%vE^KWk!sjK?f*TOp_VKT&Y>&XTnB?LGSIgklcw#s`zK!T()PWFTjWTZ{g)oZBtcR9xsn$OB7-8U-+n_ z&nf4FttBzWM2q6z2wI{ZG}-fwNl@^93P`PeR!nZ=Pm>hlK{e>mG=UqggfWm8Fjf*dFM+ z0u%{@WGJ|H2F>9e}ph__~~M@AV=F78#n&f(IvV!mdCQ6 z`9;?>Qzq9r_?Uli0(dAot`Fm4k{Lp&XwRs!6O(5Y56shTlqK!q?GszcDGgMuby=$L zEA-D2j1|g7(?J=r^t#;A3!J>~NNBoDk@+x18DUfzC@YZ%C=LBrUP~C6u*my`_(l@$ zdy3>50*T7DP-HTmUwOPqq()BxPY*_f1((OYlKW=&^w?Q)L1NH3b~Keui+i3~h>_hx zX)Acg$Brf2fg$)*m66BuL(<@Emaz1@1W!+KWP0(9h?VoyI}jt@vZ{4+Umf!}5}B z-#_d3G>5uUO*hnC5iQ}HPGTUJOF~Ep}em(wO!M#l>$; z{N>-Zh_4c;2W_X1zqqyqrYG_?w=AeOJ|*R?HHYWTW8 z%tUW)%v+LYC%tr{Ms_kg?Jj`J5#Ip73QQq^Q%e%UeCEDjjv(Ut?xO;|{}`I=_1pb2 zUEWzmZhtj=+^wi@C~(1ZZ0XCwo<`F7A~^ZnIdD(BKNwXTrbD*J>Ry(4az7t)BA3! z=8@Mb8wO-1;0LG`+N*BWO65a?KOQXnf*1daUMt<_8x3v`J5o~__I`}`LPaK%Q5)BwG295R{g??es$}fA>~+=G4c^dM`0q-} z?(PE(XxMgpGw5jd5#A z*R@&ebGnauNZ%`xI#dh#q2$5e57!d@rhm&G7a|^Ht0&b8vEF zjZ_#3wdby#<9CD)K>~Dn#X|H9K2i>|-TPY$d&`VB)n^?GTOErr=feEWv?_$=)P)mve%wi&2c@3qxY8cMEkW%1rOwP$vV7PGsIEDr@xW6pG^a1``ou$dC!jUYX#2{Q` z-773?@67hmx{{&$V|d$I21hveEOSecT2b6Da)&|uN^k;D55M4MYZj-WXz&qg@_(s$Wjw1^JtvC&yyjIMTKa*(zi-BsoyXJ)y^VVGeI10J)fvV0MSiXs@8AnZM zxRQ#>{)wZ$yMDwzdG_`U-R(k?GW2hz?!vhai)>+kV{LB)t?ag5@4|l}>|V*E#65qj z_jB%g|Hhm5J$C#(l=qAL>RbQCpma50?4!@2pe$J681@XYi)JmT090~2RNLO=ESc;B z9J`I9CV4fnANU(@-%cWqu`16%ngDk4RvXqi+vP0HzKd5-j|B%yI;-elvIM|t-Tb6Ci|q^g!IJ~flA@BDnZhr z9?H~iO2I%}5etUj@7_qVW+0zk@{~Av1}VCPWj-R+w?vNhzN=t|(ScB!#*!C;~1K z51S}}nPnyUkQG2BZa`L|wE7Gl_u!LnVfhyTa_;&QHV?QtDGcQ?Ar^)6KnvYPH~dz- zw-*({Cy7wvmtW%iS#U3C?cJPy4*?)M(IE@m^);-kmM6~wz&QXaJYxkS={=1uTZxcL zJ|jI@9{t3zD0G~W$__oxke0RNHLZP({E1qP)bo^3_c8e4v|~-}f9sxzSOoS37cOn7 zw!0A3f8;$}Q8m^`CixA!gOSmW0jn<3g3I$SN+&OySh7B*)=`Ele9sI~z>8$~*HQa? zKe>RE+Ot4l!37@j6qwv+AnR-DmUhH4e&j>y(stLu7=OgU@)MrDy8I~{KA80N%cy(l zyRiOwqJpWPgTKi0mVc4YRXAY>e@M>GGWTmR05$DKp}ZVuH_YSOPMif>n1*PBUfA@` z6P5g#Gvip|?+t#YRtP}rzYo7xnf2ZH7*~B<`ePVB8Y1IiELVMqMUnY126Dgc`tZ_& z%_j=#{XwxkMluDIYAA5-HwMhiNFmr(+e&M(znq!-8q)g4aTyB^oUD}2w+KVdYxNX` zhQI3xBD{$to@L%yWe%!|1g1F7kq=`Rnm5NB`JgfjV5j322t>@J53uMGjwP3$K-zwp z*59^=X8j5Ookln-IPV3SKa3&n{F7^o1U7~XpeFj_1JEemGx-L2luKKUkR>`bhKnio z+xGWY;wN0I#&M;Ws%=zVv&<_$Y5%%pAqxR7iwvHp`pAOBGzA9%<*Y(Z_%6jiTF)SO zONWBjSRk<1R7?gICoj0n$I#mQF0*wl?XR+Pug{-9p)^2)xo-n;{#>s7G3SWxF@TE8WV(yG?W3T&E;rgI|c4 zn`pWYFIo;)nJ**flZ<3gr3NKK*VIR^w)Ff_N^fGkvF(omgJb}15|U}%`V0M4Q{WK_ z{38t(-skK>v_Cb;)gBuB_XD8ptSqTzP7Y6>JZnrCm?z58>ks;1TU*S&U;I+#c#7hZ z^#HlO0f>L@XjmOtGHJ$TW5QXu32u-GCu?j0?M$PGV#eynFqBPw^LT@%2x?QGa=b`t3a zOd%!Wq~}A~#a^rZTbEV?zc;pBi6Vpiy^kf!t@J_Jsbc|dN1^WP(}SggDwL4P1LUS( zNy8`7z}ZkF-xIQcxs~Xj0R~ii(}+b;OOr50m#GZccW2u5o%i+90_J4Mr|WY_S&JyZ z9qe`y57NZW0N{#IF>9{bJif;>9lp{lEBXE6;F~hB3t~}#kwz20XD<%1yAuGZAvaV9 zwTZd_nF9RE_gCd2y=QAAtIeL{SGbv=H>{coaihE@M9?!&)B}lKpEoO*@;z~Mt)AA5 zh``9NvhoZJt-s%~sUedofO;>1)kF-MiBoTfY=7SUf9wE`lFFV=7HSZv!b|-DGFJO?X5Deo`82JsrSv|d%S`joOZmsL-u3| z(fhFj-}QeC9h-}H!7mmV0MYRJE#NZkz{V<;20v;06+OzgtGUNdzs2wfov=2#dwx3S zI6*dX%zM6aAn!Es*kaNuXQ(bbALa0!vK^L%cKv$KW{kdnsgyu(=NUvB5t2J`U6_>D zAl^(X>1Hf$qw`Zourz(AYFLZ)rHugU$GA#Rg9^jBVo%Q-@oz8!G8n=-9&3QzTn6*y z(InG;?0{~KV+}#vRtF!6W1S!E8EQnA#4ij^hS|CX9mrQ|oGXqEF#c1V9)3;VjKXE_ zckF@ciW>l8$ zL!#7Bof4=ObC8;dm=NQAr%5~F6I)a!q0*RZGZf%!RYZz4qWL{0{5LJ~H#ws{@{@Cc zr=En7{8!)Hj*jq>K=~|4eME?$puK`o1=(EcCV8EZbXd#KXtLfG1_WjnN13%tR7w&kz*pH>2mEy+9qTtd2xxYv?s? zs^*2>!8^HLwzq|Y&o&4;%s>zn_{v&b@%A!;<>GYqpD*+{{_-)U5`8w|KPKV1skXne zn6QI}f5!w8l%#$(f7Il=z(~;HJUKEE6I}@tzBX>nj0U;OlWvv60sg>eWs{Dld<{F| zvLd(kkb6@s)fHL1YwaNt`?C__4KnQb9zW{8GBI?r%JQ%^hh(b;ZlKw0Oy~Jlg{(7+ z(ewE&4RxU1`I=>T5%6GSLDWwQK_0{VA4#nEA|T=>D&xz30;Z+_!QtVp9$&ucso7T|Fg{$5N$fi$ zC#1iQ$H2L$8}0chc5pSCdYpTp+DwpEdVnF;c90WvINn;6&T}6T-Q)oN zSVQ({Nq@~SZNIeeO^)??rJ*02k5<#t-mFAtjUs5_prNA`i%KI$)gZSvv7~A!$VDA& zM8Jxh-g7BOkCqIb^o$BM18xSd&jgim|MfeH9oY&Us$qO}5%km>91W`Ikuf~_BTw_Vv#HNxFdI1y_}6R{>m#|4Hyl@I`rW< zHVj0)e%s}hp~vV+z`tawXyLtm=D_Z-Fc79Pycfn!|KgY zR<@`E6p}#zeNG3t*%WC!AF-ZcsDRqCcf<6saDGObwr&DMob#+RA}zEPZ{3rDDmLmu>_R{`(i>7&LquPOGoGdJcQ9eUk4lJJFh?w5Whul8DJTW2bq6_B}T`;`q$XeQ`GLIE3dz)s_!sVGm{lL&69$s-$1ZBLQp2j7hUmy}SBr^Pg8H?vvN) zv!B^F>)hg^0D}=IW9RO$=M@$ATxr~E3Pw)&LsECDmyJD~RH=>C(M{pgFbZBe>&fHh z1gZ~0y5iI0L0s{^tFVy};%w`PDUJ7%QC<_P5^Vv3)5{0M?HVp*M+dfU>=mA!Fxu%T zpTS2TS}0`1AJhr73|$i0$D|BI5P>Ztq`Z(y0Gcj@dR`FZy-RomXfc&kVh4Wm$CnwCe$_O>#qk7Q3P1U;jH!^p6K(n->)mB9$K43*i zkLizHv(6IO8lp{;*NCbdqn1WP9nsSIXE;{U!){En8_Sm zk-07uGDv zjNi8Nl*|<%;l$(3+C)2v{$PlPVpW`sn#~xSHW`wljw^`swsdrwJ}n z;=BK{i%b3vhmRV~{r52b4ZfX~M>?3r=d?7$vgGVY97X(Q^(%&i$$75S`+>94QYIFF}8TeM%j3`#vX(C85G&rX_|@w1j)3~u*?ZV=iIsIJubpL>b%NB zSZP^43tP*^W)d9RH_N=#=Sj|_o_k8AtD^-bp8@ZgAt+3l)kGBplixFF^F3g}f1sW@ zJmqD;N7HqWM+rVXoGPjm#KpcSLKElNU3oup{arD~vI4EyVgERN@1_jk;!Diu@6Z10 zbjs=7O{JyRS+{N$Y({RC0$ryvXkJpcQYZpumOU|57wmu`<=J&4!WZd-LzUOAKuD7& z${ap&H8s!q3Ux28Iun5naFM+d#A1_K1+dZR1uwU-Y18rJCx1H7# zNx#k;MI47ckS?gLEa+U0$Kkjujb|zrJP7GjeV@61a~{RMuNx`-F^nqrryD_gB|4=J=zJ*_GaTQZLgeV>QWrcHz9go$0qtC>o8-=@Y4) z>5M>|Mn42(CsHJw$L3YeW_yT$>b11~4tVnY(YfD+((yKC_)QB)kBQeO_m4p{vIQCl z1UDcV>2Gy88@vF&2myuUOf*4P&6}$&IUoO$=C)eT6c)xF>&18mzbO?o!XHcdaG~~< zVM%me|7}d*m~>O8?=N~{=;cF=#;0*!di@XYms$$hNP_qNon7UZ>V*avgTKG+Hu?K!>3bqK#My=_!gmmJ!=a*ps1@_V)- zPCb^_6x@Q{#4qZGlDSXv-jZHO(}ohj2VKd4bhP;9*T%#@PM}}co`=5zTN@$~o;tXo zwm`q=)&f{a7>z*B>4cqUbR#JlT^C~J zNORkt)}U9S!-xDUABnBtqK}j*&E3SUsn2c%6)TRhS3hx7C4*64AXm6~N&U6Lo~}|r zP+rXBy3R+44BQBHWZO}*ZMP38s-V-D5xqZgp8FLFLO_6iSRIpgSQ@l;@H60M?5AZO zA$3?J1yYI~xfR^6>Gp>LI_pF|g9=d{gT)*_G)}=0AH`i_f-ZUT0uqHFRM;s**IY^fyhD z!-g)xmGm^sX-qtvwtKXJ2c9*t@Y60Ytl6!te>oj1vuqRr3SAx~rAi*k}XwY(vi$gB8Q~>>+a$sos$6y-OppiU^ z(kb5Ro36Jz+ncKoU)Nn_OGxY^gkj6-vNw>3YjXzU#KHBrCtP0tGFew>Ufr9q&${;o zE+qXL`~6EAnpheuC`7DJh zIZasLykIOEJHK=|v=7d8_(!Y)76=|m`TgG2G72d1UFEeptX`I1Db&6Ge|UX_+^D2+ Xma)mVZdL=o2)m=BX{gZ*h9Uk3-L7t( literal 5036 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 literal 6593 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 diff --git a/frontend/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/frontend/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 6cdf97c1196d48e9833487ff6de7c4cfc4e1232d..c8aed1071ccef6c038a23a593b5f44a7f167b55b 100644 GIT binary patch literal 12662 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 literal 6644 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 diff --git a/frontend/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/frontend/packages/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png index 2960cbb6104b915c84760f889deed9bff2b3e17a..a593201126a97479b84a06e46c8a8736a66c9fd7 100644 GIT binary patch literal 21985 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 literal 9793 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 literal 10455 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 D(yvL4 literal 9441 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 y3vD~Wi9;mL_v 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 diff --git a/frontend/packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/frontend/packages/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index a40d73e9c68ea638c28c7b13e4bcd1e179a3a102..5707fc608c9ff81b69ca2e05d0067a34370beb7c 100644 GIT binary patch literal 15734 zcmXwgcOcdO_y6nKdqiZ9tB{?HGOoQt3dxR)5G7mp-t6p)sB9`CBU{F`cO=P*Yg~I@ z^K$Wfd4ImYKVEk}pU>CxJkEKZ^LU=;dA&6@)TX6krvd`Wn1;3CutKL%ufbR*^1bb5OJEfP7g*O1uwO?M4ZqGtT08paV)lhxt zZ?l={>}6%{yS&>vBf)JR&{%{1)@|xGG^sFC@;G6vblSowNh9RW1A&+PL?~}M5|l2I zLZFk^B&AU0{zsJ1+dcz5Y3RKQZ6*PfotBm#blIzB@bz{x$IR=v=Q$0-yr&P()>IRn zsLp1#5vTi2+tYMZxctEL6#^#1BP(D7{}=zwIo&B9hPicgQW@!lfFJ&Pby|6Eq{f;4 z=Qs-dWn*Y1!{g(3n1kd`mp}fGmu6GWVxx%_lMf60*)4!Xna($XN@u~H;%9vXU zJHHu`<_QohdAglGDP&p#Q3j00tMuJ2(Pz@xa3|!lM0&(*EqOe-g;AIa5@6eNkNy{ty^9!jf_2{hJ3qEPn=DlEYj> zlVzS6J~a9uZ}WL+{9N~qV2Xj{%{xV3=KK#hGrp0^n^JpKkj;*tySj++u(=3xoIKUX zdri$%eD^5ngd(m7?W&A|wRkVnC z^FF)=H=OksH@xTZv|VBHcj?8~jeg<>L)8Z7XL#tIk3`MS=?)Z^_VJ#F{LP`&3hBWs z0&~`=i=3{JD^9~QS!(P;6F@``tmghjm9|UTW76CLjU~yh>b)E@NyLwpc9n;L<-m6)WoN-An;^#%3RuDGmeVBSAx1!w^S=7 z_}XLPr;2&|+$gj^@X;~)_D6lK*+*AZ^jF`PeD#+{=gs>eL{FE@5B}w@UhF+t|7TZB;rD}YpsSBF2%S`TpWUAjFBOMeVmg+)vpvms zT*TQpJa4l1y*sn4xoau6zbsKR(2Sd;^k9FGn$hN%wwpr;!N!gpDB>t2a021U|DrW} z%Mx~OOoTIL<(n)By-E8Q63xg|vA@+P5nVbw;Bdvd;QgF|uNoh5__8WqX5*LDEh?jj zM7OWT5nOB!o67o?PpYz9-(PgIK3;~$;1&pHd01Os;0FExAisC zedkdaLF1*mZx>~V=w0ornqohCgx+|1P`qPbI@F32t-Ddre*a}0%cqpcgQ zB1$_kBR?wliggZB)sjn1IUYw9wc@l!D@nrSRqo~Jh%j6Bd+MoVVl-+9U$^Ra=jlV# z48s-eimPk0zt_pG&7=tJoob8g<@c59x|yZPm*Dit-LBlkAi8UKRa?SVVNoB*)EjSGt>Mp&#OiO=d;coEXE-GREPK z?Au3&4+%FT_%7hI_x&TD4M+EtiP^Z~iop)efB$;ri3A3z!zX7}V6~}wD`+=iHWtYa zi6utOf{TA0?QbzX4pA_nsM2aVAw0k-^d|w&+*Cc>2}_L3^In;k!%pUAMMh_<=O#_% z$aa%ePq6#kJ@&rm3%iY_Rac++rE$+}dH(rVcssZFh1qSKDqeWriX*|Q7e&%qS;E-^_WYl&Z!R)L_6de!#$%GfKAbhK3T`cIy zS7glUPRyo8>VbXGbjjJ&fFSI1R}Rm!iqo90F6M!j5Fw6`{|uQ|^Ohx}O>vrmVrIhM)f zCuJWT@(T*R^z__6j&+FQy`z1d9y28!kE3W((ys5a5Ap7OyYicc?n9^4&)F5F=3i6v z?RX~=9m}kvf zJLg8fRGmcr9!JG;>cK$khmqrdTO;BX`-H6fnT8LnM2% z`}?;Qfv%pi#O%Zg`pD=ddxX|@a>a7r-3PD(&{VS0yTmlI?zr%w71tzq(Knhc;1&eU zUWvD!J+>ZvFu`UytlZnO{<61d9sJebOai;Kc+%ZFc(G1r9QC|6j%UA$P|xz;N6UBu z3(oo0vr6(EYr7ve`_B_9w!Z{^v0u9LuPCesp|ZYxPpMh-PUK(A`pSIv4X?AN;iagk zB=0{vJxxtfH_kuR*UAM3cS(JE`A>xb&ZC}~u|Sa^-ViXXmmk-1&;DkIATI4$+aB0> zc!9b}Nidi(LG*_fG(obh7xt!0ByPv#x3ZKxq&7Db8(e+t?yWJ9=a!*SB%Fk$iif@o za;UmPat95s)-=I%RO`X_TE+aFL^`j4s>OPm6utuUg-TKK}G)9>%0@vgAX z1k@Py*Sn1W^O2F`#cpb3W}WNR!*d9p7^mOH-CFyV!N#0nghk0X`^Q3rb%_5-;?8lY6tFe9i z%3ACWJV}$}wDlv#A103~crPAQw%Uv@jgbw8C7D%F=-J~!wEgCct1RD$(aOZ#k5 zllm?_nXNz-Bc6|9NA<{dPHgBQe8hvg2$TXrv6!aqUwwQNZ+#V$Xv_D5%`ljCQTthi zR<2_Ga+(X`*F?mwr=lrLDfp20+dq^o3#J{H-f<*|PZLlUM6b1%O0IcB5jEiiWlp>Z z{__8~1W`rD%2|V!i<=I!$v2@8+!ax3vCC}KziJm24(}IFP zzHwgz47wS7dV?+ti~_Z7+Bol~Cfi~mMpm5ZG6OXPJmV_GB6*c2ETU*FEntt zmY43h9U9H76`&^pwaDjZyFf(dzVf_)surw&sT`^W6iwwC{PAMMb}Sf9B$5CZyx{M! zeFR@6E;WG{qh{2=Ak5!Pje|bz^>^zKU=}=bB*`pIzYA}^%93j9;`zyfGkkXGe%6a% zFedyPV4?ugR7RmS^22#!O4Y7kGNI=zg4vPD$_cHtGNrxf7Ml2(`S+6mgpAz z=$${SCRFS=?f$p0h_G_{WqdK)@dWp^mrr{nEvontZyHl!-4>sVN=oC|B*b#OVDF4 zL0@DPSQc7hlX4L^fyQi8;!B*pUS;ebiVsbDD>ePHxSKjaicO@*-5=OjNt(Nd%pMXyWMPz>`oz z)1h%GfUxoN>zb>71$%*Hy{o~Az4?_4kp2$B{l1wj$iL%6TW9Eqt0K&$>{T2K=F_C( z8G@k*X;n9mLPDfK&$fL1*W)-+{(ZkjY@EO7wGd*wx)*OkBoi!c7|F0pp3CRlg6uKu z9CAvmiKvnPGQqJt-@ke9UPPSn&uUq$vu2QbXFy}1s-%ZMbsOAq}qt4%Z9om*lBOO0=zGf`X%NxMJXol~Nr zP{aG#Kjk#Y@I3Fn%Z-&LrFUrKkiLYHxS5&R?^3q^W4v!|huYstNZ7c}$HbUFgv$oy z-`9`-@vmw#w@ER4V6EI{1{v*HC40vHsx{ip!zD;PY;1}nnh#zP@oR}fj4m`SyIL-f zaGhEA{7Gg~7`M>WI+FhivdH!H!`(+__;C7~3<9$aTs@cyWuwkH$EFb+Evo!khYzh6 z%%vVoXL0hm2ZYO+$KBepUdG7wRtKX^R@)!cqB*>L6a@Sd&EZ8>B0Kg~%?|n+8uegn zIMvnc#GLzjM88VNb6ALQQ6i5_#_;;F`*z3#20)u4ouGc1t&+&r_giSN7_v#L+B{gdxK=!|{~L6kWtki7MoODv&coMs4QoFY}>XJdC{}>L_u6YQ7YLznJ{|L|9pM91HB zIZ-vwq5Fj|qFRm)pJAJ`da?_aRJIb4e8F_|5_j?qk=vVhXm)$yX=(`DpAI_Pi6?<^ zXSei*J&Zr}wI3Xr*m~|C{(F6Az)hg zmaD6NV+Q@NljE*=*#FN+Bom&KAYYf8_G}vhib61Iq!7%+fY__?WgonVeED%91T8T7gNYY4 zI6LxRp}6HQRE6+q@+i=Kc<+PLa|3C45>Q-Lo0Uy#i^ilNP)SNpDRHbWw;7MYQ2B4n z4YbkkwaZ~cOLNzq|6I}-M@h%w;tbxyL*K%OZ}LP6b>{9%JQmZ1*LSl92JQX%Twl8_ zTb|k&!&r=xxL;MkQ^9}NLp4&r8tC~=jQ4TVVudA+eeeoBEwSc;4vuMYX|lJ;|!I5yJYaLz;AU0ch!>c9a8)eDePyLz3--aZz)kl=6a}e zB5JU3UYA31d?;D(h01lKXyU_NfxYqEkP7pBs~f#qLdm*Ss$W%M&|Dt9`O{pIgu9(O z!92{{tKsuX{(pp`w?p|AyH+<;zy8Ek1_TZDmc8{%wPmqQ%_iZk;W6>^8xQ$NePgrx z<|9B<8?GCy4!@P2&ybyLt5jTBPKc{_FwVY1Mr$z%TR3{bh8ez&V1k}yiQ}n7K5=CP zJXDac6}lg65x&a7_PI>VWOF6fR@vjg^b;q6)i}L5?D2_HS441R#Hie@Bx_z~Oy@dw z>e}uU>pe_YU5h#DN=21KL5qTnH#CS>u#ueV$@l8rMnVi19@RK**b}!FnPMFX#Hapb znoCI8?SVEvIY|mI}MNIxp9^}Km4lz76ytMM6)xH1faK6ascPOxYHu{EUP zw@mZO&p_ReoICT)MVuDvQ6(V=z0@3o&PN{snJnl^wPR0(FLUS9uE#jP#9bfyO1SpWXBwaLHKDg&^@h{nba zwydns(9r&DnQft=5e3fWAgQQUi)-9j;oo;Hu5qM?H_x#7?=A9GDA~gwN}z)37l+=i zg~k3--sA#^z3TkAC-wfN*lul>OmcQoNFd5PKX9J39(-NmtJ}%rDz#=umJSME5fZ$3TkCb>uZEGjb)Ld5@6V}62xfeoUYBclzxidK@ zgDqQaVBOrwFW5Bx7TIzYOn3go_0Ko(Bg`}eKW(icV-sz3CIW1!ff|)-$iGi)UXgY# zkcI4P(s;;r%iv!Oaue_LP4FEb;{YqTH!`DY%$7xcXHwtyxZSh6w{X5Z-N+xf0Lo}> zpqF>FS-^I?MUSzR?HZNRwbdv4OBm8)yZ2R84Qe4=n*k4T#YDXN68#B|VLobo3tWlK zQxq*>O(p(xbXN^jymQq8C3+K#p2#@HwMmP$Yn&H*(zjImkm^7X;VH?ZFt{y>ivN<7R>bVJ6ZE)SG^er4&0CX=P z@+mM#iKfAc8I@qOBEqQCQ|nc$<*}*dYu{z#)@vZb#kJv+Pezk{9Ck+B+PzluLP?PH zt(Il-VGOfFWm%Q2Wy&0HTHjb)^Lj6#hFpY{k=igd%KFD)*CWP~`i#o<7Uj5hMvB#q z(?`fB=Hz4AA7>I)p7+FTMOYCHF1Ru5<{SIc+Q4mI+Q8id7##L70T_M&{}?F0nzRUd z^2Pb9$ruJqo%NemOsR45T_QC86`7OM(rjfy#9Y%@2gB@ciFv0V5dr_sTlRQ=!QM;0 zib=vY7HB3dgV<1CLV;ZmA4^1kp|DvWQs$1BmCg$xoQk}bl7sgQ- z<<9SY+WL)^BhQH<1zd%3r3BiEd`Fbq%O~9BUkaAz%wZgiYAQyP3alM|MA&z%?mNBJ zeB}pj(1hUoM8{-`NB*?R&384h%Vmr<(v7~2#}DC+fBk=c@9JL4xmC$}tNlgTQ5In} z_wl*|ol4d<MB){5*XZLL5+8T-& z8oyAq-r=wcLNJ^J7WB@?1iv8iXH{H&tu%sV7g|L86op-C*}nvT7x9e2#P^k&%|kgX z$eA?=I?@`x?j8bBJ9GRW?DGh>fnJ4AfH6KDXY9V+lkn$DTni6e37SFj*fv;MON(-Y z4bRYc`r|H18ipIWHRy_i7&PlZ8i}*q6qnOx*p2%V#-c%^x^DBJv8L!`QE(yg2l4h0 z3Y+jpvbT&OyGP=!(W21^>=^fHGl{4L#J2Y-{_U}T;)PxOU$O(ApS{big@+Q|b7x~* zUW@mnNVd^)zYK5rwY@+sPRnt6T|BoN9cP`r)8!qPv`{bCF_z#TM}o(2@{V08`)ca* z?*m^6J^b2X6@krUJyc*jh3J~keM z+sDwPCMCzzi2b8aol?-F1Lnr+H-f~SW4d$7$0m3SU~4kuqYL1O_n~{i_o#?KegJTm z+VLPWO~=lJ>j-}VtL8#F2^* zE3=ArLcLt0xq;|zc;21Myf1z`=i#1wKyVH>*>YCZnyA@*s;NP>>Qb)Cc)$s zofa9_dw9CA-KVd=VU1=2=uP4PY&-|VxYx+FZvoteE0RelDu35(6|5CHV1s(q4IBV= zwBydR`A6ish~CH+e9`VByHWqQzecAqguvJ;#R>vpO}t6mKTi3_ZJod5R$??Nx+e6W zB6G%t6x#*rrTX;4o}DRIBocyLftq!Qi*QDD$^~zdwALkH-dZ}qj;p925mM%sqW%_N zEB(V@ik-s8lI`>^=o9zb<$_po<09L}CU zD8>g1TV!>$8k#KHKM;hJ?a5h@TFQVS7M7!~*3#=4CDALPTv*zhKwltn9e6bIV9nIw zN=Qr5Zc^^0aqaxuT~6vjv%+lZs+l=jD`CyB=IvyR^w0@3ZyuURwaoMNyLH- z$2#vcDTO}QSL@;Cn@tr+ncQc@9emQK1pX2fTX_CGlIdz-mOz;K~5Kd{`2fXi~ ze>$HWaIV>ttwCJA8P9@T3YpLZ!K&g70aF1L$6?k$?t0TL+Iy#NI=;AJvR+E-^_k1#*|yQ?n7SVde6|sqtTie{Ko8EL7}~S#SoC1@ zkODG3Ax3J4!a?imOcT)U)8nru7P-dPDsLB!Xyw#9cH~1^+DsidKVT!>#I0{jyhpt= zIQh1#PB284opq%xV6A#CH74FmZN*yc%QRFi7(>F_91}G#wAi1sPl4Gk#`?+Pm})Rj zA@c7Po_h{vTYMyt{a9hajiG?q!Dm_YfEf&q^!6Ejuk1!(C}nRr*(l|OSx;}i@bDSS z1oa-1U7Bz#)GUZCfanN7df23i$_4P!+7v$ipHy>J&}IFc5o>?!UBnL!fpRZMDSY$gI^Vj8@8A!Te8IYzsvrPDeN%sMH^44FKQ<(0{(h% z?%ktyQ9u(aDYcXd*tr&WsrNCwH;c2)EAFB{uk3o|bCj07HngROTd2R^n=rIBf9Jq# z7}%J818o9NB7)x$O5+JSd7Mb~U_em-VI4s>c=`a3D*9tzL77@R19ACpMCZ5?v$z+F zOxiu2ZQTvcE>*H%d*QC(KagZ&w^-S=42ITG`*N6FaTm6FcC8c~@F{*bf;i3Mi6Oe^-ya1A4e#&})8*9*eC4a}s%tQ`-kAGH=5Llv7JrOJ#X}KN!ql$JY^d-T($cg|Z1o;aVt=EwwvVDk zwsLOoI5BhgJ6Ak(LG)M{1R=_i1o7DeShc3%2FXvl) zB+=cX=4*7LxWR$_gI{A2Wu_?@)xq8-(yZwNGZfHK2vQsL9~6)7xUV*i%7d9IBdqq# zBRbUwtvFI3M$ygv`!mr zyjHzhK|y+COgC$~bJV)Q&&+RH_zqA($l}CPS}p?E3c&vXm=Cxd zX#6F|m0BOQ3`S&zaCVOov6mMq3DBSITX^_)aNykdm``5t2l0IEtQgfy8X|!KIly=Y zuIwE-zwCJo_&)~SgPxhPRfv#_tDx50 zoShItEPz$+K`cR>6d6o0c5Tt|NWBCcSCz!jEJ%oa zqTI0xDbRn$RmA0WbSMBpm`zXGJ)Xt2T`J%<@FEys;X^AxqMRYuZh*n|C<0{7v?8~G zx&-iu{J~xg_MHy0w(fX6)5H|Rj}qa%9w6@N$eW1jl*YaqT>&(FF7) zUlf#4wlpdyfJLxT589KI3|RiVOMLTr!OIIeD%tv353;Qd__#1yc4hsgw)KInHFU8#%ANK{xb4{*sqM_DW|yU~~9K(=L{T^gg= zim-91b*u%~^!(t!@wO=fdcJwgPI&z#ii9_Ww8a$6=h>!WTtV@agfE(#M4-TfM!}l4gB_}ZL;IXJ2H5;UC2&2;X8+?Dq)E( zDiw@=+pc)j?_)^e(E>1=p~$8B^n?HNS|el=CO{-?(LHjlRs!_*_-1ZDU#FUbd&y|c z^V2Yfl`>M>bQlY*%Ep%|@m?@#dU?nmm3%oIE&l8dAjDDHF(2hB^O3*mdfR4K=Id)q z{m&wwF~y932yk-BB8XKjqAqOawwv$h+T^3BW#2%0V(UO3uK_pjH19*-hdM2YjaTB8 zH9XzNh!gM3G2umAfR_Xj0IFVjLKAJl$xS%QJi1};{^|wv>zai_p9$!*(Ucdm<~GF5 zX2CztP1L~Eff(pYw*r1gZ2Fj78ryX=3qby7ndVp%@Y?@WDM%fkb+VCAoZoCZM>kq0 zb=A-#Z=d3P_;BhK0cVW)A*UHXPUfIFFar9PE6_La8DTp1`1s z=S3FNwBUOGzML{#Cs#?G8Nrzg+{t;Ba7ZWFYyfGQVTU#TxT|;Q6I9^bH5}+-7g7Gl z@2cq>CKl09T*fr?wm4fs(K;9i=0og9q%(+I4#9zgUJv3lt~J;O>PY!#^z3AsbaSE0 zJ2`uu1@DZH*^kE@Nwb&~<^1D=t#1QT!9e4$!yO324CI;gAIMG>q5mrK&Y2k*=VnG+ z#L>ZU;y`+XBx$_~l`XZ!SPO%Ez}Y@ww!Y1KsTf>XI}k5*F#BVu1*f7`DY^^HB%(9O zc&Gdz?^B*XEf1-oI)0dnF3S-A($ja?@@*K`Q)VmAdQ!sdzZHD{QZW}HkeyUQGY!(W z_251tmm2PN<%dGBUu#-r5AxUdok)bD^CWWi%u+ZO_||R7Y(Up$jdH#~sm2#81HVix6MqX=@2!u_Czo)IWx?(GgjsXd??}AcP z3h}H5zMshgXq2J8ja`duww#P?4&SN{NTjw^_`vKnXEnz-R3b-3oXG9Vn&%2MiX#4; z_(q|KXQ}b1d3l9DP6~?Lz^%>Yr4kzN{@a_&M&ZkL^`4)-1i^#&X_ufB$awZ$$1+`> zqqhW|`x!qMAYMUp&Zyd3ianpF_2woU-W0Hs=>l!rYWsnW+S+2xCg+;51ZEaw3WN`s zNkNMamy+`KOG6$Fl+c`)?{Ak?TP=_HlRql>&xaqg@v6}wYZtY3sIhMV(d7~v`oQ|L z_#YjX!YouEJeoC1I0coCyW*ga1v9y3)GZyy^F*`sO6%>$%>;vRdhi6mKM1SMKUS;0 zPbLnG-Ue(^(W0$%n%{j32VW)rX|P;)KKPjCbd{J_!x?D=6iqXEdzqA7Z2m^ zM@_}v3aZ`Y!%;)(a>;q)=#fX*F)tM}9oFDO)IDYTKK_PV#}j>v?T=zCEc|@Tqv>b1 zBdimGDPN?EVvlBfjNZ<8nbWt}D1#h>=VAi#p`l@RgJ}~Nz|c2QN^`5Z*>BNaymq_f zrM-D{J2{*_;bNBhGC1?pZ$*HVDGkJ727*T^C8C#?C1s1?g~3vO5~ZKwa?ApU zRO%LGcEGb&f;1=W7k!Z5YqAEOARe3GA}%MVmPO5y7SKv8w*Kk8X)qrc1TvnTDk+{A zvD$U#n;)RENn1EP=uz3!Ds_y=hb+K$pC@$oJjay}{pS5WbKYm|GXBeItm7WuUy?O* z^CJa)pHie8^^IB!lWpwnOyV2L&o6Ak;w}!!HXa`^MNI{pCt+UiTC?GWwSb#R8+7bI zLLZo0D(}{+(H@9*iL5Iz*9ETl29so4twuslIW0ocv}3{fi4=c({&}TNfiyHepzh>3 zz5D5$!ljUHsoQAEIkyXIYGeYI-ZqGsUkY$5oeI5~#3@UI)LsNjNXN;pb{(h?4vp-F zYUryN+%FhrUY8^{GVQ-Ibjyd&nnhf-#Fa2BS&uj(gU&uTl%JvedREW}(s3tuXytL_M1jw4*4imu@P=w6?l<4pVypZ z1{(HD{U+*BRSEZ-o*H@?dhk1B}zLuxBcXM6}Q^aA@9XNB?zI`%Ty`I_?8O1ejHFA zuU2!{jVKeThdz+Jd#jS-3tM{@v4nWSnjbw!XuPn?#WRZ1rZGr~4`>!1=5_}#bZM=k zC&%mx4+}vg>Uusb86+%qQ(%~gnjWW~b88M%DirN~@lBa2SQJegy>OB%RGLl5s94AF zIqhBLBYDhF+O}ny#^-qOG-~Pu@+k~X^wpkScrIIoio0EzMMq0b#$?~&<%%{tUu;v# zv?9+<-T8@59c%zWT}Sd5`TYUZ#;IH8dQiM zdMj6N@r5|&YmG<-XYVWvXoelyG++Omjk{*Ay5rq@{Kk_6GlcgOl{c$rf5 zjV@&hOYa32n>q#%dWY%T^Q*G+MH)5 z1n0yg@C3h>fL*ElPOcVG=1lfZkWTS&=3U5D-O#Q6|4Q+^q39@DswbzsY#7QKt2g6f zWA6!;8c&4M%P2J-$V%nOT0eDn)Zh<%f4fxZ?X1NRuWG*C>|g6Qk|Er(>~+;?d=H&| zUcde&htxJ?x^-J*qWa^qQrkk$O=$&G_l)VDkV7QtQ~-BCBof*PVQnr^OgbLlbC?Q+ z!uk?oY?_~g8#jBm9fUW%ni&GGW9(XSR@Q%otNopDe!l<$#@uz7O#W1og3aExEz5%k zl}gb`*RyQ})-tJqSLC8??6Lgl+xZ1@o04Vi-85$`{m9!#K^$u42pQ()!xIE06%~TmEWW>OWeQy0(H6zwr8uSzi}Uh!KD)Yzs{^ zgf7bp+^>ldFsYfor87Ix7ljE-{vQ54(%D;~W7qvj2W~bq0}P**AFCVg?oP}!Xav`^ ztv4TMapNi7ysp+Usr~&o?nsg&U$ZXJcV)At4}0GYpBYt_f?2HT7FE8^^LA@=HI#^J z^XPRV&u0|tD0%(;rbKPE-_!vp_IgxPVm^;I^!7{sK#ew;iuNF0eV9|EpStgREwe{* zj%#31pNpJh*!*{WUg#(4-|AJ+>q?)Pe)~%Q_SsqfW6kb*BDJ_n_vYc&GB%T4SYcZo zH+Wi}R-q2HfZbr+YMt3U;?)&IIdhPrW6~T%pf-`g5BgIT$|IfkxS}xMxEB0-@?-r4 z1rxTPyL(%l+ihHItLf~RpD`x*5bD9K!SAqhp0Q6uUoWHG4SbqBjsv7gzj%`#4Ewyy z54?tod3>iiG7p=tb* zk{RZDY8|SY=-`E6*ut&!2!*uf}lqi!r^0({1w`2@L|x zCh&w>r6h1;4R-s#Gg>HGG*|`h*^l7j|2rM}%hYye8Xt-|d%FSqn&hvo?s2z{8Av9) zL4ma@?+AlLy!|{bL8&u`#!qDT)q5OlM|)>D-tmka{jBI{eH;C04y=ykMc85eGzsC_ zaDm{TV(xFc{K}fnYb%b_-gQi6mE0r#4A%S-dnD)vihw83#JE$f^IxO3ssks=6cz`a z(qP5)&G^cT1YB6|Dz1YMEO5e+Yr&Jj4CQ4793p3P*J>&h7fFr@E1x}F-Kic!Uq3DV zmZx-9@a#8oV+MSpqxQ0cd57O?EWP#F_0=;!*kPycgm?cRq}g${l!^;%vZZqm?T(=T$_Zk0MDnuIXh2r z>)nn&FGlwypV^cf3bgQC?Vf;5XDh06+tT!GE8&TuXp#8_Ih@0KXpBvR`D=V-rUK%q zy8MH?Q}LP;A*MI(}0l$cy$|>~2PrJHJ+@pWeY=J`wUY zI$z-;_clDImftl5Y^Mi+PS4_8Won_MW?4U~Lz^qq^I#(w8-q?eJJ4C|eg&_+4fp?~ z_`-?-e0<|F!ws6p)m>IOoc6a(gLhv(_sw4{BT6@9S3~bvhxKodZN~k z4vf9`=E*0skc62;81ph-Za<%J@jYnN^P*wnvyn*9@^-Tg^ZN09&EKNTopdVjS4MVN z@a8tpf|@&g$@BgmskwNa_UB$K&3zsG{7}^Z@%;Y37XN@Yth&U1W*&T`eO~A@?H|+r zNN0z3=-W=<530N$7u7<4cXc(dh`*-=kB^7i=7S!AaPH0aCe+^6F53?MHJi?}9k|ht zKsD_Zw<&Dn@=o`t9mw1l-&PtkI7I#{e7+85BhMGP|Ig@xlSG`-UtLw+%(z|fS-nzy6B9^zS} zO@b++v>rXbH<3;L1t)ia5R;g!QIhC8d}8Q`FjC!+OxgGl()QlIC#EV{kQ)Hd*U&GAL-9{5l{g1BSB; ze!<2u6srtH`1b{4W;x1mDFXoBkSyGj? zqEez>fR#XaMdcLl2WN7J?RfDn-#CE}9+`<&9UFg2L&tIe%SU?Z4yMKtJVXZT+9(pkJ7}T522aA zdMSo=k|(C^^-aGQx2N)>8uyyTG*xkQSq(K!DVzMdDIR__R|0BoU8$LIa<}i;b8ps+ zTA1j7$A5NLdp`NZQTCYzN0pnqOReVDN0{d^R)}^M-FSA!p1WBb{BAOBcfe(}LT~AP zb{9_Xc|3VYZ4cTPG@z?#s8OnB7xMoA D(yvL4 literal 15916 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 - #FFFFFF - \ No newline at end of file + #101113 + From b5eb9954d0979d444bc232692bfd0eaf5769b8f9 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 14:15:50 -0300 Subject: [PATCH 05/90] Add email for deb compliance --- frontend/package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/package.json b/frontend/package.json index 1c6d2d2c..73c94ce7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,10 @@ { "name": "mailflow-frontend", "version": "1.4.0", + "author": { + "name": "maathimself", + "email": "matthias@mailflow.sh" + }, "type": "module", "main": "packages/electron/main.cjs", "scripts": { From d04bcaa4f73d9b04ddca777beddec70a8303bc2d Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 14:23:22 -0300 Subject: [PATCH 06/90] Add homepage for deb compliance --- frontend/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/package.json b/frontend/package.json index 73c94ce7..a80f73a2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,8 @@ { "name": "mailflow-frontend", "version": "1.4.0", + "description": "A self-hosted, unified webmail client.", + "homepage": "https://mailflow.sh", "author": { "name": "maathimself", "email": "matthias@mailflow.sh" From c80f75db646e655464909bb459af09de73288280 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 14:33:03 -0300 Subject: [PATCH 07/90] app versioning tied to release --- .github/workflows/publish-apps.yml | 8 +++ frontend/package.json | 1 + frontend/packages/android/app/build.gradle | 2 +- frontend/packages/scripts/set-app-version.cjs | 53 +++++++++++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 frontend/packages/scripts/set-app-version.cjs diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index a009b644..733ef589 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -35,6 +35,10 @@ jobs: working-directory: frontend run: npm ci + - name: Set app version + working-directory: frontend + run: npm run app:version -- "${{ github.ref_name }}" "${{ github.run_number }}" + - name: Build Electron package working-directory: frontend run: npm run electron:dist @@ -76,6 +80,10 @@ jobs: working-directory: frontend run: npm ci + - name: Set app version + working-directory: frontend + run: npm run app:version -- "${{ github.ref_name }}" "${{ github.run_number }}" + - name: Build Android package working-directory: frontend run: npm run android:dist diff --git a/frontend/package.json b/frontend/package.json index a80f73a2..ab82d2b6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -15,6 +15,7 @@ "preview": "vite preview", "electron:dev": "electron .", "electron:dist": "electron-builder --publish never", + "app:version": "node packages/scripts/set-app-version.cjs", "native:prepare": "npm run build && node packages/scripts/prepare-native-shell.cjs", "android:sync": "npm run native:prepare && node packages/scripts/sync-android.cjs", "android:dist": "npm run android:sync && node packages/scripts/build-android.cjs" diff --git a/frontend/packages/android/app/build.gradle b/frontend/packages/android/app/build.gradle index d928d4ba..35e00626 100644 --- a/frontend/packages/android/app/build.gradle +++ b/frontend/packages/android/app/build.gradle @@ -8,7 +8,7 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 - versionName "1.0" + versionName "1.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/frontend/packages/scripts/set-app-version.cjs b/frontend/packages/scripts/set-app-version.cjs new file mode 100644 index 00000000..21095489 --- /dev/null +++ b/frontend/packages/scripts/set-app-version.cjs @@ -0,0 +1,53 @@ +const fs = require('fs'); +const path = require('path'); + +const root = path.join(__dirname, '..', '..'); +const requestedVersion = process.argv[2] || process.env.APP_VERSION || process.env.GITHUB_REF_NAME; +const requestedCode = process.argv[3] || process.env.APP_VERSION_CODE || process.env.GITHUB_RUN_NUMBER; + +function normalizeVersion(value) { + if (!value) return null; + + const normalized = String(value).trim().replace(/^refs\/tags\//, '').replace(/^v[.]?/, ''); + if (!/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(normalized)) { + return null; + } + + return normalized; +} + +function normalizeVersionCode(value) { + const parsed = Number.parseInt(value, 10); + return Number.isInteger(parsed) && parsed > 0 ? parsed : null; +} + +function updateJsonVersion(filePath, version) { + const json = JSON.parse(fs.readFileSync(filePath, 'utf8')); + json.version = version; + if (json.packages && json.packages['']) { + json.packages[''].version = version; + } + fs.writeFileSync(filePath, `${JSON.stringify(json, null, 2)}\n`); +} + +const version = normalizeVersion(requestedVersion); +if (!version) { + console.log('No release tag version detected; keeping package versions unchanged.'); + process.exit(0); +} + +updateJsonVersion(path.join(root, 'package.json'), version); +updateJsonVersion(path.join(root, 'package-lock.json'), version); + +const buildGradlePath = path.join(root, 'packages', 'android', 'app', 'build.gradle'); +let buildGradle = fs.readFileSync(buildGradlePath, 'utf8'); +buildGradle = buildGradle.replace(/versionName\s+"[^"]+"/, `versionName "${version}"`); + +const versionCode = normalizeVersionCode(requestedCode); +if (versionCode) { + buildGradle = buildGradle.replace(/versionCode\s+\d+/, `versionCode ${versionCode}`); +} + +fs.writeFileSync(buildGradlePath, buildGradle); + +console.log(`Prepared app package version ${version}${versionCode ? ` (${versionCode})` : ''}.`); From 4e2962aa5088a7b2b2f36abfdbb81bae760671b5 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 14:53:20 -0300 Subject: [PATCH 08/90] define portable --- frontend/package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/package.json b/frontend/package.json index ab82d2b6..05eec33c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -32,12 +32,16 @@ "package.json" ], "win": { + "artifactName": "${productName} Setup ${version}.${ext}", "signAndEditExecutable": false, "target": [ "nsis", "portable" ] }, + "portable": { + "artifactName": "${productName} Portable ${version}.${ext}" + }, "mac": { "target": [ "dmg", From 4553fcac8da82440c75c01f826adb65273a79d66 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 15:16:51 -0300 Subject: [PATCH 09/90] expand package coverage --- .github/workflows/publish-apps.yml | 16 +++++- frontend/package.json | 52 ++++++++++++++++--- .../scripts/rename-linux-artifacts.cjs | 40 ++++++++++++++ 3 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 frontend/packages/scripts/rename-linux-artifacts.cjs diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index 733ef589..b89b9460 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -40,11 +40,24 @@ jobs: run: npm run app:version -- "${{ github.ref_name }}" "${{ github.run_number }}" - name: Build Electron package + if: matrix.os != 'ubuntu-latest' working-directory: frontend run: npm run electron:dist env: CSC_IDENTITY_AUTO_DISCOVERY: "false" + - name: Build Electron package + if: matrix.os == 'ubuntu-latest' + working-directory: frontend + run: npm run electron:dist -- --linux --x64 --arm64 + env: + CSC_IDENTITY_AUTO_DISCOVERY: "false" + + - name: Rename Linux artifacts + if: matrix.os == 'ubuntu-latest' + working-directory: frontend + run: node packages/scripts/rename-linux-artifacts.cjs + - name: Upload Electron artifacts uses: actions/upload-artifact@v4 with: @@ -54,7 +67,8 @@ jobs: frontend/packages/release/*.deb frontend/packages/release/*.dmg frontend/packages/release/*.exe - frontend/packages/release/*.zip + frontend/packages/release/*.rpm + frontend/packages/release/*.snap android: name: Android diff --git a/frontend/package.json b/frontend/package.json index 05eec33c..1b355e19 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -32,7 +32,7 @@ "package.json" ], "win": { - "artifactName": "${productName} Setup ${version}.${ext}", + "artifactName": "${productName}-Setup-${version}.${ext}", "signAndEditExecutable": false, "target": [ "nsis", @@ -40,20 +40,60 @@ ] }, "portable": { - "artifactName": "${productName} Portable ${version}.${ext}" + "artifactName": "${productName}-Portable-${version}.${ext}" }, "mac": { + "artifactName": "${productName}-Universal-${version}.${ext}", "target": [ - "dmg", - "zip" + { + "target": "dmg", + "arch": [ + "universal" + ] + } ] }, "linux": { + "artifactName": "${productName}-${version}.${ext}", "target": [ - "AppImage", - "deb" + { + "target": "AppImage", + "arch": [ + "x64" + ] + }, + { + "target": "deb", + "arch": [ + "x64", + "arm64" + ] + }, + { + "target": "snap", + "arch": [ + "x64", + "arm64" + ] + }, + { + "target": "rpm", + "arch": [ + "x64", + "arm64" + ] + } ], "category": "Network" + }, + "deb": { + "artifactName": "${productName}-${version}-${arch}.${ext}" + }, + "snap": { + "artifactName": "${productName}-${version}-${arch}.${ext}" + }, + "rpm": { + "artifactName": "${productName}-${version}-${arch}.${ext}" } }, "dependencies": { diff --git a/frontend/packages/scripts/rename-linux-artifacts.cjs b/frontend/packages/scripts/rename-linux-artifacts.cjs new file mode 100644 index 00000000..6465177f --- /dev/null +++ b/frontend/packages/scripts/rename-linux-artifacts.cjs @@ -0,0 +1,40 @@ +const fs = require('fs'); +const path = require('path'); + +const releaseDir = path.join(__dirname, '..', 'release'); + +if (!fs.existsSync(releaseDir)) { + console.log('No release directory found; skipping Linux artifact rename.'); + process.exit(0); +} + +const replacements = [ + [/^(.+)-x64\.AppImage$/, '$1.AppImage'], + [/^(.+)-x64\.deb$/, '$1-amd64.deb'], + [/^(.+)-arm64\.deb$/, '$1-arm64.deb'], + [/^(.+)-x64\.snap$/, '$1-amd64.snap'], + [/^(.+)-arm64\.snap$/, '$1-arm64.snap'], + [/^(.+)-x64\.rpm$/, '$1-x86_64.rpm'], + [/^(.+)-arm64\.rpm$/, '$1-aarch64.rpm'], +]; + +for (const entry of fs.readdirSync(releaseDir)) { + if (/^(.+)-arm64\.AppImage$/.test(entry)) { + fs.rmSync(path.join(releaseDir, entry), { force: true }); + console.log(`Removed unrequested Linux artifact ${entry}`); + continue; + } + + for (const [pattern, replacement] of replacements) { + if (!pattern.test(entry)) continue; + + const renamed = entry.replace(pattern, replacement); + if (renamed === entry) break; + + const from = path.join(releaseDir, entry); + const to = path.join(releaseDir, renamed); + fs.renameSync(from, to); + console.log(`Renamed ${entry} -> ${renamed}`); + break; + } +} From 56e7a3ea72f74d8e8cf1adebd4ddfe2724713c2f Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 15:25:45 -0300 Subject: [PATCH 10/90] add snap support --- .github/workflows/publish-apps.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index b89b9460..4aa5c92e 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -39,6 +39,14 @@ jobs: working-directory: frontend run: npm run app:version -- "${{ github.ref_name }}" "${{ github.run_number }}" + - name: Install Linux packaging tools + if: matrix.os == 'ubuntu-latest' + run: | + sudo apt-get update + sudo apt-get install -y rpm + sudo snap install snapcraft --classic + echo "/snap/bin" >> "$GITHUB_PATH" + - name: Build Electron package if: matrix.os != 'ubuntu-latest' working-directory: frontend From 4feb553e9e8bf5c1df7ff835598839f21c9b182d Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 15:46:22 -0300 Subject: [PATCH 11/90] implement arm64 builder for snap --- .github/workflows/publish-apps.yml | 54 ++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index 4aa5c92e..4d9e1ad3 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -54,10 +54,17 @@ jobs: env: CSC_IDENTITY_AUTO_DISCOVERY: "false" - - name: Build Electron package + - name: Build Linux x64 Electron packages + if: matrix.os == 'ubuntu-latest' + working-directory: frontend + run: npm run electron:dist -- --linux AppImage deb rpm snap --x64 + env: + CSC_IDENTITY_AUTO_DISCOVERY: "false" + + - name: Build Linux arm64 Electron packages if: matrix.os == 'ubuntu-latest' working-directory: frontend - run: npm run electron:dist -- --linux --x64 --arm64 + run: npm run electron:dist -- --linux deb rpm --arm64 env: CSC_IDENTITY_AUTO_DISCOVERY: "false" @@ -78,6 +85,48 @@ jobs: frontend/packages/release/*.rpm frontend/packages/release/*.snap + linux-snap-arm64: + name: Electron Linux arm64 snap + runs-on: ubuntu-24.04-arm + + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-node@v6 + with: + node-version: "22" + cache: "npm" + cache-dependency-path: frontend/package-lock.json + + - name: Install dependencies + working-directory: frontend + run: npm ci + + - name: Set app version + working-directory: frontend + run: npm run app:version -- "${{ github.ref_name }}" "${{ github.run_number }}" + + - name: Install snapcraft + run: | + sudo snap install snapcraft --classic + echo "/snap/bin" >> "$GITHUB_PATH" + + - name: Build Linux arm64 snap + working-directory: frontend + run: npm run electron:dist -- --linux snap --arm64 + env: + CSC_IDENTITY_AUTO_DISCOVERY: "false" + + - name: Rename Linux artifacts + working-directory: frontend + run: node packages/scripts/rename-linux-artifacts.cjs + + - name: Upload Electron artifact + uses: actions/upload-artifact@v4 + with: + name: mailflow-electron-linux-snap-arm64 + path: frontend/packages/release/*.snap + android: name: Android runs-on: ubuntu-latest @@ -120,6 +169,7 @@ jobs: name: Attach to GitHub Release needs: - desktop + - linux-snap-arm64 - android if: startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest From a8434c846f93bdf3cad51591397e5ac842734547 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 15:52:06 -0300 Subject: [PATCH 12/90] fix snapcraft dependency --- .github/workflows/publish-apps.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index 4d9e1ad3..d346a8d9 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -44,7 +44,7 @@ jobs: run: | sudo apt-get update sudo apt-get install -y rpm - sudo snap install snapcraft --classic + sudo snap install snapcraft --classic --channel=7.x/stable echo "/snap/bin" >> "$GITHUB_PATH" - name: Build Electron package @@ -60,6 +60,7 @@ jobs: run: npm run electron:dist -- --linux AppImage deb rpm snap --x64 env: CSC_IDENTITY_AUTO_DISCOVERY: "false" + SNAPCRAFT_BUILD_ENVIRONMENT: host - name: Build Linux arm64 Electron packages if: matrix.os == 'ubuntu-latest' @@ -108,7 +109,7 @@ jobs: - name: Install snapcraft run: | - sudo snap install snapcraft --classic + sudo snap install snapcraft --classic --channel=7.x/stable echo "/snap/bin" >> "$GITHUB_PATH" - name: Build Linux arm64 snap @@ -116,6 +117,7 @@ jobs: run: npm run electron:dist -- --linux snap --arm64 env: CSC_IDENTITY_AUTO_DISCOVERY: "false" + SNAPCRAFT_BUILD_ENVIRONMENT: host - name: Rename Linux artifacts working-directory: frontend From 8ff640ce5d1ff9e4f366db8ef0cd35862320e856 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 17:05:30 -0300 Subject: [PATCH 13/90] additional snapcraft dependencies --- .github/workflows/publish-apps.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index d346a8d9..cca2370e 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -109,9 +109,13 @@ jobs: - name: Install snapcraft run: | + sudo apt-get update sudo snap install snapcraft --classic --channel=7.x/stable echo "/snap/bin" >> "$GITHUB_PATH" + - name: Refresh package indexes + run: sudo apt-get update + - name: Build Linux arm64 snap working-directory: frontend run: npm run electron:dist -- --linux snap --arm64 From 73e4cbef5b7b6cb72b55ea2a88ded41db4360db1 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 17:18:48 -0300 Subject: [PATCH 14/90] add app icon to electron packages --- frontend/package.json | 5 +- frontend/packages/electron/icons/icon.icns | Bin 0 -> 22710 bytes frontend/packages/electron/icons/icon.ico | Bin 0 -> 22724 bytes frontend/packages/electron/icons/icon.png | Bin 0 -> 17774 bytes .../scripts/prepare-electron-icons.cjs | 92 ++++++++++++++++++ 5 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 frontend/packages/electron/icons/icon.icns create mode 100644 frontend/packages/electron/icons/icon.ico create mode 100644 frontend/packages/electron/icons/icon.png create mode 100644 frontend/packages/scripts/prepare-electron-icons.cjs diff --git a/frontend/package.json b/frontend/package.json index 1b355e19..1ddf59c5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,6 +14,7 @@ "build": "vite build", "preview": "vite preview", "electron:dev": "electron .", + "preelectron:dist": "node packages/scripts/prepare-electron-icons.cjs", "electron:dist": "electron-builder --publish never", "app:version": "node packages/scripts/set-app-version.cjs", "native:prepare": "npm run build && node packages/scripts/prepare-native-shell.cjs", @@ -24,8 +25,10 @@ "appId": "sh.mailflow.app", "productName": "MailFlow", "directories": { - "output": "packages/release" + "output": "packages/release", + "buildResources": "packages/electron/icons" }, + "icon": "icon", "files": [ "packages/electron/**/*", "packages/native-shell/**/*", diff --git a/frontend/packages/electron/icons/icon.icns b/frontend/packages/electron/icons/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..4f4704f718e6b2b556ed4d65454b0d03e3e27ada GIT binary patch literal 22710 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 literal 0 HcmV?d00001 diff --git a/frontend/packages/electron/icons/icon.ico b/frontend/packages/electron/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..965e5373eafadfd177eb1a3bc097c2f32686ce05 GIT binary patch literal 22724 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 [size, path.join(publicDir, `icon-${size}.png`)]) + .filter(([, file]) => fs.existsSync(file)) +); + +if (!pngBySize.has(512)) { + throw new Error('Expected frontend/public/icon-512.png to exist.'); +} + +fs.mkdirSync(iconDir, { recursive: true }); + +fs.copyFileSync(pngBySize.get(512), path.join(iconDir, 'icon.png')); + +writeIco(path.join(iconDir, 'icon.ico'), [512, 128]); +writeIcns(path.join(iconDir, 'icon.icns'), [ + ['ic07', 128], + ['ic09', 512], +]); + +console.log(`Prepared Electron icons in ${path.relative(rootDir, iconDir)}`); + +function writeIco(outFile, sizes) { + const images = sizes + .filter((size) => pngBySize.has(size)) + .map((size) => ({ + size, + data: fs.readFileSync(pngBySize.get(size)), + })); + + if (images.length === 0) { + throw new Error('No suitable PNG files were found for icon.ico.'); + } + + const headerSize = 6; + const entrySize = 16; + let offset = headerSize + images.length * entrySize; + const header = Buffer.alloc(offset); + + header.writeUInt16LE(0, 0); + header.writeUInt16LE(1, 2); + header.writeUInt16LE(images.length, 4); + + images.forEach((image, index) => { + const entryOffset = headerSize + index * entrySize; + header.writeUInt8(image.size >= 256 ? 0 : image.size, entryOffset); + header.writeUInt8(image.size >= 256 ? 0 : image.size, entryOffset + 1); + header.writeUInt8(0, entryOffset + 2); + header.writeUInt8(0, entryOffset + 3); + header.writeUInt16LE(1, entryOffset + 4); + header.writeUInt16LE(32, entryOffset + 6); + header.writeUInt32LE(image.data.length, entryOffset + 8); + header.writeUInt32LE(offset, entryOffset + 12); + offset += image.data.length; + }); + + fs.writeFileSync(outFile, Buffer.concat([header, ...images.map((image) => image.data)])); +} + +function writeIcns(outFile, entries) { + const chunks = entries.map(([type, size]) => { + const data = readBestPng(size); + const header = Buffer.alloc(8); + header.write(type, 0, 4, 'ascii'); + header.writeUInt32BE(data.length + 8, 4); + return Buffer.concat([header, data]); + }); + + const header = Buffer.alloc(8); + header.write('icns', 0, 4, 'ascii'); + header.writeUInt32BE(chunks.reduce((total, chunk) => total + chunk.length, 8), 4); + + fs.writeFileSync(outFile, Buffer.concat([header, ...chunks])); +} + +function readBestPng(targetSize) { + const exact = pngBySize.get(targetSize); + if (exact) return fs.readFileSync(exact); + + const fallbackSize = [...pngBySize.keys()] + .filter((size) => size >= targetSize) + .sort((a, b) => a - b)[0] ?? 512; + + return fs.readFileSync(pngBySize.get(fallbackSize)); +} From b0a50f037dcd79438aca7d7bc5cf205a9fcbbfff Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 17:20:54 -0300 Subject: [PATCH 15/90] fix package naming scheme --- frontend/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 1ddf59c5..2244ad2f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -35,7 +35,7 @@ "package.json" ], "win": { - "artifactName": "${productName}-Setup-${version}.${ext}", + "artifactName": "${productName}-${version}-Setup.${ext}", "signAndEditExecutable": false, "target": [ "nsis", @@ -43,10 +43,10 @@ ] }, "portable": { - "artifactName": "${productName}-Portable-${version}.${ext}" + "artifactName": "${productName}-${version}-Portable.${ext}" }, "mac": { - "artifactName": "${productName}-Universal-${version}.${ext}", + "artifactName": "${productName}-${version}-Universal.${ext}", "target": [ { "target": "dmg", From 144d058b7280b177d33c1f19f5c17946fc676e75 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 17:38:48 -0300 Subject: [PATCH 16/90] builder name scheme --- .github/workflows/publish-apps.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index cca2370e..0b02e688 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -87,7 +87,7 @@ jobs: frontend/packages/release/*.snap linux-snap-arm64: - name: Electron Linux arm64 snap + name: Electron (ubuntu-arm64) runs-on: ubuntu-24.04-arm steps: From 28135bedd8c366ec7b7907b5312b91cf57aac075 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 17:46:22 -0300 Subject: [PATCH 17/90] chore: fix CVE-2020-27348 --- frontend/package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index 2244ad2f..6a0f8e46 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -93,7 +93,10 @@ "artifactName": "${productName}-${version}-${arch}.${ext}" }, "snap": { - "artifactName": "${productName}-${version}-${arch}.${ext}" + "artifactName": "${productName}-${version}-${arch}.${ext}", + "environment": { + "LD_LIBRARY_PATH": "$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/lib/aarch64-linux-gnu:$SNAP/usr/lib/aarch64-linux-gnu" + } }, "rpm": { "artifactName": "${productName}-${version}-${arch}.${ext}" From 7e5b627d0a932d557b5ac566e102e79487273f21 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 18:49:27 -0300 Subject: [PATCH 18/90] revert: removing snap as appImage/deb/rpm already working --- .github/workflows/publish-apps.yml | 54 +------------------ frontend/package.json | 13 ----- .../scripts/rename-linux-artifacts.cjs | 2 - 3 files changed, 1 insertion(+), 68 deletions(-) diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index 0b02e688..63bf472e 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -44,8 +44,6 @@ jobs: run: | sudo apt-get update sudo apt-get install -y rpm - sudo snap install snapcraft --classic --channel=7.x/stable - echo "/snap/bin" >> "$GITHUB_PATH" - name: Build Electron package if: matrix.os != 'ubuntu-latest' @@ -57,10 +55,9 @@ jobs: - name: Build Linux x64 Electron packages if: matrix.os == 'ubuntu-latest' working-directory: frontend - run: npm run electron:dist -- --linux AppImage deb rpm snap --x64 + run: npm run electron:dist -- --linux AppImage deb rpm --x64 env: CSC_IDENTITY_AUTO_DISCOVERY: "false" - SNAPCRAFT_BUILD_ENVIRONMENT: host - name: Build Linux arm64 Electron packages if: matrix.os == 'ubuntu-latest' @@ -84,54 +81,6 @@ jobs: frontend/packages/release/*.dmg frontend/packages/release/*.exe frontend/packages/release/*.rpm - frontend/packages/release/*.snap - - linux-snap-arm64: - name: Electron (ubuntu-arm64) - runs-on: ubuntu-24.04-arm - - steps: - - uses: actions/checkout@v6 - - - uses: actions/setup-node@v6 - with: - node-version: "22" - cache: "npm" - cache-dependency-path: frontend/package-lock.json - - - name: Install dependencies - working-directory: frontend - run: npm ci - - - name: Set app version - working-directory: frontend - run: npm run app:version -- "${{ github.ref_name }}" "${{ github.run_number }}" - - - name: Install snapcraft - run: | - sudo apt-get update - sudo snap install snapcraft --classic --channel=7.x/stable - echo "/snap/bin" >> "$GITHUB_PATH" - - - name: Refresh package indexes - run: sudo apt-get update - - - name: Build Linux arm64 snap - working-directory: frontend - run: npm run electron:dist -- --linux snap --arm64 - env: - CSC_IDENTITY_AUTO_DISCOVERY: "false" - SNAPCRAFT_BUILD_ENVIRONMENT: host - - - name: Rename Linux artifacts - working-directory: frontend - run: node packages/scripts/rename-linux-artifacts.cjs - - - name: Upload Electron artifact - uses: actions/upload-artifact@v4 - with: - name: mailflow-electron-linux-snap-arm64 - path: frontend/packages/release/*.snap android: name: Android @@ -175,7 +124,6 @@ jobs: name: Attach to GitHub Release needs: - desktop - - linux-snap-arm64 - android if: startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest diff --git a/frontend/package.json b/frontend/package.json index 6a0f8e46..784beb5c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -72,13 +72,6 @@ "arm64" ] }, - { - "target": "snap", - "arch": [ - "x64", - "arm64" - ] - }, { "target": "rpm", "arch": [ @@ -92,12 +85,6 @@ "deb": { "artifactName": "${productName}-${version}-${arch}.${ext}" }, - "snap": { - "artifactName": "${productName}-${version}-${arch}.${ext}", - "environment": { - "LD_LIBRARY_PATH": "$SNAP/lib:$SNAP/usr/lib:$SNAP/lib/x86_64-linux-gnu:$SNAP/usr/lib/x86_64-linux-gnu:$SNAP/lib/aarch64-linux-gnu:$SNAP/usr/lib/aarch64-linux-gnu" - } - }, "rpm": { "artifactName": "${productName}-${version}-${arch}.${ext}" } diff --git a/frontend/packages/scripts/rename-linux-artifacts.cjs b/frontend/packages/scripts/rename-linux-artifacts.cjs index 6465177f..a241f9e2 100644 --- a/frontend/packages/scripts/rename-linux-artifacts.cjs +++ b/frontend/packages/scripts/rename-linux-artifacts.cjs @@ -12,8 +12,6 @@ const replacements = [ [/^(.+)-x64\.AppImage$/, '$1.AppImage'], [/^(.+)-x64\.deb$/, '$1-amd64.deb'], [/^(.+)-arm64\.deb$/, '$1-arm64.deb'], - [/^(.+)-x64\.snap$/, '$1-amd64.snap'], - [/^(.+)-arm64\.snap$/, '$1-arm64.snap'], [/^(.+)-x64\.rpm$/, '$1-x86_64.rpm'], [/^(.+)-arm64\.rpm$/, '$1-aarch64.rpm'], ]; From dd3cbaad544931ad0b102129157314f9554ec556 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 19:06:14 -0300 Subject: [PATCH 19/90] miscellaneous bug fix --- .github/workflows/publish-apps.yml | 12 +- frontend/package.json | 4 +- frontend/packages/electron/icons/128x128.png | Bin 0 -> 4912 bytes frontend/packages/electron/icons/144x144.png | Bin 0 -> 5491 bytes frontend/packages/electron/icons/152x152.png | Bin 0 -> 5963 bytes frontend/packages/electron/icons/192x192.png | Bin 0 -> 6922 bytes frontend/packages/electron/icons/384x384.png | Bin 0 -> 13331 bytes frontend/packages/electron/icons/512x512.png | Bin 0 -> 17774 bytes frontend/packages/electron/icons/72x72.png | Bin 0 -> 2922 bytes frontend/packages/electron/icons/96x96.png | Bin 0 -> 3978 bytes frontend/packages/electron/main.cjs | 153 +++++++++++++++++- frontend/packages/electron/preload.cjs | 1 + frontend/packages/native-shell/index.html | 3 +- .../scripts/collect-android-artifacts.cjs | 28 ++++ .../scripts/prepare-electron-icons.cjs | 3 + frontend/src/hooks/useWebSocket.js | 15 +- 16 files changed, 206 insertions(+), 13 deletions(-) create mode 100644 frontend/packages/electron/icons/128x128.png create mode 100644 frontend/packages/electron/icons/144x144.png create mode 100644 frontend/packages/electron/icons/152x152.png create mode 100644 frontend/packages/electron/icons/192x192.png create mode 100644 frontend/packages/electron/icons/384x384.png create mode 100644 frontend/packages/electron/icons/512x512.png create mode 100644 frontend/packages/electron/icons/72x72.png create mode 100644 frontend/packages/electron/icons/96x96.png create mode 100644 frontend/packages/scripts/collect-android-artifacts.cjs diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index 63bf472e..c1c17280 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -75,6 +75,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: mailflow-electron-${{ matrix.os }} + if-no-files-found: error path: | frontend/packages/release/*.AppImage frontend/packages/release/*.deb @@ -118,7 +119,8 @@ jobs: uses: actions/upload-artifact@v4 with: name: mailflow-android - path: frontend/packages/android/app/build/outputs/apk/release/*.apk + if-no-files-found: error + path: frontend/packages/release/*.apk release: name: Attach to GitHub Release @@ -137,4 +139,10 @@ jobs: - name: Publish release files uses: softprops/action-gh-release@v2 with: - files: artifacts/**/* + files: | + artifacts/**/*.AppImage + artifacts/**/*.apk + artifacts/**/*.deb + artifacts/**/*.dmg + artifacts/**/*.exe + artifacts/**/*.rpm diff --git a/frontend/package.json b/frontend/package.json index 784beb5c..5444d30f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,7 +19,7 @@ "app:version": "node packages/scripts/set-app-version.cjs", "native:prepare": "npm run build && node packages/scripts/prepare-native-shell.cjs", "android:sync": "npm run native:prepare && node packages/scripts/sync-android.cjs", - "android:dist": "npm run android:sync && node packages/scripts/build-android.cjs" + "android:dist": "npm run android:sync && node packages/scripts/build-android.cjs && node packages/scripts/collect-android-artifacts.cjs" }, "build": { "appId": "sh.mailflow.app", @@ -36,7 +36,7 @@ ], "win": { "artifactName": "${productName}-${version}-Setup.${ext}", - "signAndEditExecutable": false, + "icon": "icon.ico", "target": [ "nsis", "portable" diff --git a/frontend/packages/electron/icons/128x128.png b/frontend/packages/electron/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..31c39a32ab6ce15e035e5529b07251bbb53e8921 GIT binary patch literal 4912 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 iFOF`SN`uq?1sDL<(V3K$00R*K0000 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 Pw?I}F_U4Ud-l+craBkAx literal 0 HcmV?d00001 diff --git a/frontend/packages/electron/icons/384x384.png b/frontend/packages/electron/icons/384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..e821b6414243a5867577fb20ef3c3893bbc21aa9 GIT binary patch literal 13331 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 literal 0 HcmV?d00001 diff --git a/frontend/packages/electron/icons/512x512.png b/frontend/packages/electron/icons/512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..35138e6ac2594433d40cb52d438a2323fe0f6f45 GIT binary patch literal 17774 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 literal 0 HcmV?d00001 diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index e7f1375b..e8b100db 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -1,10 +1,34 @@ -const { app, BrowserWindow, Menu, ipcMain, shell } = require('electron'); +const { app, BrowserWindow, Menu, Notification, Tray, ipcMain, session, shell } = require('electron'); const fs = require('fs'); const path = require('path'); const CONFIG_FILE = 'mailflow-host.json'; let mainWindow; +let tray; +let isQuitting = false; + +app.setName('MailFlow'); +if (process.platform === 'win32') { + app.setAppUserModelId('sh.mailflow.app'); +} +if (process.platform === 'linux' && typeof app.setDesktopName === 'function') { + app.setDesktopName('MailFlow.desktop'); +} + +if (process.platform === 'linux' && process.env.APPIMAGE) { + app.commandLine.appendSwitch('no-sandbox'); +} + +function getIconPath() { + return path.join(__dirname, 'icons', 'icon.png'); +} + +function getWindowIconPath() { + if (process.platform === 'win32') return path.join(__dirname, 'icons', 'icon.ico'); + if (process.platform === 'linux') return getIconPath(); + return undefined; +} function getConfigPath() { return path.join(app.getPath('userData'), CONFIG_FILE); @@ -32,6 +56,22 @@ function clearHost() { } catch {} } +function showMainWindow() { + if (!mainWindow) { + createWindow(); + return; + } + + if (mainWindow.isMinimized()) mainWindow.restore(); + mainWindow.show(); + mainWindow.focus(); +} + +function quitApp() { + isQuitting = true; + app.quit(); +} + function normalizeHost(value) { const input = String(value || '').trim(); const url = new URL(input); @@ -59,6 +99,7 @@ function setupMenu() { label: 'Change MailFlow Host', click: () => { clearHost(); + showMainWindow(); loadSetup(); }, }, @@ -66,7 +107,22 @@ function setupMenu() { { role: 'reload' }, { role: 'toggleDevTools' }, { type: 'separator' }, - { role: 'quit' }, + { label: 'Quit MailFlow', click: quitApp }, + ], + }, + { + label: 'Edit', + submenu: [ + { role: 'undo' }, + { role: 'redo' }, + { type: 'separator' }, + { role: 'cut' }, + { role: 'copy' }, + { role: 'paste' }, + { role: 'pasteAndMatchStyle' }, + { role: 'delete' }, + { type: 'separator' }, + { role: 'selectAll' }, ], }, ]; @@ -74,6 +130,78 @@ function setupMenu() { Menu.setApplicationMenu(Menu.buildFromTemplate(template)); } +function setupTray() { + if (tray) return; + + tray = new Tray(getIconPath()); + tray.setToolTip('MailFlow'); + tray.setContextMenu(Menu.buildFromTemplate([ + { label: 'Show MailFlow', click: showMainWindow }, + { + label: 'Change MailFlow Host', + click: () => { + clearHost(); + showMainWindow(); + loadSetup(); + }, + }, + { type: 'separator' }, + { label: 'Quit MailFlow', click: quitApp }, + ])); + + tray.on('click', showMainWindow); + tray.on('double-click', showMainWindow); +} + +function isConfiguredHostUrl(url) { + const host = readHost(); + if (!host) return false; + + try { + return new URL(url).origin === new URL(host).origin; + } catch { + return false; + } +} + +function setupPermissions() { + session.defaultSession.setPermissionRequestHandler((webContents, permission, callback, details = {}) => { + if (permission === 'notifications' && isConfiguredHostUrl(details.requestingUrl || webContents.getURL())) { + callback(true); + return; + } + + callback(false); + }); + + session.defaultSession.setPermissionCheckHandler((webContents, permission, requestingOrigin) => { + return permission === 'notifications' && isConfiguredHostUrl(requestingOrigin || webContents.getURL()); + }); +} + +function showNativeNotification(payload = {}) { + if (!Notification.isSupported()) return false; + + const title = String(payload.title || 'MailFlow').slice(0, 120); + const body = String(payload.body || 'New message').slice(0, 500); + const notification = new Notification({ + title, + body, + icon: getIconPath(), + silent: false, + }); + + notification.on('click', () => { + if (!mainWindow) return; + if (mainWindow.isMinimized()) mainWindow.restore(); + mainWindow.show(); + mainWindow.focus(); + }); + + notification.show(); + return true; +} + function createWindow() { mainWindow = new BrowserWindow({ width: 1280, @@ -81,6 +209,7 @@ function createWindow() { minWidth: 900, minHeight: 620, title: 'MailFlow', + icon: getWindowIconPath(), webPreferences: { preload: path.join(__dirname, 'preload.cjs'), contextIsolation: true, @@ -94,6 +223,13 @@ function createWindow() { return { action: 'deny' }; }); + mainWindow.on('close', (event) => { + if (isQuitting) return; + + event.preventDefault(); + mainWindow.hide(); + }); + const host = readHost(); if (host) { mainWindow.loadURL(host); @@ -111,7 +247,6 @@ ipcMain.handle('mailflow:getHost', () => readHost()); ipcMain.handle('mailflow:saveHost', async (_event, host) => { const normalized = writeHost(host); - await mainWindow.loadURL(normalized); return normalized; }); @@ -120,15 +255,23 @@ ipcMain.handle('mailflow:resetHost', () => { loadSetup(); }); +ipcMain.handle('mailflow:notify', (_event, payload) => showNativeNotification(payload)); + app.whenReady().then(() => { + setupPermissions(); setupMenu(); + setupTray(); createWindow(); app.on('activate', () => { - if (BrowserWindow.getAllWindows().length === 0) createWindow(); + showMainWindow(); }); }); app.on('window-all-closed', () => { - if (process.platform !== 'darwin') app.quit(); + if (isQuitting) app.quit(); +}); + +app.on('before-quit', () => { + isQuitting = true; }); diff --git a/frontend/packages/electron/preload.cjs b/frontend/packages/electron/preload.cjs index d0f822d3..298fb433 100644 --- a/frontend/packages/electron/preload.cjs +++ b/frontend/packages/electron/preload.cjs @@ -4,4 +4,5 @@ contextBridge.exposeInMainWorld('mailflowNative', { getHost: () => ipcRenderer.invoke('mailflow:getHost'), saveHost: (host) => ipcRenderer.invoke('mailflow:saveHost', host), resetHost: () => ipcRenderer.invoke('mailflow:resetHost'), + notify: (payload) => ipcRenderer.invoke('mailflow:notify', payload), }); diff --git a/frontend/packages/native-shell/index.html b/frontend/packages/native-shell/index.html index 02c039db..d145e365 100644 --- a/frontend/packages/native-shell/index.html +++ b/frontend/packages/native-shell/index.html @@ -167,7 +167,8 @@

    Connect MailFlow

    const host = normalizeHost(input.value); if (window.mailflowNative) { - await window.mailflowNative.saveHost(host); + const savedHost = await window.mailflowNative.saveHost(host); + loadHost(savedHost || host); } else { localStorage.setItem(STORAGE_KEY, host); loadHost(host); diff --git a/frontend/packages/scripts/collect-android-artifacts.cjs b/frontend/packages/scripts/collect-android-artifacts.cjs new file mode 100644 index 00000000..d823266e --- /dev/null +++ b/frontend/packages/scripts/collect-android-artifacts.cjs @@ -0,0 +1,28 @@ +const fs = require('fs'); +const path = require('path'); + +const root = path.join(__dirname, '..', '..'); +const packageJson = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')); +const apkDir = path.join(root, 'packages', 'android', 'app', 'build', 'outputs', 'apk', 'release'); +const releaseDir = path.join(root, 'packages', 'release'); + +if (!fs.existsSync(apkDir)) { + throw new Error(`Android APK output directory not found: ${apkDir}`); +} + +const apks = fs.readdirSync(apkDir) + .filter((entry) => entry.endsWith('.apk')) + .map((entry) => path.join(apkDir, entry)); + +if (apks.length === 0) { + throw new Error(`No Android APK files found in ${apkDir}`); +} + +fs.mkdirSync(releaseDir, { recursive: true }); + +for (const apk of apks) { + const suffix = apks.length === 1 ? '' : `-${path.basename(apk, '.apk')}`; + const target = path.join(releaseDir, `MailFlow-${packageJson.version}${suffix}.apk`); + fs.copyFileSync(apk, target); + console.log(`Copied ${path.relative(root, apk)} -> ${path.relative(root, target)}`); +} diff --git a/frontend/packages/scripts/prepare-electron-icons.cjs b/frontend/packages/scripts/prepare-electron-icons.cjs index 834b02d3..b8004227 100644 --- a/frontend/packages/scripts/prepare-electron-icons.cjs +++ b/frontend/packages/scripts/prepare-electron-icons.cjs @@ -18,6 +18,9 @@ if (!pngBySize.has(512)) { fs.mkdirSync(iconDir, { recursive: true }); fs.copyFileSync(pngBySize.get(512), path.join(iconDir, 'icon.png')); +for (const [size, file] of pngBySize) { + fs.copyFileSync(file, path.join(iconDir, `${size}x${size}.png`)); +} writeIco(path.join(iconDir, 'icon.ico'), [512, 128]); writeIcns(path.join(iconDir, 'icon.icns'), [ diff --git a/frontend/src/hooks/useWebSocket.js b/frontend/src/hooks/useWebSocket.js index 12da4d1b..1eff5bbd 100644 --- a/frontend/src/hooks/useWebSocket.js +++ b/frontend/src/hooks/useWebSocket.js @@ -111,21 +111,30 @@ export function useWebSocket() { const isInbox = !folder || folder === 'INBOX'; if (messages && messages.length > 0) { + const latest = messages[0]; + const title = latest.fromName || latest.fromEmail || t('notifications.newMessage'); + const body = latest.subject || t('common.noSubject'); + // In-app notifications and sounds are inbox-only — non-inbox folder syncs // (Archive, Spam, on-demand syncs) should not trigger alerts for old mail. if (isInbox && document.visibilityState === 'visible') { - const latest = messages[0]; addNotification({ type: 'new_mail', accountId, - title: latest.fromName || latest.fromEmail || t('notifications.newMessage'), - body: latest.subject || t('common.noSubject'), + title, + body, count, }); const { notificationSound, customSoundDataUrl } = useStore.getState(); playNotificationSound(notificationSound, customSoundDataUrl); } + if (isInbox && document.visibilityState !== 'visible' && window.mailflowNative?.notify) { + window.mailflowNative.notify({ title, body }).catch(() => {}); + const { notificationSound, customSoundDataUrl } = useStore.getState(); + playNotificationSound(notificationSound, customSoundDataUrl); + } + // Refresh the message list when the affected folder is visible const store = useStore.getState(); const isRelevant = From 702431d769aebf2b6945e3a362a49ae9312284d6 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 19:11:06 -0300 Subject: [PATCH 20/90] bug: build apk location --- frontend/packages/scripts/build-android.cjs | 2 +- .../scripts/collect-android-artifacts.cjs | 34 +++++++++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/frontend/packages/scripts/build-android.cjs b/frontend/packages/scripts/build-android.cjs index cec5cfa9..b4cb8115 100644 --- a/frontend/packages/scripts/build-android.cjs +++ b/frontend/packages/scripts/build-android.cjs @@ -5,7 +5,7 @@ const root = path.join(__dirname, '..', '..'); const androidDir = path.join(root, 'packages', 'android'); const gradle = process.platform === 'win32' ? 'gradlew.bat' : './gradlew'; -const result = spawnSync(gradle, ['assembleRelease'], { +const result = spawnSync(gradle, [':app:assembleRelease'], { cwd: androidDir, stdio: 'inherit', shell: process.platform === 'win32', diff --git a/frontend/packages/scripts/collect-android-artifacts.cjs b/frontend/packages/scripts/collect-android-artifacts.cjs index d823266e..40aa4432 100644 --- a/frontend/packages/scripts/collect-android-artifacts.cjs +++ b/frontend/packages/scripts/collect-android-artifacts.cjs @@ -3,19 +3,24 @@ const path = require('path'); const root = path.join(__dirname, '..', '..'); const packageJson = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')); -const apkDir = path.join(root, 'packages', 'android', 'app', 'build', 'outputs', 'apk', 'release'); +const outputsDir = path.join(root, 'packages', 'android', 'app', 'build', 'outputs'); const releaseDir = path.join(root, 'packages', 'release'); -if (!fs.existsSync(apkDir)) { - throw new Error(`Android APK output directory not found: ${apkDir}`); +if (!fs.existsSync(outputsDir)) { + throw new Error(`Android output directory not found: ${outputsDir}`); } -const apks = fs.readdirSync(apkDir) - .filter((entry) => entry.endsWith('.apk')) - .map((entry) => path.join(apkDir, entry)); +const outputFiles = listFiles(outputsDir); +const apks = outputFiles.filter((file) => { + const normalized = file.replace(/\\/g, '/').toLowerCase(); + return normalized.endsWith('.apk') && normalized.includes('/release/'); +}); if (apks.length === 0) { - throw new Error(`No Android APK files found in ${apkDir}`); + const found = outputFiles + .map((file) => path.relative(root, file)) + .join('\n '); + throw new Error(`No Android release APK files found under ${outputsDir}.${found ? ` Found:\n ${found}` : ''}`); } fs.mkdirSync(releaseDir, { recursive: true }); @@ -26,3 +31,18 @@ for (const apk of apks) { fs.copyFileSync(apk, target); console.log(`Copied ${path.relative(root, apk)} -> ${path.relative(root, target)}`); } + +function listFiles(dir) { + const files = []; + + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + files.push(...listFiles(fullPath)); + } else if (entry.isFile()) { + files.push(fullPath); + } + } + + return files; +} From addbc9ffeb73e4533a31fadf7d045397b2bda4f6 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 19:14:29 -0300 Subject: [PATCH 21/90] debug android build --- .github/workflows/publish-apps.yml | 5 +++++ frontend/packages/scripts/build-android.cjs | 18 +++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index c1c17280..aad2b889 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -115,6 +115,11 @@ jobs: working-directory: frontend run: npm run android:dist + - name: List Android release artifacts + if: always() + working-directory: frontend + run: find packages/android/app/build -maxdepth 6 -type f | sort || true + - name: Upload Android artifact uses: actions/upload-artifact@v4 with: diff --git a/frontend/packages/scripts/build-android.cjs b/frontend/packages/scripts/build-android.cjs index b4cb8115..c11f9da9 100644 --- a/frontend/packages/scripts/build-android.cjs +++ b/frontend/packages/scripts/build-android.cjs @@ -3,12 +3,24 @@ const path = require('path'); const root = path.join(__dirname, '..', '..'); const androidDir = path.join(root, 'packages', 'android'); -const gradle = process.platform === 'win32' ? 'gradlew.bat' : './gradlew'; +const gradle = process.platform === 'win32' ? 'gradlew.bat' : 'sh'; +const args = process.platform === 'win32' + ? [':app:assembleRelease'] + : ['gradlew', ':app:assembleRelease']; -const result = spawnSync(gradle, [':app:assembleRelease'], { +const result = spawnSync(gradle, args, { cwd: androidDir, stdio: 'inherit', shell: process.platform === 'win32', }); -process.exit(result.status || 0); +if (result.error) { + console.error(result.error); + process.exit(1); +} + +if (typeof result.status === 'number') { + process.exit(result.status); +} + +process.exit(1); From 97d52adf9ad53d92ca6fe197469dda4ed63e7f62 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 21:06:15 -0300 Subject: [PATCH 22/90] removed system tray from mac and linux --- frontend/packages/electron/main.cjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index e8b100db..c7dba648 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -131,6 +131,7 @@ function setupMenu() { } function setupTray() { + if (process.platform !== 'win32') return; if (tray) return; tray = new Tray(getIconPath()); @@ -224,6 +225,7 @@ function createWindow() { }); mainWindow.on('close', (event) => { + if (process.platform !== 'win32') return; if (isQuitting) return; event.preventDefault(); @@ -269,7 +271,7 @@ app.whenReady().then(() => { }); app.on('window-all-closed', () => { - if (isQuitting) app.quit(); + if (process.platform !== 'darwin' || isQuitting) app.quit(); }); app.on('before-quit', () => { From bed8e22285e27487b6e1a5375fbaebcb6d9ded4b Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 21:07:58 -0300 Subject: [PATCH 23/90] forward notification toast to system --- frontend/src/hooks/useWebSocket.js | 8 +------- frontend/src/store/index.js | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/frontend/src/hooks/useWebSocket.js b/frontend/src/hooks/useWebSocket.js index 1eff5bbd..5190c22a 100644 --- a/frontend/src/hooks/useWebSocket.js +++ b/frontend/src/hooks/useWebSocket.js @@ -117,7 +117,7 @@ export function useWebSocket() { // In-app notifications and sounds are inbox-only — non-inbox folder syncs // (Archive, Spam, on-demand syncs) should not trigger alerts for old mail. - if (isInbox && document.visibilityState === 'visible') { + if (isInbox) { addNotification({ type: 'new_mail', accountId, @@ -129,12 +129,6 @@ export function useWebSocket() { playNotificationSound(notificationSound, customSoundDataUrl); } - if (isInbox && document.visibilityState !== 'visible' && window.mailflowNative?.notify) { - window.mailflowNative.notify({ title, body }).catch(() => {}); - const { notificationSound, customSoundDataUrl } = useStore.getState(); - playNotificationSound(notificationSound, customSoundDataUrl); - } - // Refresh the message list when the affected folder is visible const store = useStore.getState(); const isRelevant = diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index 87c2d707..adb147d4 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -18,6 +18,15 @@ function schedulePrefSave(prefs) { }, 1000); } +function forwardNativeNotification(notification) { + if (!window.mailflowNative?.notify) return; + + const title = String(notification.title || 'MailFlow').slice(0, 120); + const body = notification.body == null ? '' : String(notification.body).slice(0, 500); + + window.mailflowNative.notify({ title, body }).catch(() => {}); +} + export const useStore = create((set, get) => ({ // Auth user: null, @@ -190,9 +199,12 @@ export const useStore = create((set, get) => ({ // Notifications notifications: [], - addNotification: (n) => set(state => ({ - notifications: [{ ...n, id: crypto.randomUUID() }, ...state.notifications].slice(0, 5) - })), + addNotification: (n) => { + forwardNativeNotification(n); + set(state => ({ + notifications: [{ ...n, id: crypto.randomUUID() }, ...state.notifications].slice(0, 5) + })); + }, removeNotification: (id) => set(state => ({ notifications: state.notifications.filter(n => n.id !== id) })), From 85ea06c5c40c14e177ec75b5e330e085726ff8fe Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 21:14:50 -0300 Subject: [PATCH 24/90] ensuring unreadoverlay doesn't disappear --- frontend/packages/electron/main.cjs | 33 +++++++++++++++++++++++++- frontend/packages/electron/preload.cjs | 1 + frontend/src/components/MailApp.jsx | 3 ++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index c7dba648..6d743ad0 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -1,4 +1,4 @@ -const { app, BrowserWindow, Menu, Notification, Tray, ipcMain, session, shell } = require('electron'); +const { app, BrowserWindow, Menu, Notification, Tray, ipcMain, nativeImage, session, shell } = require('electron'); const fs = require('fs'); const path = require('path'); @@ -7,6 +7,7 @@ const CONFIG_FILE = 'mailflow-host.json'; let mainWindow; let tray; let isQuitting = false; +let unreadCount = 0; app.setName('MailFlow'); if (process.platform === 'win32') { @@ -64,6 +65,7 @@ function showMainWindow() { if (mainWindow.isMinimized()) mainWindow.restore(); mainWindow.show(); + applyUnreadOverlay(); mainWindow.focus(); } @@ -203,6 +205,31 @@ function showNativeNotification(payload = {}) { return true; } +function createUnreadOverlay(count) { + const label = count > 99 ? '99+' : String(count); + const fontSize = label.length > 2 ? 14 : label.length > 1 ? 17 : 21; + const svg = `${label}`; + return nativeImage.createFromDataURL(`data:image/svg+xml;base64,${Buffer.from(svg).toString('base64')}`); +} + +function applyUnreadOverlay() { + if (process.platform !== 'win32') return; + if (!mainWindow || mainWindow.isDestroyed()) return; + + if (unreadCount > 0) { + mainWindow.setOverlayIcon(createUnreadOverlay(unreadCount), `${unreadCount} unread message${unreadCount === 1 ? '' : 's'}`); + } else { + mainWindow.setOverlayIcon(null, ''); + } +} + +function setUnreadCount(count) { + const parsed = Number(count); + unreadCount = Number.isFinite(parsed) ? Math.max(0, Math.floor(parsed)) : 0; + applyUnreadOverlay(); + return unreadCount; +} + function createWindow() { mainWindow = new BrowserWindow({ width: 1280, @@ -232,6 +259,8 @@ function createWindow() { mainWindow.hide(); }); + mainWindow.on('show', applyUnreadOverlay); + const host = readHost(); if (host) { mainWindow.loadURL(host); @@ -259,6 +288,8 @@ ipcMain.handle('mailflow:resetHost', () => { ipcMain.handle('mailflow:notify', (_event, payload) => showNativeNotification(payload)); +ipcMain.handle('mailflow:setUnreadCount', (_event, count) => setUnreadCount(count)); + app.whenReady().then(() => { setupPermissions(); setupMenu(); diff --git a/frontend/packages/electron/preload.cjs b/frontend/packages/electron/preload.cjs index 298fb433..b6940551 100644 --- a/frontend/packages/electron/preload.cjs +++ b/frontend/packages/electron/preload.cjs @@ -5,4 +5,5 @@ contextBridge.exposeInMainWorld('mailflowNative', { saveHost: (host) => ipcRenderer.invoke('mailflow:saveHost', host), resetHost: () => ipcRenderer.invoke('mailflow:resetHost'), notify: (payload) => ipcRenderer.invoke('mailflow:notify', payload), + setUnreadCount: (count) => ipcRenderer.invoke('mailflow:setUnreadCount', count), }); diff --git a/frontend/src/components/MailApp.jsx b/frontend/src/components/MailApp.jsx index 87867990..ccff4bfd 100644 --- a/frontend/src/components/MailApp.jsx +++ b/frontend/src/components/MailApp.jsx @@ -142,7 +142,7 @@ export default function MailApp() { return () => clearInterval(interval); }, []); - // Update browser tab title, favicon badge, and PWA home screen badge with unread count + // Update browser tab title, favicon badge, PWA home screen badge, and native app badge with unread count useEffect(() => { const total = unreadCounts.total; const tabCount = selectedAccountId @@ -156,6 +156,7 @@ export default function MailApp() { if (showAppBadge && total > 0) navigator.setAppBadge(total).catch(() => {}); else navigator.clearAppBadge().catch(() => {}); } + window.mailflowNative?.setUnreadCount?.(total).catch(() => {}); }, [unreadCounts, selectedAccountId, showAppBadge, showFaviconBadge]); // ── Global keyboard shortcut listener ────────────────────────────────────── From fbff2339a08c627832dbd5091156fbfef6000442 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 21:38:00 -0300 Subject: [PATCH 25/90] remove tray --- frontend/packages/electron/main.cjs | 36 +---------------------------- 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 6d743ad0..412ae878 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -1,11 +1,10 @@ -const { app, BrowserWindow, Menu, Notification, Tray, ipcMain, nativeImage, session, shell } = require('electron'); +const { app, BrowserWindow, Menu, Notification, ipcMain, nativeImage, session, shell } = require('electron'); const fs = require('fs'); const path = require('path'); const CONFIG_FILE = 'mailflow-host.json'; let mainWindow; -let tray; let isQuitting = false; let unreadCount = 0; @@ -132,30 +131,6 @@ function setupMenu() { Menu.setApplicationMenu(Menu.buildFromTemplate(template)); } -function setupTray() { - if (process.platform !== 'win32') return; - if (tray) return; - - tray = new Tray(getIconPath()); - tray.setToolTip('MailFlow'); - tray.setContextMenu(Menu.buildFromTemplate([ - { label: 'Show MailFlow', click: showMainWindow }, - { - label: 'Change MailFlow Host', - click: () => { - clearHost(); - showMainWindow(); - loadSetup(); - }, - }, - { type: 'separator' }, - { label: 'Quit MailFlow', click: quitApp }, - ])); - - tray.on('click', showMainWindow); - tray.on('double-click', showMainWindow); -} - function isConfiguredHostUrl(url) { const host = readHost(); if (!host) return false; @@ -251,14 +226,6 @@ function createWindow() { return { action: 'deny' }; }); - mainWindow.on('close', (event) => { - if (process.platform !== 'win32') return; - if (isQuitting) return; - - event.preventDefault(); - mainWindow.hide(); - }); - mainWindow.on('show', applyUnreadOverlay); const host = readHost(); @@ -293,7 +260,6 @@ ipcMain.handle('mailflow:setUnreadCount', (_event, count) => setUnreadCount(coun app.whenReady().then(() => { setupPermissions(); setupMenu(); - setupTray(); createWindow(); app.on('activate', () => { From 15f84da30392c5e344ce67c68fb808a93e6c7426 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Mon, 18 May 2026 22:15:55 -0300 Subject: [PATCH 26/90] revert changes --- .github/workflows/publish-apps.yml | 6 -- frontend/packages/electron/main.cjs | 102 +------------------------ frontend/packages/electron/preload.cjs | 2 - frontend/src/components/MailApp.jsx | 2 +- frontend/src/hooks/useWebSocket.js | 11 +-- frontend/src/store/index.js | 18 +---- 6 files changed, 12 insertions(+), 129 deletions(-) diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index aad2b889..6df6121a 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -39,12 +39,6 @@ jobs: working-directory: frontend run: npm run app:version -- "${{ github.ref_name }}" "${{ github.run_number }}" - - name: Install Linux packaging tools - if: matrix.os == 'ubuntu-latest' - run: | - sudo apt-get update - sudo apt-get install -y rpm - - name: Build Electron package if: matrix.os != 'ubuntu-latest' working-directory: frontend diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 412ae878..81e6d89c 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -1,12 +1,10 @@ -const { app, BrowserWindow, Menu, Notification, ipcMain, nativeImage, session, shell } = require('electron'); +const { app, BrowserWindow, Menu, Notification, ipcMain, session, shell } = require('electron'); const fs = require('fs'); const path = require('path'); const CONFIG_FILE = 'mailflow-host.json'; let mainWindow; -let isQuitting = false; -let unreadCount = 0; app.setName('MailFlow'); if (process.platform === 'win32') { @@ -56,23 +54,6 @@ function clearHost() { } catch {} } -function showMainWindow() { - if (!mainWindow) { - createWindow(); - return; - } - - if (mainWindow.isMinimized()) mainWindow.restore(); - mainWindow.show(); - applyUnreadOverlay(); - mainWindow.focus(); -} - -function quitApp() { - isQuitting = true; - app.quit(); -} - function normalizeHost(value) { const input = String(value || '').trim(); const url = new URL(input); @@ -100,7 +81,6 @@ function setupMenu() { label: 'Change MailFlow Host', click: () => { clearHost(); - showMainWindow(); loadSetup(); }, }, @@ -108,7 +88,7 @@ function setupMenu() { { role: 'reload' }, { role: 'toggleDevTools' }, { type: 'separator' }, - { label: 'Quit MailFlow', click: quitApp }, + { role: 'quit' }, ], }, { @@ -142,69 +122,6 @@ function isConfiguredHostUrl(url) { } } -function setupPermissions() { - session.defaultSession.setPermissionRequestHandler((webContents, permission, callback, details = {}) => { - if (permission === 'notifications' && isConfiguredHostUrl(details.requestingUrl || webContents.getURL())) { - callback(true); - return; - } - - callback(false); - }); - - session.defaultSession.setPermissionCheckHandler((webContents, permission, requestingOrigin) => { - return permission === 'notifications' && isConfiguredHostUrl(requestingOrigin || webContents.getURL()); - }); -} - -function showNativeNotification(payload = {}) { - if (!Notification.isSupported()) return false; - - const title = String(payload.title || 'MailFlow').slice(0, 120); - const body = String(payload.body || 'New message').slice(0, 500); - const notification = new Notification({ - title, - body, - icon: getIconPath(), - silent: false, - }); - - notification.on('click', () => { - if (!mainWindow) return; - if (mainWindow.isMinimized()) mainWindow.restore(); - mainWindow.show(); - mainWindow.focus(); - }); - - notification.show(); - return true; -} - -function createUnreadOverlay(count) { - const label = count > 99 ? '99+' : String(count); - const fontSize = label.length > 2 ? 14 : label.length > 1 ? 17 : 21; - const svg = `${label}`; - return nativeImage.createFromDataURL(`data:image/svg+xml;base64,${Buffer.from(svg).toString('base64')}`); -} - -function applyUnreadOverlay() { - if (process.platform !== 'win32') return; - if (!mainWindow || mainWindow.isDestroyed()) return; - - if (unreadCount > 0) { - mainWindow.setOverlayIcon(createUnreadOverlay(unreadCount), `${unreadCount} unread message${unreadCount === 1 ? '' : 's'}`); - } else { - mainWindow.setOverlayIcon(null, ''); - } -} - -function setUnreadCount(count) { - const parsed = Number(count); - unreadCount = Number.isFinite(parsed) ? Math.max(0, Math.floor(parsed)) : 0; - applyUnreadOverlay(); - return unreadCount; -} - function createWindow() { mainWindow = new BrowserWindow({ width: 1280, @@ -226,8 +143,6 @@ function createWindow() { return { action: 'deny' }; }); - mainWindow.on('show', applyUnreadOverlay); - const host = readHost(); if (host) { mainWindow.loadURL(host); @@ -253,24 +168,15 @@ ipcMain.handle('mailflow:resetHost', () => { loadSetup(); }); -ipcMain.handle('mailflow:notify', (_event, payload) => showNativeNotification(payload)); - -ipcMain.handle('mailflow:setUnreadCount', (_event, count) => setUnreadCount(count)); - app.whenReady().then(() => { - setupPermissions(); setupMenu(); createWindow(); app.on('activate', () => { - showMainWindow(); + if (BrowserWindow.getAllWindows().length === 0) createWindow(); }); }); app.on('window-all-closed', () => { - if (process.platform !== 'darwin' || isQuitting) app.quit(); -}); - -app.on('before-quit', () => { - isQuitting = true; + if (process.platform !== 'darwin') app.quit(); }); diff --git a/frontend/packages/electron/preload.cjs b/frontend/packages/electron/preload.cjs index b6940551..d0f822d3 100644 --- a/frontend/packages/electron/preload.cjs +++ b/frontend/packages/electron/preload.cjs @@ -4,6 +4,4 @@ contextBridge.exposeInMainWorld('mailflowNative', { getHost: () => ipcRenderer.invoke('mailflow:getHost'), saveHost: (host) => ipcRenderer.invoke('mailflow:saveHost', host), resetHost: () => ipcRenderer.invoke('mailflow:resetHost'), - notify: (payload) => ipcRenderer.invoke('mailflow:notify', payload), - setUnreadCount: (count) => ipcRenderer.invoke('mailflow:setUnreadCount', count), }); diff --git a/frontend/src/components/MailApp.jsx b/frontend/src/components/MailApp.jsx index ccff4bfd..7cd96359 100644 --- a/frontend/src/components/MailApp.jsx +++ b/frontend/src/components/MailApp.jsx @@ -142,7 +142,7 @@ export default function MailApp() { return () => clearInterval(interval); }, []); - // Update browser tab title, favicon badge, PWA home screen badge, and native app badge with unread count + // Update browser tab title, favicon badge, and PWA home screen badge with unread count useEffect(() => { const total = unreadCounts.total; const tabCount = selectedAccountId diff --git a/frontend/src/hooks/useWebSocket.js b/frontend/src/hooks/useWebSocket.js index 5190c22a..d3d415ed 100644 --- a/frontend/src/hooks/useWebSocket.js +++ b/frontend/src/hooks/useWebSocket.js @@ -111,18 +111,15 @@ export function useWebSocket() { const isInbox = !folder || folder === 'INBOX'; if (messages && messages.length > 0) { - const latest = messages[0]; - const title = latest.fromName || latest.fromEmail || t('notifications.newMessage'); - const body = latest.subject || t('common.noSubject'); - // In-app notifications and sounds are inbox-only — non-inbox folder syncs // (Archive, Spam, on-demand syncs) should not trigger alerts for old mail. - if (isInbox) { + if (isInbox && document.visibilityState === 'visible') { + const latest = messages[0]; addNotification({ type: 'new_mail', accountId, - title, - body, + title: latest.fromName || latest.fromEmail || t('notifications.newMessage'), + body: latest.subject || t('common.noSubject'), count, }); const { notificationSound, customSoundDataUrl } = useStore.getState(); diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index adb147d4..87c2d707 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -18,15 +18,6 @@ function schedulePrefSave(prefs) { }, 1000); } -function forwardNativeNotification(notification) { - if (!window.mailflowNative?.notify) return; - - const title = String(notification.title || 'MailFlow').slice(0, 120); - const body = notification.body == null ? '' : String(notification.body).slice(0, 500); - - window.mailflowNative.notify({ title, body }).catch(() => {}); -} - export const useStore = create((set, get) => ({ // Auth user: null, @@ -199,12 +190,9 @@ export const useStore = create((set, get) => ({ // Notifications notifications: [], - addNotification: (n) => { - forwardNativeNotification(n); - set(state => ({ - notifications: [{ ...n, id: crypto.randomUUID() }, ...state.notifications].slice(0, 5) - })); - }, + addNotification: (n) => set(state => ({ + notifications: [{ ...n, id: crypto.randomUUID() }, ...state.notifications].slice(0, 5) + })), removeNotification: (id) => set(state => ({ notifications: state.notifications.filter(n => n.id !== id) })), From 509f00bc3243d76745712e4beb9be300fcf331ce Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 11:12:46 -0300 Subject: [PATCH 27/90] electron wrapper update --- frontend/package.json | 16 + frontend/packages/electron/icons/32x32.png | Bin 0 -> 4163 bytes frontend/packages/electron/main.cjs | 638 ++++++++++++++++-- frontend/packages/electron/preload.cjs | 13 + .../scripts/prepare-electron-icons.cjs | 2 +- 5 files changed, 623 insertions(+), 46 deletions(-) create mode 100644 frontend/packages/electron/icons/32x32.png diff --git a/frontend/package.json b/frontend/package.json index 5444d30f..9a282366 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,5 +1,6 @@ { "name": "mailflow-frontend", + "productName": "MailFlow", "version": "1.4.0", "description": "A self-hosted, unified webmail client.", "homepage": "https://mailflow.sh", @@ -9,6 +10,21 @@ }, "type": "module", "main": "packages/electron/main.cjs", + "repository": { + "type": "git", + "url": "git+https://github.com/maathimself/mailflow.git" + }, + "keywords": [ + "Email", + "Webmail", + "Email Client", + "Unified Inbox", + "GUI" + ], + "license": "GPL-3.0", + "bugs": { + "url": "https://github.com/maathimself/mailflow/issues" + }, "scripts": { "dev": "vite", "build": "vite build", diff --git a/frontend/packages/electron/icons/32x32.png b/frontend/packages/electron/icons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..9675e735b1ffdedf8cdf2c8788fb3ad252e5ec9c GIT binary patch literal 4163 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 N002ovPDHLkV1h|C_Ot*1 literal 0 HcmV?d00001 diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 81e6d89c..0e18dbf2 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -1,10 +1,19 @@ -const { app, BrowserWindow, Menu, Notification, ipcMain, session, shell } = require('electron'); +const { app, BrowserWindow, Menu, Tray, nativeImage, ipcMain, shell, dialog } = require('electron'); const fs = require('fs'); +const https = require('https'); const path = require('path'); const CONFIG_FILE = 'mailflow-host.json'; +const UPDATE_STATUS_CHANNEL = 'mailflow:updates:status'; +const UPDATE_RELEASE_URL = 'https://api.github.com/repos/maathimself/mailflow/releases/latest'; +const UPDATE_ERROR_MESSAGE = 'Could not check for MailFlow updates. Please visit the website instead.'; let mainWindow; +let tray = null; +let isQuitting = false; +let updateInfo = null; +let downloadedUpdate = null; +let updateDownloadsInitialized = false; app.setName('MailFlow'); if (process.platform === 'win32') { @@ -32,9 +41,22 @@ function getConfigPath() { return path.join(app.getPath('userData'), CONFIG_FILE); } +function readConfig() { + try { + return JSON.parse(fs.readFileSync(getConfigPath(), 'utf8')); + } catch { + return {}; + } +} + +function writeConfig(config) { + fs.mkdirSync(app.getPath('userData'), { recursive: true }); + fs.writeFileSync(getConfigPath(), JSON.stringify(config, null, 2)); +} + function readHost() { try { - const config = JSON.parse(fs.readFileSync(getConfigPath(), 'utf8')); + const config = readConfig(); return normalizeHost(config.host); } catch { return null; @@ -43,15 +65,14 @@ function readHost() { function writeHost(host) { const normalized = normalizeHost(host); - fs.mkdirSync(app.getPath('userData'), { recursive: true }); - fs.writeFileSync(getConfigPath(), JSON.stringify({ host: normalized }, null, 2)); + writeConfig({ ...readConfig(), host: normalized }); return normalized; } function clearHost() { - try { - fs.rmSync(getConfigPath(), { force: true }); - } catch {} + const config = readConfig(); + delete config.host; + writeConfig(config); } function normalizeHost(value) { @@ -71,78 +92,574 @@ function normalizeHost(value) { return url.toString().replace(/\/$/, ''); } -function setupMenu() { - const template = [ - ...(process.platform === 'darwin' ? [{ role: 'appMenu' }] : []), +function requestJson(url) { + return new Promise((resolve, reject) => { + const request = https.get(url, { + headers: { + Accept: 'application/vnd.github+json', + 'User-Agent': `MailFlow/${app.getVersion()}`, + }, + }, (response) => { + if (response.statusCode >= 300 && response.statusCode < 400 && response.headers.location) { + response.resume(); + requestJson(response.headers.location).then(resolve, reject); + return; + } + + let body = ''; + response.setEncoding('utf8'); + response.on('data', (chunk) => { + body += chunk; + }); + response.on('end', () => { + if (response.statusCode < 200 || response.statusCode >= 300) { + reject(new Error(`Update request failed with status ${response.statusCode}`)); + return; + } + + try { + resolve(JSON.parse(body)); + } catch (error) { + reject(error); + } + }); + }); + + request.on('error', reject); + request.setTimeout(15000, () => { + request.destroy(new Error('Update request timed out')); + }); + }); +} + +function parseVersion(value) { + const match = String(value || '').match(/\d+(?:\.\d+){0,2}/); + if (!match) return null; + return match[0].split('.').map((part) => Number.parseInt(part, 10)); +} + +function isNewerVersion(candidate, current) { + const next = parseVersion(candidate); + const installed = parseVersion(current); + if (!next || !installed) return false; + + for (let index = 0; index < 3; index += 1) { + const nextPart = next[index] || 0; + const installedPart = installed[index] || 0; + if (nextPart > installedPart) return true; + if (nextPart < installedPart) return false; + } + + return false; +} + +function getUpdateAsset(release) { + const assets = Array.isArray(release.assets) ? release.assets : []; + const platformAssetPatterns = { + win32: [/setup.*\.exe$/i, /\.exe$/i], + darwin: [/\.dmg$/i], + linux: [/\.appimage$/i, /\.deb$/i, /\.rpm$/i], + }; + const patterns = platformAssetPatterns[process.platform] || []; + + for (const pattern of patterns) { + const asset = assets.find((item) => pattern.test(item.name || '') && item.browser_download_url); + if (asset) return asset; + } + + return null; +} + +function sendUpdateStatus(payload) { + if (!mainWindow || mainWindow.isDestroyed()) return; + mainWindow.webContents.send(UPDATE_STATUS_CHANNEL, payload); +} + +function notifyUpdateStatus({ title, message, type = 'info' }) { + if (!mainWindow || mainWindow.isDestroyed()) return; + mainWindow.webContents.send('mailflow:notifications:push', { title, message, type }); +} + +function notifyCheckingUpdate(verbose) { + if (!verbose) return; + + sendUpdateStatus({ type: 'checking' }); + notifyUpdateStatus({ + title: 'Checking for update', + message: 'Checking for new MailFlow updates.', + }); +} + +function notifyUpdateError(message = UPDATE_ERROR_MESSAGE) { + sendUpdateStatus({ type: 'error', message }); + notifyUpdateStatus({ + title: 'Update Error', + message, + type: 'negative', + }); +} + +function notifyUpToDate(verbose) { + if (!verbose) return; + + sendUpdateStatus({ type: 'up-to-date' }); + notifyUpdateStatus({ + title: 'Up to date', + message: 'Your version of MailFlow is up to date.', + type: 'positive', + }); +} + +function notifyUpdateAvailable() { + sendUpdateStatus({ + type: 'available', + data: { + releaseNotes: updateInfo.releaseNotes, + releaseName: updateInfo.releaseName, + releaseDate: updateInfo.releaseDate, + updateUrl: updateInfo.updateUrl, + manual: true, + }, + }); + notifyUpdateStatus({ + title: 'Update Available', + message: 'MailFlow is downloading the newest version for you.', + }); +} + +function filePostfix() { + const date = new Date(); + return `${date.getMonth() + 1}.${date.getDate()}-${date.getHours()}.${date.getMinutes()}.${date.getSeconds()}`; +} + +function getUniqueFilename(filename) { + const extension = path.extname(filename); + const file = path.basename(filename, extension); + return `${file} (${filePostfix()})${extension}`; +} + +function initializeUpdateDownloads(window) { + if (updateDownloadsInitialized) return; + updateDownloadsInitialized = true; + + window.webContents.session.on('will-download', (_event, item) => { + const totalBytes = item.getTotalBytes(); + const filePath = path.join(app.getPath('downloads'), getUniqueFilename(item.getFilename())); + + item.setSavePath(filePath); + + item.on('updated', () => { + if (totalBytes > 0) { + window.setProgressBar(item.getReceivedBytes() / totalBytes); + } + }); + + item.on('done', (_event, state) => { + if (!window.isDestroyed()) window.setProgressBar(-1); + + if (state === 'interrupted') { + dialog.showErrorBox('Download error', `The download of ${item.getFilename()} was interrupted.`); + } + + if (state === 'completed') { + downloadedUpdate = item.getSavePath(); + sendUpdateStatus({ + type: 'downloaded', + data: { + releaseNotes: updateInfo && updateInfo.releaseNotes, + releaseName: updateInfo && updateInfo.releaseName, + releaseDate: updateInfo && updateInfo.releaseDate, + updateUrl: updateInfo && updateInfo.updateUrl, + filePath: downloadedUpdate, + manual: true, + }, + }); + } + }); + }); +} + +function downloadUpdate(url) { + if (!mainWindow || mainWindow.isDestroyed()) return; + mainWindow.webContents.downloadURL(url); +} + +async function checkForUpdates(verbose = false) { + notifyCheckingUpdate(verbose); + + try { + const release = await requestJson(UPDATE_RELEASE_URL); + const releaseVersion = release.tag_name || release.name; + const asset = getUpdateAsset(release); + + if (!isNewerVersion(releaseVersion, app.getVersion())) { + notifyUpToDate(verbose); + return { updateAvailable: false }; + } + + if (!asset) { + notifyUpdateError('A MailFlow update is available, but no installer was found for this platform.'); + return { updateAvailable: true, downloadAvailable: false }; + } + + updateInfo = { + releaseNotes: release.body || '', + releaseName: release.name || release.tag_name, + releaseDate: release.published_at, + updateUrl: asset.browser_download_url, + }; + + notifyUpdateAvailable(); + downloadUpdate(asset.browser_download_url); + return { updateAvailable: true, downloadAvailable: true }; + } catch (error) { + console.error('Update check failed:', error); + notifyUpdateError(); + return { updateAvailable: false, error: error.message }; + } +} + +function installDownloadedUpdate() { + if (!downloadedUpdate) return; + + fs.access(downloadedUpdate, fs.constants.F_OK, (error) => { + if (error) { + shell.showItemInFolder(downloadedUpdate); + return; + } + + shell.openPath(downloadedUpdate); + app.quit(); + }); +} + +function openDownloadedUpdatePath() { + if (!downloadedUpdate) return; + shell.showItemInFolder(downloadedUpdate); +} + +function changeMailFlowHost() { + clearHost(); + showMainWindow(); + loadSetup(); +} + +function fileMenuItems() { + return [ { - label: 'MailFlow', + label: 'Change MailFlow Host', + accelerator: 'CmdOrCtrl+,', + click: changeMailFlowHost, + }, + ]; +} + +function editMenuItems() { + return [ + { label: 'Undo', accelerator: 'CmdOrCtrl+Z', role: 'undo' }, + { label: 'Redo', accelerator: 'Shift+CmdOrCtrl+Z', role: 'redo' }, + { type: 'separator' }, + { label: 'Cut', accelerator: 'CmdOrCtrl+X', role: 'cut' }, + { label: 'Copy', accelerator: 'CmdOrCtrl+C', role: 'copy' }, + { label: 'Paste', accelerator: 'CmdOrCtrl+V', role: 'paste' }, + { label: 'Paste and Match Style', accelerator: 'Shift+CmdOrCtrl+V', role: 'pasteAndMatchStyle' }, + { label: 'Delete', role: 'delete' }, + { type: 'separator' }, + { label: 'Select All', accelerator: 'CmdOrCtrl+A', role: 'selectAll' }, + ]; +} + +function viewMenuItems() { + return [ + { + label: 'Reload', + accelerator: 'CmdOrCtrl+R', + click(_item, focusedWindow) { + if (focusedWindow) focusedWindow.reload(); + }, + }, + { + label: 'Toggle Full Screen', + accelerator: process.platform === 'darwin' ? 'Ctrl+Command+F' : 'F11', + click(_item, focusedWindow) { + if (!focusedWindow) return; + focusedWindow.setFullScreen(!focusedWindow.isFullScreen()); + }, + }, + { + label: 'Toggle Developer Tools', + accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', + click(_item, focusedWindow) { + if (focusedWindow) focusedWindow.webContents.toggleDevTools(); + }, + }, + ]; +} + +function windowMenuItems() { + if (process.platform === 'darwin') { + return [ + { label: 'Close', accelerator: 'CmdOrCtrl+W', role: 'close' }, + { label: 'Minimize', accelerator: 'CmdOrCtrl+M', role: 'minimize' }, + { label: 'Zoom', role: 'zoom' }, + { type: 'separator' }, + { label: 'Bring All to Front', role: 'front' }, + ]; + } + + return [ + { label: 'Minimize', accelerator: 'CmdOrCtrl+M', role: 'minimize' }, + { label: 'Close', accelerator: 'CmdOrCtrl+W', role: 'close' }, + ]; +} + +function helpMenuItems() { + return [ + { + label: 'Learn More', + click: () => shell.openExternal('https://mailflow.sh'), + }, + { + label: 'Check For Updates', + click: () => checkForUpdates(true), + }, + ]; +} + +function buildDarwinMenuTemplate() { + const name = app.name; + + return [ + { + label: name, submenu: [ + { label: `About ${name}`, role: 'about' }, + { type: 'separator' }, { - label: 'Change MailFlow Host', - click: () => { - clearHost(); - loadSetup(); - }, + label: 'Preferences', + accelerator: 'Command+,', + click: changeMailFlowHost, }, + { label: 'Services', role: 'services', submenu: [] }, { type: 'separator' }, - { role: 'reload' }, - { role: 'toggleDevTools' }, + { label: `Hide ${name}`, accelerator: 'Command+H', role: 'hide' }, + { label: 'Hide Others', accelerator: 'Command+Alt+H', role: 'hideOthers' }, + { label: 'Show All', role: 'unhide' }, { type: 'separator' }, - { role: 'quit' }, + { label: `Quit ${name}`, accelerator: 'Command+Q', role: 'quit' }, ], }, + { + label: 'File', + id: 'file', + submenu: fileMenuItems(), + }, { label: 'Edit', + submenu: editMenuItems(), + }, + { + label: 'View', + submenu: viewMenuItems(), + }, + { + label: 'Window', + role: 'window', + submenu: windowMenuItems(), + }, + { + label: 'Help', + role: 'help', + submenu: helpMenuItems(), + }, + ]; +} + +function buildDefaultMenuTemplate() { + return [ + { + label: 'File', + id: 'file', submenu: [ - { role: 'undo' }, - { role: 'redo' }, + ...fileMenuItems(), { type: 'separator' }, - { role: 'cut' }, - { role: 'copy' }, - { role: 'paste' }, - { role: 'pasteAndMatchStyle' }, - { role: 'delete' }, - { type: 'separator' }, - { role: 'selectAll' }, + { label: 'Exit', role: 'quit' }, ], }, + { + label: 'Edit', + submenu: editMenuItems(), + }, + { + label: 'View', + submenu: viewMenuItems(), + }, + { + label: 'Window', + role: 'window', + submenu: windowMenuItems(), + }, + { + label: 'Help', + role: 'help', + submenu: helpMenuItems(), + }, ]; +} + +function setupMenu() { + const template = process.platform === 'darwin' + ? buildDarwinMenuTemplate() + : buildDefaultMenuTemplate(); Menu.setApplicationMenu(Menu.buildFromTemplate(template)); } -function isConfiguredHostUrl(url) { - const host = readHost(); - if (!host) return false; +function getDefaultWindowBounds() { + return { + width: 1280, + height: 860, + minWidth: 900, + minHeight: 620, + }; +} - try { - return new URL(url).origin === new URL(host).origin; - } catch { - return false; +function getSavedWindowBounds() { + const bounds = readConfig().windowBounds; + if (!bounds || typeof bounds !== 'object') return {}; + + const numericBounds = {}; + for (const key of ['x', 'y', 'width', 'height']) { + if (Number.isFinite(bounds[key])) numericBounds[key] = bounds[key]; } + + return numericBounds; +} + +function saveWindowBounds() { + if (!mainWindow || mainWindow.isDestroyed()) return; + + writeConfig({ + ...readConfig(), + windowBounds: mainWindow.getBounds(), + }); +} + +function showMainWindow() { + if (!mainWindow || mainWindow.isDestroyed()) { + createWindow(); + return; + } + + if (mainWindow.isMinimized()) mainWindow.restore(); + if (!mainWindow.isVisible()) mainWindow.show(); + mainWindow.focus(); +} + +function getTrayIcon() { + const trayIconPath = process.platform === 'win32' + ? path.join(__dirname, 'icons', 'icon.ico') + : process.platform === 'darwin' + ? path.join(__dirname, 'icons', 'icon.icns') + : path.join(__dirname, 'icons', '96x96.png'); + + return nativeImage.createFromPath(trayIconPath); +} + +function refreshTrayMenu() { + if (!tray) return; + + const isWindowVisible = !!mainWindow && !mainWindow.isDestroyed() && mainWindow.isVisible(); + tray.setContextMenu(Menu.buildFromTemplate([ + { + label: isWindowVisible ? 'Hide MailFlow' : 'Show MailFlow', + click: () => { + if (isWindowVisible) { + saveWindowBounds(); + mainWindow.hide(); + } else { + showMainWindow(); + } + }, + }, + { type: 'separator' }, + { + label: 'Change MailFlow Host', + click: () => { + clearHost(); + showMainWindow(); + loadSetup(); + }, + }, + { type: 'separator' }, + { + label: 'Quit', + click: () => app.quit(), + }, + ])); +} + +function createTray() { + if (tray) return; + + const trayIcon = getTrayIcon(); + if (trayIcon.isEmpty()) return; + + tray = new Tray(trayIcon); + tray.setToolTip('MailFlow'); + tray.on('click', () => { + refreshTrayMenu(); + showMainWindow(); + }); + refreshTrayMenu(); } function createWindow() { mainWindow = new BrowserWindow({ - width: 1280, - height: 860, - minWidth: 900, - minHeight: 620, + ...getDefaultWindowBounds(), + ...getSavedWindowBounds(), + show: false, title: 'MailFlow', icon: getWindowIconPath(), webPreferences: { preload: path.join(__dirname, 'preload.cjs'), contextIsolation: true, nodeIntegration: false, - sandbox: false, + sandbox: true, }, }); + mainWindow.once('ready-to-show', () => { + if (!mainWindow || mainWindow.isDestroyed()) return; + mainWindow.show(); + }); + mainWindow.webContents.setWindowOpenHandler(({ url }) => { shell.openExternal(url); return { action: 'deny' }; }); + mainWindow.on('close', (event) => { + if (!isQuitting && tray) { + event.preventDefault(); + saveWindowBounds(); + mainWindow.hide(); + refreshTrayMenu(); + return; + } + + saveWindowBounds(); + }); + + mainWindow.on('show', refreshTrayMenu); + mainWindow.on('hide', refreshTrayMenu); + mainWindow.on('closed', () => { + mainWindow = null; + refreshTrayMenu(); + }); + + initializeUpdateDownloads(mainWindow); + const host = readHost(); if (host) { mainWindow.loadURL(host); @@ -168,13 +685,44 @@ ipcMain.handle('mailflow:resetHost', () => { loadSetup(); }); -app.whenReady().then(() => { - setupMenu(); - createWindow(); +ipcMain.handle('mailflow:updates:check', async (_event, { verbose } = {}) => { + return checkForUpdates(verbose); +}); - app.on('activate', () => { - if (BrowserWindow.getAllWindows().length === 0) createWindow(); +ipcMain.handle('mailflow:updates:install-downloaded', () => { + installDownloadedUpdate(); +}); + +ipcMain.handle('mailflow:updates:install-auto', () => { + installDownloadedUpdate(); +}); + +ipcMain.handle('mailflow:updates:open-download', () => { + openDownloadedUpdatePath(); +}); + +const gotSingleInstanceLock = app.requestSingleInstanceLock(); + +if (!gotSingleInstanceLock) { + app.quit(); +} else { + app.whenReady().then(() => { + setupMenu(); + createTray(); + createWindow(); + + app.on('activate', () => { + showMainWindow(); + }); + }); + + app.on('second-instance', () => { + showMainWindow(); }); +} + +app.on('before-quit', () => { + isQuitting = true; }); app.on('window-all-closed', () => { diff --git a/frontend/packages/electron/preload.cjs b/frontend/packages/electron/preload.cjs index d0f822d3..3189272a 100644 --- a/frontend/packages/electron/preload.cjs +++ b/frontend/packages/electron/preload.cjs @@ -1,7 +1,20 @@ const { contextBridge, ipcRenderer } = require('electron'); +function subscribe(channel, callback) { + const listener = (_event, payload) => callback(payload); + ipcRenderer.on(channel, listener); + return () => ipcRenderer.removeListener(channel, listener); +} + contextBridge.exposeInMainWorld('mailflowNative', { getHost: () => ipcRenderer.invoke('mailflow:getHost'), saveHost: (host) => ipcRenderer.invoke('mailflow:saveHost', host), resetHost: () => ipcRenderer.invoke('mailflow:resetHost'), + updates: { + check: (verbose) => ipcRenderer.invoke('mailflow:updates:check', { verbose }), + installDownloaded: () => ipcRenderer.invoke('mailflow:updates:install-downloaded'), + installAuto: () => ipcRenderer.invoke('mailflow:updates:install-auto'), + openDownload: () => ipcRenderer.invoke('mailflow:updates:open-download'), + onStatus: (callback) => subscribe('mailflow:updates:status', callback), + }, }); diff --git a/frontend/packages/scripts/prepare-electron-icons.cjs b/frontend/packages/scripts/prepare-electron-icons.cjs index b8004227..d79be0ef 100644 --- a/frontend/packages/scripts/prepare-electron-icons.cjs +++ b/frontend/packages/scripts/prepare-electron-icons.cjs @@ -6,7 +6,7 @@ const publicDir = path.join(rootDir, 'public'); const iconDir = path.join(rootDir, 'packages', 'electron', 'icons'); const pngBySize = new Map( - [72, 96, 128, 144, 152, 192, 384, 512] + [32, 72, 96, 128, 144, 152, 192, 384, 512] .map((size) => [size, path.join(publicDir, `icon-${size}.png`)]) .filter(([, file]) => fs.existsSync(file)) ); From 9402662013098cd45ace6dfcddab00a753d617a5 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 13:59:58 -0300 Subject: [PATCH 28/90] Menu update --- frontend/packages/electron/main.cjs | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 0e18dbf2..99223424 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -386,13 +386,6 @@ function viewMenuItems() { focusedWindow.setFullScreen(!focusedWindow.isFullScreen()); }, }, - { - label: 'Toggle Developer Tools', - accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', - click(_item, focusedWindow) { - if (focusedWindow) focusedWindow.webContents.toggleDevTools(); - }, - }, ]; } @@ -419,6 +412,16 @@ function helpMenuItems() { label: 'Learn More', click: () => shell.openExternal('https://mailflow.sh'), }, + { type: 'separator' }, + { + label: 'Help', + click: () => shell.openExternal('https://mailflow.sh/docs'), + }, + { + label: 'Report Issue', + click: () => shell.openExternal('https://github.com/maathimself/mailflow/issues'), + }, + { type: 'separator' }, { label: 'Check For Updates', click: () => checkForUpdates(true), @@ -545,15 +548,21 @@ function saveWindowBounds() { }); } -function showMainWindow() { +function showMainWindow({ reload = false } = {}) { if (!mainWindow || mainWindow.isDestroyed()) { createWindow(); return; } + const wasHidden = !mainWindow.isVisible(); + if (mainWindow.isMinimized()) mainWindow.restore(); if (!mainWindow.isVisible()) mainWindow.show(); mainWindow.focus(); + + if (reload && wasHidden) { + mainWindow.webContents.reload(); + } } function getTrayIcon() { @@ -578,7 +587,7 @@ function refreshTrayMenu() { saveWindowBounds(); mainWindow.hide(); } else { - showMainWindow(); + showMainWindow({ reload: true }); } }, }, @@ -609,7 +618,7 @@ function createTray() { tray.setToolTip('MailFlow'); tray.on('click', () => { refreshTrayMenu(); - showMainWindow(); + showMainWindow({ reload: true }); }); refreshTrayMenu(); } From 260db4bb96356386f262e12543df6292405926fe Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 14:00:13 -0300 Subject: [PATCH 29/90] Notification bridge --- frontend/packages/electron/preload.cjs | 3 +++ .../components/ElectronNotificationBridge.jsx | 22 +++++++++++++++++++ frontend/src/components/MailApp.jsx | 2 ++ 3 files changed, 27 insertions(+) create mode 100644 frontend/src/components/ElectronNotificationBridge.jsx diff --git a/frontend/packages/electron/preload.cjs b/frontend/packages/electron/preload.cjs index 3189272a..c720f370 100644 --- a/frontend/packages/electron/preload.cjs +++ b/frontend/packages/electron/preload.cjs @@ -17,4 +17,7 @@ contextBridge.exposeInMainWorld('mailflowNative', { openDownload: () => ipcRenderer.invoke('mailflow:updates:open-download'), onStatus: (callback) => subscribe('mailflow:updates:status', callback), }, + notifications: { + onPush: (callback) => subscribe('mailflow:notifications:push', callback), + }, }); diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx new file mode 100644 index 00000000..c7f4c3e6 --- /dev/null +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -0,0 +1,22 @@ +import { useEffect } from 'react'; +import { useStore } from '../store/index.js'; + +export default function ElectronNotificationBridge() { + const addNotification = useStore(state => state.addNotification); + + useEffect(() => { + const unsubscribe = window.mailflowNative?.notifications?.onPush?.((notification) => { + addNotification({ + type: notification.type === 'negative' ? 'error' : notification.type, + title: notification.title, + body: notification.body || notification.message, + }); + }); + + return () => { + if (typeof unsubscribe === 'function') unsubscribe(); + }; + }, [addNotification]); + + return null; +} diff --git a/frontend/src/components/MailApp.jsx b/frontend/src/components/MailApp.jsx index 7cd96359..a964275a 100644 --- a/frontend/src/components/MailApp.jsx +++ b/frontend/src/components/MailApp.jsx @@ -12,6 +12,7 @@ import Sidebar from './Sidebar.jsx'; import MessageList from './MessageList.jsx'; import MessagePane from './MessagePane.jsx'; import NotificationToasts from './NotificationToasts.jsx'; +import ElectronNotificationBridge from './ElectronNotificationBridge.jsx'; import CommandPalette from './CommandPalette.jsx'; const ComposeModal = lazy(() => import('./ComposeModal.jsx')); @@ -403,6 +404,7 @@ export default function MailApp() { {composing && } {showAdmin && } + setPaletteOpen(false)} /> From 54dc1ff622abf621e5077b4cdc5e1b10a72643f6 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 14:30:21 -0300 Subject: [PATCH 30/90] Notification forwarder --- frontend/packages/electron/main.cjs | 109 ++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 99223424..f021dadd 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -175,8 +175,117 @@ function sendUpdateStatus(payload) { mainWindow.webContents.send(UPDATE_STATUS_CHANNEL, payload); } +function showInAppNotification({ title = '', message = '', type = 'info' }) { + if (!mainWindow || mainWindow.isDestroyed()) return; + + const payload = JSON.stringify({ title, message, type }); + mainWindow.webContents.executeJavaScript(` + (() => { + const notification = ${payload}; + const id = 'mailflow-electron-toasts'; + let root = document.getElementById(id); + + if (!root) { + root = document.createElement('div'); + root.id = id; + root.style.position = 'fixed'; + root.style.right = '24px'; + root.style.bottom = '24px'; + root.style.zIndex = '2147483647'; + root.style.display = 'flex'; + root.style.flexDirection = 'column-reverse'; + root.style.gap = '8px'; + root.style.pointerEvents = 'none'; + document.documentElement.appendChild(root); + } + + const toast = document.createElement('div'); + toast.style.width = '340px'; + toast.style.maxWidth = 'calc(100vw - 48px)'; + toast.style.boxSizing = 'border-box'; + toast.style.display = 'flex'; + toast.style.alignItems = 'flex-start'; + toast.style.gap = '10px'; + toast.style.padding = '12px 14px'; + toast.style.borderRadius = '10px'; + toast.style.border = '1px solid rgba(255,255,255,0.10)'; + toast.style.background = 'rgba(36,36,41,0.98)'; + toast.style.boxShadow = '0 4px 20px rgba(0,0,0,0.45), 0 0 0 1px rgba(255,255,255,0.04)'; + toast.style.color = '#e8e8ed'; + toast.style.font = '13px Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif'; + toast.style.pointerEvents = 'all'; + toast.style.opacity = '0'; + toast.style.transform = 'translateX(100%)'; + toast.style.transition = 'opacity 180ms ease, transform 180ms ease'; + + const icon = document.createElement('div'); + icon.style.width = '32px'; + icon.style.height = '32px'; + icon.style.borderRadius = '8px'; + icon.style.flex = '0 0 auto'; + icon.style.display = 'grid'; + icon.style.placeItems = 'center'; + icon.style.background = notification.type === 'negative' || notification.type === 'error' + ? 'rgba(248,113,113,0.15)' + : 'rgba(124,106,247,0.28)'; + icon.style.color = notification.type === 'negative' || notification.type === 'error' ? '#f87171' : '#a99cff'; + icon.textContent = notification.type === 'positive' ? '✓' : notification.type === 'negative' || notification.type === 'error' ? '!' : 'i'; + + const copy = document.createElement('div'); + copy.style.flex = '1'; + copy.style.minWidth = '0'; + + const heading = document.createElement('div'); + heading.textContent = notification.title; + heading.style.fontWeight = '650'; + heading.style.marginBottom = '2px'; + heading.style.whiteSpace = 'nowrap'; + heading.style.overflow = 'hidden'; + heading.style.textOverflow = 'ellipsis'; + + const body = document.createElement('div'); + body.textContent = notification.message; + body.style.fontSize = '12px'; + body.style.color = '#9898a8'; + body.style.whiteSpace = 'nowrap'; + body.style.overflow = 'hidden'; + body.style.textOverflow = 'ellipsis'; + + const close = document.createElement('button'); + close.type = 'button'; + close.setAttribute('aria-label', 'Dismiss'); + close.textContent = '×'; + close.style.border = '0'; + close.style.background = 'transparent'; + close.style.color = '#9898a8'; + close.style.cursor = 'pointer'; + close.style.font = '20px/1 Inter, ui-sans-serif, system-ui'; + close.style.padding = '0'; + + const dismiss = () => { + toast.style.opacity = '0'; + toast.style.transform = 'translateX(100%)'; + window.setTimeout(() => toast.remove(), 190); + }; + + close.addEventListener('click', dismiss); + copy.append(heading, body); + toast.append(icon, copy, close); + root.appendChild(toast); + + window.requestAnimationFrame(() => { + toast.style.opacity = '1'; + toast.style.transform = 'translateX(0)'; + }); + + window.setTimeout(dismiss, 5000); + })(); + `).catch(() => {}); +} + function notifyUpdateStatus({ title, message, type = 'info' }) { if (!mainWindow || mainWindow.isDestroyed()) return; + showInAppNotification({ title, message, type }); mainWindow.webContents.send('mailflow:notifications:push', { title, message, type }); } From 000c2d0e9114a0f03893d8ab2e434b310e1d6fae Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 14:42:57 -0300 Subject: [PATCH 31/90] Update checker testing --- frontend/packages/electron/main.cjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index f021dadd..98f7d4a6 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -5,7 +5,7 @@ const path = require('path'); const CONFIG_FILE = 'mailflow-host.json'; const UPDATE_STATUS_CHANNEL = 'mailflow:updates:status'; -const UPDATE_RELEASE_URL = 'https://api.github.com/repos/maathimself/mailflow/releases/latest'; +const UPDATE_RELEASE_URL = 'https://api.github.com/repos/dcoffin88/mailflow/releases/latest'; const UPDATE_ERROR_MESSAGE = 'Could not check for MailFlow updates. Please visit the website instead.'; let mainWindow; From 8c38bd0d060c2f8f6802e0ed4d6b488f764ba3f6 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 14:50:27 -0300 Subject: [PATCH 32/90] Adding native quick actions --- frontend/packages/electron/main.cjs | 89 ++++++++++++++++++- frontend/packages/electron/preload.cjs | 3 + .../components/ElectronNotificationBridge.jsx | 33 +++++++ 3 files changed, 124 insertions(+), 1 deletion(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 98f7d4a6..8e495c07 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -7,6 +7,8 @@ const CONFIG_FILE = 'mailflow-host.json'; const UPDATE_STATUS_CHANNEL = 'mailflow:updates:status'; const UPDATE_RELEASE_URL = 'https://api.github.com/repos/dcoffin88/mailflow/releases/latest'; const UPDATE_ERROR_MESSAGE = 'Could not check for MailFlow updates. Please visit the website instead.'; +const NATIVE_ACTION_CHANNEL = 'mailflow:native-action'; +const NATIVE_ACTION_ARG = '--mailflow-action='; let mainWindow; let tray = null; @@ -447,6 +449,57 @@ function openDownloadedUpdatePath() { shell.showItemInFolder(downloadedUpdate); } +function parseNativeActionArg(args = []) { + const actionArg = args.find((arg) => String(arg).startsWith(NATIVE_ACTION_ARG)); + if (!actionArg) return null; + + const action = actionArg.slice(NATIVE_ACTION_ARG.length); + if (['new-mail', 'sync'].includes(action)) return action; + return null; +} + +function sendNativeAction(action) { + if (!action) return; + + showMainWindow(); + + const dispatchScript = ` + window.dispatchEvent(new CustomEvent('mailflow:native-action', { + detail: ${JSON.stringify({ action })} + })); + `; + + const send = () => { + if (!mainWindow || mainWindow.isDestroyed()) return; + mainWindow.webContents.send(NATIVE_ACTION_CHANNEL, { action }); + mainWindow.webContents.executeJavaScript(dispatchScript).catch(() => {}); + }; + + if (!mainWindow || mainWindow.isDestroyed()) return; + + if (mainWindow.webContents.isLoading()) { + mainWindow.webContents.once('did-finish-load', () => { + setTimeout(send, 100); + }); + return; + } + + setTimeout(send, 100); +} + +function nativeActionMenuItems() { + return [ + { + label: 'New Mail', + click: () => sendNativeAction('new-mail'), + }, + { + label: 'Sync', + click: () => sendNativeAction('sync'), + }, + ]; +} + function changeMailFlowHost() { clearHost(); showMainWindow(); @@ -689,6 +742,8 @@ function refreshTrayMenu() { const isWindowVisible = !!mainWindow && !mainWindow.isDestroyed() && mainWindow.isVisible(); tray.setContextMenu(Menu.buildFromTemplate([ + ...nativeActionMenuItems(), + { type: 'separator' }, { label: isWindowVisible ? 'Hide MailFlow' : 'Show MailFlow', click: () => { @@ -732,6 +787,34 @@ function createTray() { refreshTrayMenu(); } +function setupDockMenu() { + if (process.platform !== 'darwin' || !app.dock) return; + app.dock.setMenu(Menu.buildFromTemplate(nativeActionMenuItems())); +} + +function setupTaskbarTasks() { + if (process.platform !== 'win32') return; + + app.setUserTasks([ + { + program: process.execPath, + arguments: `${NATIVE_ACTION_ARG}new-mail`, + iconPath: getWindowIconPath(), + iconIndex: 0, + title: 'New Mail', + description: 'Compose a new MailFlow message', + }, + { + program: process.execPath, + arguments: `${NATIVE_ACTION_ARG}sync`, + iconPath: getWindowIconPath(), + iconIndex: 0, + title: 'Sync', + description: 'Sync MailFlow mail', + }, + ]); +} + function createWindow() { mainWindow = new BrowserWindow({ ...getDefaultWindowBounds(), @@ -826,16 +909,20 @@ if (!gotSingleInstanceLock) { } else { app.whenReady().then(() => { setupMenu(); + setupDockMenu(); + setupTaskbarTasks(); createTray(); createWindow(); + sendNativeAction(parseNativeActionArg(process.argv)); app.on('activate', () => { showMainWindow(); }); }); - app.on('second-instance', () => { + app.on('second-instance', (_event, args) => { showMainWindow(); + sendNativeAction(parseNativeActionArg(args)); }); } diff --git a/frontend/packages/electron/preload.cjs b/frontend/packages/electron/preload.cjs index c720f370..4134ef55 100644 --- a/frontend/packages/electron/preload.cjs +++ b/frontend/packages/electron/preload.cjs @@ -20,4 +20,7 @@ contextBridge.exposeInMainWorld('mailflowNative', { notifications: { onPush: (callback) => subscribe('mailflow:notifications:push', callback), }, + actions: { + onAction: (callback) => subscribe('mailflow:native-action', callback), + }, }); diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index c7f4c3e6..b57fcbc0 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -1,8 +1,10 @@ import { useEffect } from 'react'; import { useStore } from '../store/index.js'; +import { api } from '../utils/api.js'; export default function ElectronNotificationBridge() { const addNotification = useStore(state => state.addNotification); + const openCompose = useStore(state => state.openCompose); useEffect(() => { const unsubscribe = window.mailflowNative?.notifications?.onPush?.((notification) => { @@ -18,5 +20,36 @@ export default function ElectronNotificationBridge() { }; }, [addNotification]); + useEffect(() => { + const handleNativeAction = async (event) => { + const action = event.detail?.action; + + if (action === 'new-mail') { + openCompose({}); + return; + } + + if (action === 'sync') { + try { + addNotification({ + type: 'info', + title: 'Sync started', + body: 'MailFlow is checking for new mail.', + }); + await api.syncNow(); + } catch (error) { + addNotification({ + type: 'error', + title: 'Sync failed', + body: error.message || 'Could not sync mail.', + }); + } + } + }; + + window.addEventListener('mailflow:native-action', handleNativeAction); + return () => window.removeEventListener('mailflow:native-action', handleNativeAction); + }, [addNotification, openCompose]); + return null; } From 80d75845d67b21abcf57fa62c83a3eb46a2d26e6 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 15:07:53 -0300 Subject: [PATCH 33/90] fix native action bridge --- frontend/packages/electron/preload.cjs | 23 +++++++++++++++++- .../components/ElectronNotificationBridge.jsx | 24 +++++++++++++++---- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/frontend/packages/electron/preload.cjs b/frontend/packages/electron/preload.cjs index 4134ef55..7cba7dc6 100644 --- a/frontend/packages/electron/preload.cjs +++ b/frontend/packages/electron/preload.cjs @@ -1,4 +1,6 @@ const { contextBridge, ipcRenderer } = require('electron'); +const pendingNativeActions = []; +const nativeActionSubscribers = new Set(); function subscribe(channel, callback) { const listener = (_event, payload) => callback(payload); @@ -6,6 +8,25 @@ function subscribe(channel, callback) { return () => ipcRenderer.removeListener(channel, listener); } +ipcRenderer.on('mailflow:native-action', (_event, payload) => { + if (nativeActionSubscribers.size === 0) { + pendingNativeActions.push(payload); + return; + } + + nativeActionSubscribers.forEach((callback) => callback(payload)); +}); + +function subscribeNativeAction(callback) { + nativeActionSubscribers.add(callback); + + while (pendingNativeActions.length > 0) { + callback(pendingNativeActions.shift()); + } + + return () => nativeActionSubscribers.delete(callback); +} + contextBridge.exposeInMainWorld('mailflowNative', { getHost: () => ipcRenderer.invoke('mailflow:getHost'), saveHost: (host) => ipcRenderer.invoke('mailflow:saveHost', host), @@ -21,6 +42,6 @@ contextBridge.exposeInMainWorld('mailflowNative', { onPush: (callback) => subscribe('mailflow:notifications:push', callback), }, actions: { - onAction: (callback) => subscribe('mailflow:native-action', callback), + onAction: subscribeNativeAction, }, }); diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index b57fcbc0..4c97e5b9 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -1,10 +1,11 @@ -import { useEffect } from 'react'; +import { useEffect, useRef } from 'react'; import { useStore } from '../store/index.js'; import { api } from '../utils/api.js'; export default function ElectronNotificationBridge() { const addNotification = useStore(state => state.addNotification); const openCompose = useStore(state => state.openCompose); + const lastActionRef = useRef({ action: null, time: 0 }); useEffect(() => { const unsubscribe = window.mailflowNative?.notifications?.onPush?.((notification) => { @@ -21,8 +22,12 @@ export default function ElectronNotificationBridge() { }, [addNotification]); useEffect(() => { - const handleNativeAction = async (event) => { - const action = event.detail?.action; + const runNativeAction = async (action) => { + const now = Date.now(); + const last = lastActionRef.current; + + if (last.action === action && now - last.time < 500) return; + lastActionRef.current = { action, time: now }; if (action === 'new-mail') { openCompose({}); @@ -47,8 +52,19 @@ export default function ElectronNotificationBridge() { } }; + const handleNativeAction = (event) => { + runNativeAction(event.detail?.action); + }; + + const unsubscribe = window.mailflowNative?.actions?.onAction?.((payload) => { + runNativeAction(payload?.action); + }); + window.addEventListener('mailflow:native-action', handleNativeAction); - return () => window.removeEventListener('mailflow:native-action', handleNativeAction); + return () => { + window.removeEventListener('mailflow:native-action', handleNativeAction); + if (typeof unsubscribe === 'function') unsubscribe(); + }; }, [addNotification, openCompose]); return null; From c8acf1d841e085e0814d151b3f3e94a039131c8a Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 15:24:56 -0300 Subject: [PATCH 34/90] build apps with github release number --- .github/workflows/publish-apps.yml | 47 +++++++++++++++++-- frontend/packages/electron/main.cjs | 6 +++ frontend/packages/scripts/set-app-version.cjs | 5 ++ 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index 6df6121a..0f9c90dc 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -4,7 +4,14 @@ on: push: tags: - 'v*.*.*' + release: + types: + - published workflow_dispatch: + inputs: + version: + description: "Release tag/version to build, for example v1.2.3" + required: true permissions: contents: write @@ -35,9 +42,20 @@ jobs: working-directory: frontend run: npm ci + - name: Resolve app version + id: app-version + shell: bash + env: + RELEASE_TAG: ${{ github.event.release.tag_name }} + DISPATCH_VERSION: ${{ github.event.inputs.version }} + REF_NAME: ${{ github.ref_name }} + run: | + VERSION="${RELEASE_TAG:-${DISPATCH_VERSION:-$REF_NAME}}" + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + - name: Set app version working-directory: frontend - run: npm run app:version -- "${{ github.ref_name }}" "${{ github.run_number }}" + run: npm run app:version -- "${{ steps.app-version.outputs.version }}" "${{ github.run_number }}" - name: Build Electron package if: matrix.os != 'ubuntu-latest' @@ -101,9 +119,20 @@ jobs: working-directory: frontend run: npm ci + - name: Resolve app version + id: app-version + shell: bash + env: + RELEASE_TAG: ${{ github.event.release.tag_name }} + DISPATCH_VERSION: ${{ github.event.inputs.version }} + REF_NAME: ${{ github.ref_name }} + run: | + VERSION="${RELEASE_TAG:-${DISPATCH_VERSION:-$REF_NAME}}" + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + - name: Set app version working-directory: frontend - run: npm run app:version -- "${{ github.ref_name }}" "${{ github.run_number }}" + run: npm run app:version -- "${{ steps.app-version.outputs.version }}" "${{ github.run_number }}" - name: Build Android package working-directory: frontend @@ -126,10 +155,21 @@ jobs: needs: - desktop - android - if: startsWith(github.ref, 'refs/tags/') + if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'release' || github.event_name == 'workflow_dispatch' runs-on: ubuntu-latest steps: + - name: Resolve app version + id: app-version + shell: bash + env: + RELEASE_TAG: ${{ github.event.release.tag_name }} + DISPATCH_VERSION: ${{ github.event.inputs.version }} + REF_NAME: ${{ github.ref_name }} + run: | + VERSION="${RELEASE_TAG:-${DISPATCH_VERSION:-$REF_NAME}}" + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + - name: Download artifacts uses: actions/download-artifact@v4 with: @@ -138,6 +178,7 @@ jobs: - name: Publish release files uses: softprops/action-gh-release@v2 with: + tag_name: ${{ steps.app-version.outputs.version }} files: | artifacts/**/*.AppImage artifacts/**/*.apk diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 8e495c07..d0d30aca 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -547,6 +547,12 @@ function viewMenuItems() { if (!focusedWindow) return; focusedWindow.setFullScreen(!focusedWindow.isFullScreen()); }, + { + label: 'Toggle Developer Tools', + accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', + click(_item, focusedWindow) { + if (focusedWindow) focusedWindow.webContents.toggleDevTools(); + }, }, ]; } diff --git a/frontend/packages/scripts/set-app-version.cjs b/frontend/packages/scripts/set-app-version.cjs index 21095489..824884e8 100644 --- a/frontend/packages/scripts/set-app-version.cjs +++ b/frontend/packages/scripts/set-app-version.cjs @@ -32,6 +32,11 @@ function updateJsonVersion(filePath, version) { const version = normalizeVersion(requestedVersion); if (!version) { + if (requestedVersion) { + console.error(`Invalid release tag version "${requestedVersion}". Expected a semver tag like v1.2.3.`); + process.exit(1); + } + console.log('No release tag version detected; keeping package versions unchanged.'); process.exit(0); } From 1b27456a9bd89bd2b97af89774c4afb73c8b9cc5 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 15:30:47 -0300 Subject: [PATCH 35/90] fix double build --- .github/workflows/publish-apps.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index 0f9c90dc..4137cd87 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -4,14 +4,7 @@ on: push: tags: - 'v*.*.*' - release: - types: - - published workflow_dispatch: - inputs: - version: - description: "Release tag/version to build, for example v1.2.3" - required: true permissions: contents: write From 0cbd78d6d5f99caa221afe6c84db601d91c598f4 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 15:45:24 -0300 Subject: [PATCH 36/90] fix missing bracket --- frontend/packages/electron/main.cjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index d0d30aca..6de31824 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -409,7 +409,7 @@ async function checkForUpdates(verbose = false) { } if (!asset) { - notifyUpdateError('A MailFlow update is available, but no installer was found for this platform.'); + notifyUpdateError('Update is available, no installer was found.'); return { updateAvailable: true, downloadAvailable: false }; } @@ -547,6 +547,7 @@ function viewMenuItems() { if (!focusedWindow) return; focusedWindow.setFullScreen(!focusedWindow.isFullScreen()); }, + }, { label: 'Toggle Developer Tools', accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', From 211399524c858c8c758f63eaf80c4d9bd128f02c Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 15:50:44 -0300 Subject: [PATCH 37/90] Fix update install and message clip --- frontend/packages/electron/main.cjs | 121 ++++++++++++++---- .../components/ElectronNotificationBridge.jsx | 28 ++++ .../src/components/NotificationToasts.jsx | 5 +- 3 files changed, 126 insertions(+), 28 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 6de31824..b35b4fea 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -1,4 +1,5 @@ const { app, BrowserWindow, Menu, Tray, nativeImage, ipcMain, shell, dialog } = require('electron'); +const { spawn } = require('child_process'); const fs = require('fs'); const https = require('https'); const path = require('path'); @@ -177,10 +178,10 @@ function sendUpdateStatus(payload) { mainWindow.webContents.send(UPDATE_STATUS_CHANNEL, payload); } -function showInAppNotification({ title = '', message = '', type = 'info' }) { +function showInAppNotification({ title = '', message = '', type = 'info', actionLabel = '', action = '' }) { if (!mainWindow || mainWindow.isDestroyed()) return; - const payload = JSON.stringify({ title, message, type }); + const payload = JSON.stringify({ title, message, type, actionLabel, action }); mainWindow.webContents.executeJavaScript(` (() => { const notification = ${payload}; @@ -249,9 +250,10 @@ function showInAppNotification({ title = '', message = '', type = 'info' }) { body.textContent = notification.message; body.style.fontSize = '12px'; body.style.color = '#9898a8'; - body.style.whiteSpace = 'nowrap'; - body.style.overflow = 'hidden'; - body.style.textOverflow = 'ellipsis'; + body.style.whiteSpace = 'normal'; + body.style.overflow = 'visible'; + body.style.textOverflow = 'clip'; + body.style.lineHeight = '1.35'; const close = document.createElement('button'); close.type = 'button'; @@ -264,6 +266,27 @@ function showInAppNotification({ title = '', message = '', type = 'info' }) { close.style.font = '20px/1 Inter, ui-sans-serif, system-ui'; close.style.padding = '0'; + let action = null; + if (notification.actionLabel && notification.action) { + action = document.createElement('button'); + action.type = 'button'; + action.textContent = notification.actionLabel; + action.style.border = '1px solid rgba(255,255,255,0.12)'; + action.style.borderRadius = '6px'; + action.style.background = 'rgba(255,255,255,0.08)'; + action.style.color = '#e8e8ed'; + action.style.cursor = 'pointer'; + action.style.font = '600 12px Inter, ui-sans-serif, system-ui'; + action.style.padding = '5px 10px'; + action.style.flex = '0 0 auto'; + action.addEventListener('click', () => { + if (notification.action === 'install-update') { + window.mailflowNative?.updates?.installDownloaded?.(); + } + dismiss(); + }); + } + const dismiss = () => { toast.style.opacity = '0'; toast.style.transform = 'translateX(100%)'; @@ -272,7 +295,9 @@ function showInAppNotification({ title = '', message = '', type = 'info' }) { close.addEventListener('click', dismiss); copy.append(heading, body); - toast.append(icon, copy, close); + toast.append(icon, copy); + if (action) toast.appendChild(action); + toast.appendChild(close); root.appendChild(toast); window.requestAnimationFrame(() => { @@ -338,6 +363,27 @@ function notifyUpdateAvailable() { }); } +function notifyUpdateDownloaded() { + sendUpdateStatus({ + type: 'downloaded', + data: { + releaseNotes: updateInfo && updateInfo.releaseNotes, + releaseName: updateInfo && updateInfo.releaseName, + releaseDate: updateInfo && updateInfo.releaseDate, + updateUrl: updateInfo && updateInfo.updateUrl, + filePath: downloadedUpdate, + manual: true, + }, + }); + showInAppNotification({ + title: 'Update Ready', + message: 'MailFlow downloaded the update.', + type: 'positive', + actionLabel: 'Install', + action: 'install-update', + }); +} + function filePostfix() { const date = new Date(); return `${date.getMonth() + 1}.${date.getDate()}-${date.getHours()}.${date.getMinutes()}.${date.getSeconds()}`; @@ -374,17 +420,7 @@ function initializeUpdateDownloads(window) { if (state === 'completed') { downloadedUpdate = item.getSavePath(); - sendUpdateStatus({ - type: 'downloaded', - data: { - releaseNotes: updateInfo && updateInfo.releaseNotes, - releaseName: updateInfo && updateInfo.releaseName, - releaseDate: updateInfo && updateInfo.releaseDate, - updateUrl: updateInfo && updateInfo.updateUrl, - filePath: downloadedUpdate, - manual: true, - }, - }); + notifyUpdateDownloaded(); } }); }); @@ -430,17 +466,48 @@ async function checkForUpdates(verbose = false) { } } +function launchDownloadedUpdate(updatePath) { + if (process.platform === 'win32' && /\.exe$/i.test(updatePath)) { + const child = spawn(updatePath, [], { + detached: true, + stdio: 'ignore', + windowsHide: false, + }); + + child.unref(); + return Promise.resolve(); + } + + return shell.openPath(updatePath).then((error) => { + if (error) throw new Error(error); + }); +} + function installDownloadedUpdate() { - if (!downloadedUpdate) return; + if (!downloadedUpdate) { + return Promise.resolve({ installed: false, reason: 'missing-download' }); + } - fs.access(downloadedUpdate, fs.constants.F_OK, (error) => { - if (error) { - shell.showItemInFolder(downloadedUpdate); - return; - } + return new Promise((resolve) => { + fs.access(downloadedUpdate, fs.constants.F_OK, async (error) => { + if (error) { + shell.showItemInFolder(downloadedUpdate); + resolve({ installed: false, reason: 'missing-file' }); + return; + } - shell.openPath(downloadedUpdate); - app.quit(); + try { + await launchDownloadedUpdate(downloadedUpdate); + isQuitting = true; + setTimeout(() => app.quit(), 500); + resolve({ installed: true }); + } catch (launchError) { + console.error('Could not launch downloaded update:', launchError); + shell.showItemInFolder(downloadedUpdate); + notifyUpdateError('The update was downloaded, but MailFlow could not start the installer.'); + resolve({ installed: false, reason: 'launch-failed', error: launchError.message }); + } + }); }); } @@ -898,11 +965,11 @@ ipcMain.handle('mailflow:updates:check', async (_event, { verbose } = {}) => { }); ipcMain.handle('mailflow:updates:install-downloaded', () => { - installDownloadedUpdate(); + return installDownloadedUpdate(); }); ipcMain.handle('mailflow:updates:install-auto', () => { - installDownloadedUpdate(); + return installDownloadedUpdate(); }); ipcMain.handle('mailflow:updates:open-download', () => { diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index 4c97e5b9..f02bc0c9 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -21,6 +21,34 @@ export default function ElectronNotificationBridge() { }; }, [addNotification]); + useEffect(() => { + const unsubscribe = window.mailflowNative?.updates?.onStatus?.((status) => { + if (status?.type !== 'downloaded') return; + + addNotification({ + type: 'success', + title: 'Update ready', + body: 'MailFlow downloaded the update.', + allowWrap: true, + actionLabel: 'Install', + onAction: async () => { + const result = await window.mailflowNative?.updates?.installDownloaded?.(); + if (result && result.installed === false) { + addNotification({ + type: 'error', + title: 'Install failed', + body: 'The update was downloaded, but the installer could not be started.', + }); + } + }, + }); + }); + + return () => { + if (typeof unsubscribe === 'function') unsubscribe(); + }; + }, [addNotification]); + useEffect(() => { const runNativeAction = async (action) => { const now = Date.now(); diff --git a/frontend/src/components/NotificationToasts.jsx b/frontend/src/components/NotificationToasts.jsx index 6815b027..1a3f3975 100644 --- a/frontend/src/components/NotificationToasts.jsx +++ b/frontend/src/components/NotificationToasts.jsx @@ -198,7 +198,10 @@ function Toast({ notification, onDismiss, isMobile }) {
    {notification.body}
    From e32a6a0bf163002d36eab7f0f89b5a09d4c341a8 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 15:55:38 -0300 Subject: [PATCH 38/90] fix message --- frontend/packages/electron/main.cjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index b35b4fea..340066e4 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -445,7 +445,7 @@ async function checkForUpdates(verbose = false) { } if (!asset) { - notifyUpdateError('Update is available, no installer was found.'); + notifyUpdateError('A MailFlow update is available, but no installer was found for this platform.'); return { updateAvailable: true, downloadAvailable: false }; } From 296c02bf064eb95c5410f0811b42280705f7c9d9 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 16:20:22 -0300 Subject: [PATCH 39/90] fix native quick actions bridge --- frontend/packages/electron/main.cjs | 30 +++++++- frontend/packages/electron/preload.cjs | 2 + .../components/ElectronNotificationBridge.jsx | 72 +++++++++++++------ 3 files changed, 80 insertions(+), 24 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 340066e4..8d49930a 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -17,6 +17,8 @@ let isQuitting = false; let updateInfo = null; let downloadedUpdate = null; let updateDownloadsInitialized = false; +let nextNativeActionId = 1; +const pendingNativeActions = new Map(); app.setName('MailFlow'); if (process.platform === 'win32') { @@ -525,20 +527,36 @@ function parseNativeActionArg(args = []) { return null; } +function createNativeActionPayload(action) { + const payload = { + id: nextNativeActionId, + action, + createdAt: Date.now(), + }; + nextNativeActionId += 1; + pendingNativeActions.set(payload.id, payload); + return payload; +} + function sendNativeAction(action) { if (!action) return; + const payload = createNativeActionPayload(action); showMainWindow(); const dispatchScript = ` window.dispatchEvent(new CustomEvent('mailflow:native-action', { - detail: ${JSON.stringify({ action })} + detail: ${JSON.stringify(payload)} })); + window.postMessage({ + type: 'mailflow:native-action', + payload: ${JSON.stringify(payload)} + }, '*'); `; const send = () => { if (!mainWindow || mainWindow.isDestroyed()) return; - mainWindow.webContents.send(NATIVE_ACTION_CHANNEL, { action }); + mainWindow.webContents.send(NATIVE_ACTION_CHANNEL, payload); mainWindow.webContents.executeJavaScript(dispatchScript).catch(() => {}); }; @@ -976,6 +994,14 @@ ipcMain.handle('mailflow:updates:open-download', () => { openDownloadedUpdatePath(); }); +ipcMain.handle('mailflow:native-actions:pending', () => { + return Array.from(pendingNativeActions.values()); +}); + +ipcMain.handle('mailflow:native-actions:ack', (_event, id) => { + pendingNativeActions.delete(id); +}); + const gotSingleInstanceLock = app.requestSingleInstanceLock(); if (!gotSingleInstanceLock) { diff --git a/frontend/packages/electron/preload.cjs b/frontend/packages/electron/preload.cjs index 7cba7dc6..f0fed1de 100644 --- a/frontend/packages/electron/preload.cjs +++ b/frontend/packages/electron/preload.cjs @@ -42,6 +42,8 @@ contextBridge.exposeInMainWorld('mailflowNative', { onPush: (callback) => subscribe('mailflow:notifications:push', callback), }, actions: { + getPending: () => ipcRenderer.invoke('mailflow:native-actions:pending'), + ack: (id) => ipcRenderer.invoke('mailflow:native-actions:ack', id), onAction: subscribeNativeAction, }, }); diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index f02bc0c9..25b9cf5a 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -6,6 +6,7 @@ export default function ElectronNotificationBridge() { const addNotification = useStore(state => state.addNotification); const openCompose = useStore(state => state.openCompose); const lastActionRef = useRef({ action: null, time: 0 }); + const processedActionIdsRef = useRef(new Set()); useEffect(() => { const unsubscribe = window.mailflowNative?.notifications?.onPush?.((notification) => { @@ -50,47 +51,74 @@ export default function ElectronNotificationBridge() { }, [addNotification]); useEffect(() => { - const runNativeAction = async (action) => { + const runNativeAction = async (payload) => { + const action = typeof payload === 'string' ? payload : payload?.action; + const id = typeof payload === 'object' ? payload?.id : null; + + if (!action) return; + if (id && processedActionIdsRef.current.has(id)) return; + if (id) processedActionIdsRef.current.add(id); + const now = Date.now(); const last = lastActionRef.current; - if (last.action === action && now - last.time < 500) return; + if (!id && last.action === action && now - last.time < 500) return; lastActionRef.current = { action, time: now }; - if (action === 'new-mail') { - openCompose({}); - return; - } + try { + if (action === 'new-mail') { + openCompose({}); + return; + } - if (action === 'sync') { - try { - addNotification({ - type: 'info', - title: 'Sync started', - body: 'MailFlow is checking for new mail.', - }); - await api.syncNow(); - } catch (error) { - addNotification({ - type: 'error', - title: 'Sync failed', - body: error.message || 'Could not sync mail.', - }); + if (action === 'sync') { + try { + addNotification({ + type: 'info', + title: 'Sync started', + body: 'MailFlow is checking for new mail.', + }); + await api.syncNow(); + } catch (error) { + addNotification({ + type: 'error', + title: 'Sync failed', + body: error.message || 'Could not sync mail.', + }); + } + } + } finally { + if (id) { + window.mailflowNative?.actions?.ack?.(id); } } }; const handleNativeAction = (event) => { - runNativeAction(event.detail?.action); + runNativeAction(event.detail); + }; + + const handleNativeMessage = (event) => { + if (event.source !== window) return; + if (event.data?.type !== 'mailflow:native-action') return; + runNativeAction(event.data.payload); }; const unsubscribe = window.mailflowNative?.actions?.onAction?.((payload) => { - runNativeAction(payload?.action); + runNativeAction(payload); }); + window.mailflowNative?.actions?.getPending?.() + .then((actions = []) => { + actions.forEach(runNativeAction); + }) + .catch(() => {}); + window.addEventListener('mailflow:native-action', handleNativeAction); + window.addEventListener('message', handleNativeMessage); return () => { window.removeEventListener('mailflow:native-action', handleNativeAction); + window.removeEventListener('message', handleNativeMessage); if (typeof unsubscribe === 'function') unsubscribe(); }; }, [addNotification, openCompose]); From 50729d1495ec6ee317584034aa7794f20d753b0d Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 16:35:09 -0300 Subject: [PATCH 40/90] fix check for nativebridgeready --- frontend/packages/electron/main.cjs | 2 ++ frontend/src/components/ElectronNotificationBridge.jsx | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 8d49930a..f8c9df01 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -186,6 +186,8 @@ function showInAppNotification({ title = '', message = '', type = 'info', action const payload = JSON.stringify({ title, message, type, actionLabel, action }); mainWindow.webContents.executeJavaScript(` (() => { + if (window.__mailflowNativeBridgeReady) return; + const notification = ${payload}; const id = 'mailflow-electron-toasts'; let root = document.getElementById(id); diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index 25b9cf5a..bd3fbd06 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -8,6 +8,14 @@ export default function ElectronNotificationBridge() { const lastActionRef = useRef({ action: null, time: 0 }); const processedActionIdsRef = useRef(new Set()); + useEffect(() => { + window.__mailflowNativeBridgeReady = true; + + return () => { + window.__mailflowNativeBridgeReady = false; + }; + }, []); + useEffect(() => { const unsubscribe = window.mailflowNative?.notifications?.onPush?.((notification) => { addNotification({ From 74f73427e917947f0492897326ae8e590a00596e Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 16:49:29 -0300 Subject: [PATCH 41/90] fix install update notification no longer times out. --- frontend/packages/electron/main.cjs | 9 ++++++--- frontend/src/components/ElectronNotificationBridge.jsx | 1 + frontend/src/components/NotificationToasts.jsx | 2 ++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index f8c9df01..4cada2a2 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -180,10 +180,10 @@ function sendUpdateStatus(payload) { mainWindow.webContents.send(UPDATE_STATUS_CHANNEL, payload); } -function showInAppNotification({ title = '', message = '', type = 'info', actionLabel = '', action = '' }) { +function showInAppNotification({ title = '', message = '', type = 'info', actionLabel = '', action = '', persistent = false }) { if (!mainWindow || mainWindow.isDestroyed()) return; - const payload = JSON.stringify({ title, message, type, actionLabel, action }); + const payload = JSON.stringify({ title, message, type, actionLabel, action, persistent }); mainWindow.webContents.executeJavaScript(` (() => { if (window.__mailflowNativeBridgeReady) return; @@ -309,7 +309,9 @@ function showInAppNotification({ title = '', message = '', type = 'info', action toast.style.transform = 'translateX(0)'; }); - window.setTimeout(dismiss, 5000); + if (!notification.persistent) { + window.setTimeout(dismiss, 5000); + } })(); `).catch(() => {}); } @@ -385,6 +387,7 @@ function notifyUpdateDownloaded() { type: 'positive', actionLabel: 'Install', action: 'install-update', + persistent: true, }); } diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index bd3fbd06..0ebcd834 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -39,6 +39,7 @@ export default function ElectronNotificationBridge() { title: 'Update ready', body: 'MailFlow downloaded the update.', allowWrap: true, + persistent: true, actionLabel: 'Install', onAction: async () => { const result = await window.mailflowNative?.updates?.installDownloaded?.(); diff --git a/frontend/src/components/NotificationToasts.jsx b/frontend/src/components/NotificationToasts.jsx index 1a3f3975..65ae0224 100644 --- a/frontend/src/components/NotificationToasts.jsx +++ b/frontend/src/components/NotificationToasts.jsx @@ -149,6 +149,8 @@ function Toast({ notification, onDismiss, isMobile }) { }; useEffect(() => { + if (notification.persistent) return undefined; + const duration = notification.onUndo ? 6000 : 5000; const timer = setTimeout(dismiss, duration); return () => clearTimeout(timer); From 2e5eec6cc12e9cb1a6d2038d159c8d8048e66c6c Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 16:52:54 -0300 Subject: [PATCH 42/90] feat silent startup update check --- frontend/packages/electron/main.cjs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 4cada2a2..60a730ef 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -352,7 +352,7 @@ function notifyUpToDate(verbose) { }); } -function notifyUpdateAvailable() { +function notifyUpdateAvailable(verbose = true) { sendUpdateStatus({ type: 'available', data: { @@ -363,6 +363,9 @@ function notifyUpdateAvailable() { manual: true, }, }); + + if (!verbose) return; + notifyUpdateStatus({ title: 'Update Available', message: 'MailFlow is downloading the newest version for you.', @@ -463,7 +466,7 @@ async function checkForUpdates(verbose = false) { updateUrl: asset.browser_download_url, }; - notifyUpdateAvailable(); + notifyUpdateAvailable(verbose); downloadUpdate(asset.browser_download_url); return { updateAvailable: true, downloadAvailable: true }; } catch (error) { @@ -971,6 +974,25 @@ function loadSetup() { mainWindow.loadFile(path.join(__dirname, '..', 'native-shell', 'index.html')); } +function scheduleStartupUpdateCheck() { + if (!mainWindow || mainWindow.isDestroyed()) return; + if (!readHost()) return; + + const check = () => { + setTimeout(() => { + if (!mainWindow || mainWindow.isDestroyed()) return; + checkForUpdates(false); + }, 5000); + }; + + if (mainWindow.webContents.isLoading()) { + mainWindow.webContents.once('did-finish-load', check); + return; + } + + check(); +} + ipcMain.handle('mailflow:getHost', () => readHost()); ipcMain.handle('mailflow:saveHost', async (_event, host) => { @@ -1018,6 +1040,7 @@ if (!gotSingleInstanceLock) { setupTaskbarTasks(); createTray(); createWindow(); + scheduleStartupUpdateCheck(); sendNativeAction(parseNativeActionArg(process.argv)); app.on('activate', () => { From 30f0772026265b6c41355d78c5b687217e53dd20 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 16:58:19 -0300 Subject: [PATCH 43/90] fix macos update bar --- frontend/packages/electron/main.cjs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 60a730ef..9da46bd9 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -405,6 +405,15 @@ function getUniqueFilename(filename) { return `${file} (${filePostfix()})${extension}`; } +function setDownloadProgress(window, value) { + try { + if (!window || window.isDestroyed()) return; + window.setProgressBar(value); + } catch { + // Download events can outlive the BrowserWindow they started from. + } +} + function initializeUpdateDownloads(window) { if (updateDownloadsInitialized) return; updateDownloadsInitialized = true; @@ -417,12 +426,12 @@ function initializeUpdateDownloads(window) { item.on('updated', () => { if (totalBytes > 0) { - window.setProgressBar(item.getReceivedBytes() / totalBytes); + setDownloadProgress(window, item.getReceivedBytes() / totalBytes); } }); item.on('done', (_event, state) => { - if (!window.isDestroyed()) window.setProgressBar(-1); + setDownloadProgress(window, -1); if (state === 'interrupted') { dialog.showErrorBox('Download error', `The download of ${item.getFilename()} was interrupted.`); From b93b53eaf88db03e3fb727b4a85d1af76a961091 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 17:12:39 -0300 Subject: [PATCH 44/90] enable wrap on notification toast for longer system messages --- frontend/src/components/NotificationToasts.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/NotificationToasts.jsx b/frontend/src/components/NotificationToasts.jsx index 65ae0224..9fc83d85 100644 --- a/frontend/src/components/NotificationToasts.jsx +++ b/frontend/src/components/NotificationToasts.jsx @@ -171,7 +171,8 @@ function Toast({ notification, onDismiss, isMobile }) { background: 'var(--bg-elevated)', border: '1px solid var(--border)', borderRadius: 10, padding: '12px 14px', display: 'flex', alignItems: 'flex-start', gap: 10, - maxWidth: isMobile ? '100%' : 340, + width: notification.allowWrap && !isMobile ? 380 : undefined, + maxWidth: notification.allowWrap && !isMobile ? 'calc(100vw - 48px)' : isMobile ? '100%' : 340, boxShadow: 'var(--shadow-popover)', pointerEvents: 'all', }} @@ -204,6 +205,7 @@ function Toast({ notification, onDismiss, isMobile }) { textOverflow: notification.allowWrap ? 'clip' : 'ellipsis', whiteSpace: notification.allowWrap ? 'normal' : 'nowrap', lineHeight: notification.allowWrap ? 1.35 : undefined, + overflowWrap: notification.allowWrap ? 'anywhere' : undefined, }}> {notification.body} From 46f31ffd0c3d70e5a7216140dc7eb120ffa668f8 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 17:17:13 -0300 Subject: [PATCH 45/90] fix bridge unread count badge to linux api --- frontend/packages/electron/main.cjs | 6 ++++++ frontend/packages/electron/preload.cjs | 3 +++ frontend/src/components/ElectronNotificationBridge.jsx | 5 +++++ 3 files changed, 14 insertions(+) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 9da46bd9..09eb803c 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -1014,6 +1014,12 @@ ipcMain.handle('mailflow:resetHost', () => { loadSetup(); }); +ipcMain.handle('mailflow:badge:set-unread-count', (_event, count) => { + const unreadCount = Math.max(0, Number.parseInt(count, 10) || 0); + if (typeof app.setBadgeCount !== 'function') return false; + return app.setBadgeCount(unreadCount); +}); + ipcMain.handle('mailflow:updates:check', async (_event, { verbose } = {}) => { return checkForUpdates(verbose); }); diff --git a/frontend/packages/electron/preload.cjs b/frontend/packages/electron/preload.cjs index f0fed1de..087b2c69 100644 --- a/frontend/packages/electron/preload.cjs +++ b/frontend/packages/electron/preload.cjs @@ -31,6 +31,9 @@ contextBridge.exposeInMainWorld('mailflowNative', { getHost: () => ipcRenderer.invoke('mailflow:getHost'), saveHost: (host) => ipcRenderer.invoke('mailflow:saveHost', host), resetHost: () => ipcRenderer.invoke('mailflow:resetHost'), + badges: { + setUnreadCount: (count) => ipcRenderer.invoke('mailflow:badge:set-unread-count', count), + }, updates: { check: (verbose) => ipcRenderer.invoke('mailflow:updates:check', { verbose }), installDownloaded: () => ipcRenderer.invoke('mailflow:updates:install-downloaded'), diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index 0ebcd834..5a7c510f 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -5,6 +5,7 @@ import { api } from '../utils/api.js'; export default function ElectronNotificationBridge() { const addNotification = useStore(state => state.addNotification); const openCompose = useStore(state => state.openCompose); + const totalUnread = useStore(state => state.unreadCounts.total); const lastActionRef = useRef({ action: null, time: 0 }); const processedActionIdsRef = useRef(new Set()); @@ -16,6 +17,10 @@ export default function ElectronNotificationBridge() { }; }, []); + useEffect(() => { + window.mailflowNative?.badges?.setUnreadCount?.(totalUnread || 0); + }, [totalUnread]); + useEffect(() => { const unsubscribe = window.mailflowNative?.notifications?.onPush?.((notification) => { addNotification({ From cbde2baa222e13c98f78bcf8e750d1633789b4b6 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 18:48:21 -0300 Subject: [PATCH 46/90] fix linux updater --- frontend/packages/electron/main.cjs | 64 +++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 09eb803c..e6532d08 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -158,18 +158,66 @@ function isNewerVersion(candidate, current) { return false; } +function getLinuxDistributionIds() { + if (process.platform !== 'linux') return []; + + try { + const osRelease = fs.readFileSync('/etc/os-release', 'utf8'); + const ids = []; + + for (const key of ['ID', 'ID_LIKE']) { + const match = osRelease.match(new RegExp(`^${key}=(.+)$`, 'm')); + if (!match) continue; + + const values = match[1] + .replace(/^"|"$/g, '') + .toLowerCase() + .split(/\s+/) + .filter(Boolean); + ids.push(...values); + } + + return ids; + } catch { + return []; + } +} + +function getLinuxPackagePatternGroups() { + const arch = process.arch === 'arm64' + ? '(?:arm64|aarch64)' + : '(?:amd64|x64|x86_64)'; + const appImage = [/\.appimage$/i]; + const deb = [new RegExp(`${arch}\\.deb$`, 'i'), /\.deb$/i]; + const rpm = [new RegExp(`${arch}\\.rpm$`, 'i'), /\.rpm$/i]; + + if (process.env.APPIMAGE) return [appImage, deb, rpm]; + + const distroIds = getLinuxDistributionIds(); + if (distroIds.some((id) => ['debian', 'ubuntu', 'linuxmint', 'pop'].includes(id))) { + return [deb, appImage, rpm]; + } + if (distroIds.some((id) => ['fedora', 'rhel', 'centos', 'rocky', 'almalinux', 'suse', 'opensuse'].includes(id))) { + return [rpm, appImage, deb]; + } + + return [appImage, deb, rpm]; +} + function getUpdateAsset(release) { const assets = Array.isArray(release.assets) ? release.assets : []; - const platformAssetPatterns = { - win32: [/setup.*\.exe$/i, /\.exe$/i], - darwin: [/\.dmg$/i], - linux: [/\.appimage$/i, /\.deb$/i, /\.rpm$/i], + const platformAssetPatternGroups = { + win32: [[/setup.*\.exe$/i], [/\.exe$/i]], + darwin: [[/\.dmg$/i]], + linux: getLinuxPackagePatternGroups(), }; - const patterns = platformAssetPatterns[process.platform] || []; + const patternGroups = platformAssetPatternGroups[process.platform] || []; - for (const pattern of patterns) { - const asset = assets.find((item) => pattern.test(item.name || '') && item.browser_download_url); - if (asset) return asset; + for (const patterns of patternGroups) { + for (const pattern of patterns) { + const asset = assets.find((item) => pattern.test(item.name || '') && item.browser_download_url); + if (asset) return asset; + } } return null; From 4062af7440c6014e24281246fd6b2b4a171ca721 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 19:20:10 -0300 Subject: [PATCH 47/90] correct linux update flow and metadata --- frontend/package.json | 30 +++++++--- frontend/packages/electron/main.cjs | 45 ++++++++++++++- .../scripts/prepare-linux-metainfo.cjs | 55 +++++++++++++++++++ 3 files changed, 118 insertions(+), 12 deletions(-) create mode 100644 frontend/packages/scripts/prepare-linux-metainfo.cjs diff --git a/frontend/package.json b/frontend/package.json index 9a282366..67966a90 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,7 +30,7 @@ "build": "vite build", "preview": "vite preview", "electron:dev": "electron .", - "preelectron:dist": "node packages/scripts/prepare-electron-icons.cjs", + "preelectron:dist": "node packages/scripts/prepare-electron-icons.cjs && node packages/scripts/prepare-linux-metainfo.cjs", "electron:dist": "electron-builder --publish never", "app:version": "node packages/scripts/set-app-version.cjs", "native:prepare": "npm run build && node packages/scripts/prepare-native-shell.cjs", @@ -40,6 +40,7 @@ "build": { "appId": "sh.mailflow.app", "productName": "MailFlow", + "executableName": "MailFlow", "directories": { "output": "packages/release", "buildResources": "packages/electron/icons" @@ -54,13 +55,9 @@ "artifactName": "${productName}-${version}-Setup.${ext}", "icon": "icon.ico", "target": [ - "nsis", - "portable" + "nsis" ] }, - "portable": { - "artifactName": "${productName}-${version}-Portable.${ext}" - }, "mac": { "artifactName": "${productName}-${version}-Universal.${ext}", "target": [ @@ -96,13 +93,28 @@ ] } ], - "category": "Network" + "category": "Network", + "desktop": { + "Name": "MailFlow", + "StartupWMClass": "MailFlow" + } }, "deb": { - "artifactName": "${productName}-${version}-${arch}.${ext}" + "artifactName": "${productName}-${version}-${arch}.${ext}", + "maintainer": "maathimself ", + "vendor": "maathimself", + "packageCategory": "net", + "synopsis": "A self-hosted, unified webmail client.", + "fpm": [ + "packages/electron/package-type/deb=/opt/MailFlow/resources/package-type", + "packages/electron/metainfo/sh.mailflow.app.metainfo.xml=/usr/share/metainfo/sh.mailflow.app.metainfo.xml" + ] }, "rpm": { - "artifactName": "${productName}-${version}-${arch}.${ext}" + "artifactName": "${productName}-${version}-${arch}.${ext}", + "fpm": [ + "packages/electron/package-type/rpm=/opt/MailFlow/resources/package-type" + ] } }, "dependencies": { diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index e6532d08..06a35e03 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -1,5 +1,5 @@ const { app, BrowserWindow, Menu, Tray, nativeImage, ipcMain, shell, dialog } = require('electron'); -const { spawn } = require('child_process'); +const { execFileSync, spawn } = require('child_process'); const fs = require('fs'); const https = require('https'); const path = require('path'); @@ -183,6 +183,40 @@ function getLinuxDistributionIds() { } } +function getInstalledLinuxPackageType() { + if (process.platform !== 'linux') return null; + if (process.env.APPIMAGE) return 'appimage'; + + try { + const packageType = fs.readFileSync(path.join(process.resourcesPath, 'package-type'), 'utf8').trim().toLowerCase(); + if (['deb', 'rpm', 'appimage'].includes(packageType)) return packageType; + } catch {} + + return null; +} + +function getLinuxPackageManagerVersion(packageType) { + if (process.platform !== 'linux' || !['deb', 'rpm'].includes(packageType)) return null; + + const packageNames = ['MailFlow', 'mailflow', 'mailflow-frontend']; + for (const packageName of packageNames) { + try { + const args = packageType === 'rpm' + ? ['-q', '--qf', '%{VERSION}', packageName] + : ['-W', '-f=${Version}', packageName]; + const command = packageType === 'rpm' ? 'rpm' : 'dpkg-query'; + const output = execFileSync(command, args, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim(); + if (output) return output; + } catch {} + } + + return null; +} + +function getInstalledAppVersion(packageType = getInstalledLinuxPackageType()) { + return getLinuxPackageManagerVersion(packageType) || app.getVersion(); +} + function getLinuxPackagePatternGroups() { const arch = process.arch === 'arm64' ? '(?:arm64|aarch64)' @@ -191,7 +225,10 @@ function getLinuxPackagePatternGroups() { const deb = [new RegExp(`${arch}\\.deb$`, 'i'), /\.deb$/i]; const rpm = [new RegExp(`${arch}\\.rpm$`, 'i'), /\.rpm$/i]; - if (process.env.APPIMAGE) return [appImage, deb, rpm]; + const installedPackageType = getInstalledLinuxPackageType(); + if (installedPackageType === 'appimage') return [appImage, deb, rpm]; + if (installedPackageType === 'deb') return [deb, appImage, rpm]; + if (installedPackageType === 'rpm') return [rpm, appImage, deb]; const distroIds = getLinuxDistributionIds(); if (distroIds.some((id) => ['debian', 'ubuntu', 'linuxmint', 'pop'].includes(id))) { @@ -504,9 +541,11 @@ async function checkForUpdates(verbose = false) { try { const release = await requestJson(UPDATE_RELEASE_URL); const releaseVersion = release.tag_name || release.name; + const installedPackageType = getInstalledLinuxPackageType(); + const installedVersion = getInstalledAppVersion(installedPackageType); const asset = getUpdateAsset(release); - if (!isNewerVersion(releaseVersion, app.getVersion())) { + if (!isNewerVersion(releaseVersion, installedVersion)) { notifyUpToDate(verbose); return { updateAvailable: false }; } diff --git a/frontend/packages/scripts/prepare-linux-metainfo.cjs b/frontend/packages/scripts/prepare-linux-metainfo.cjs new file mode 100644 index 00000000..bb849e94 --- /dev/null +++ b/frontend/packages/scripts/prepare-linux-metainfo.cjs @@ -0,0 +1,55 @@ +const fs = require('fs'); +const path = require('path'); + +const root = path.join(__dirname, '..', '..'); +const packageJson = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8')); +const outputDir = path.join(root, 'packages', 'electron', 'metainfo'); +const outputPath = path.join(outputDir, 'sh.mailflow.app.metainfo.xml'); +const packageTypeDir = path.join(root, 'packages', 'electron', 'package-type'); + +function escapeXml(value) { + return String(value || '') + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +const releaseDate = new Date().toISOString().slice(0, 10); +const productName = packageJson.productName || 'MailFlow'; +const description = packageJson.description || 'A self-hosted, unified webmail client.'; +const homepage = packageJson.homepage || 'https://mailflow.sh'; +const license = packageJson.license || 'GPL-3.0'; + +const metainfo = ` + + sh.mailflow.app + CC0-1.0 + ${escapeXml(license)} + ${escapeXml(productName)} + ${escapeXml(description)} + ${escapeXml(packageJson.author && packageJson.author.name ? packageJson.author.name : productName)} + ${escapeXml(homepage)} + ${escapeXml(packageJson.bugs && packageJson.bugs.url ? packageJson.bugs.url : `${homepage}/docs`)} + MailFlow.desktop + + Network + Email + + +

    ${escapeXml(description)}

    +
    + + + + +
    +`; + +fs.mkdirSync(outputDir, { recursive: true }); +fs.writeFileSync(outputPath, metainfo); +fs.mkdirSync(packageTypeDir, { recursive: true }); +fs.writeFileSync(path.join(packageTypeDir, 'deb'), 'deb\n'); +fs.writeFileSync(path.join(packageTypeDir, 'rpm'), 'rpm\n'); +console.log(`Prepared Linux AppStream metadata at ${path.relative(root, outputPath)}.`); From 220d1d29b017acabe1f0d3cf831529d3a57b9d64 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 19:27:09 -0300 Subject: [PATCH 48/90] schema fix --- frontend/package.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 67966a90..4d3cfcd5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -95,8 +95,10 @@ ], "category": "Network", "desktop": { - "Name": "MailFlow", - "StartupWMClass": "MailFlow" + "entry": { + "Name": "MailFlow", + "StartupWMClass": "MailFlow" + } } }, "deb": { From c8a36a4bb98d94145bd6a010466533c60a8747e7 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 19:53:07 -0300 Subject: [PATCH 49/90] fix linux packagename --- frontend/package.json | 5 +++++ frontend/packages/electron/main.cjs | 11 +++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 4d3cfcd5..8b0e0e73 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -102,19 +102,24 @@ } }, "deb": { + "packageName": "mailflow", "artifactName": "${productName}-${version}-${arch}.${ext}", "maintainer": "maathimself ", "vendor": "maathimself", "packageCategory": "net", "synopsis": "A self-hosted, unified webmail client.", "fpm": [ + "--replaces=mailflow-frontend", + "--conflicts=mailflow-frontend", "packages/electron/package-type/deb=/opt/MailFlow/resources/package-type", "packages/electron/metainfo/sh.mailflow.app.metainfo.xml=/usr/share/metainfo/sh.mailflow.app.metainfo.xml" ] }, "rpm": { + "packageName": "mailflow", "artifactName": "${productName}-${version}-${arch}.${ext}", "fpm": [ + "--replaces=mailflow-frontend", "packages/electron/package-type/rpm=/opt/MailFlow/resources/package-type" ] } diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 06a35e03..6406988d 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -192,13 +192,16 @@ function getInstalledLinuxPackageType() { if (['deb', 'rpm', 'appimage'].includes(packageType)) return packageType; } catch {} + if (getLinuxPackageManagerVersion('rpm')) return 'rpm'; + if (getLinuxPackageManagerVersion('deb')) return 'deb'; + return null; } function getLinuxPackageManagerVersion(packageType) { if (process.platform !== 'linux' || !['deb', 'rpm'].includes(packageType)) return null; - const packageNames = ['MailFlow', 'mailflow', 'mailflow-frontend']; + const packageNames = ['mailflow', 'MailFlow', 'mailflow-frontend']; for (const packageName of packageNames) { try { const args = packageType === 'rpm' @@ -226,9 +229,9 @@ function getLinuxPackagePatternGroups() { const rpm = [new RegExp(`${arch}\\.rpm$`, 'i'), /\.rpm$/i]; const installedPackageType = getInstalledLinuxPackageType(); - if (installedPackageType === 'appimage') return [appImage, deb, rpm]; - if (installedPackageType === 'deb') return [deb, appImage, rpm]; - if (installedPackageType === 'rpm') return [rpm, appImage, deb]; + if (installedPackageType === 'appimage') return [appImage]; + if (installedPackageType === 'deb') return [deb]; + if (installedPackageType === 'rpm') return [rpm]; const distroIds = getLinuxDistributionIds(); if (distroIds.some((id) => ['debian', 'ubuntu', 'linuxmint', 'pop'].includes(id))) { From 61a4954e0724ff60099425a0cbcce2cc8aac2621 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 20:16:32 -0300 Subject: [PATCH 50/90] remove appimage option --- .github/workflows/publish-apps.yml | 4 +--- frontend/package.json | 6 ------ frontend/packages/electron/main.cjs | 9 ++++----- 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/.github/workflows/publish-apps.yml b/.github/workflows/publish-apps.yml index 4137cd87..c2a1b6ee 100644 --- a/.github/workflows/publish-apps.yml +++ b/.github/workflows/publish-apps.yml @@ -60,7 +60,7 @@ jobs: - name: Build Linux x64 Electron packages if: matrix.os == 'ubuntu-latest' working-directory: frontend - run: npm run electron:dist -- --linux AppImage deb rpm --x64 + run: npm run electron:dist -- --linux deb rpm --x64 env: CSC_IDENTITY_AUTO_DISCOVERY: "false" @@ -82,7 +82,6 @@ jobs: name: mailflow-electron-${{ matrix.os }} if-no-files-found: error path: | - frontend/packages/release/*.AppImage frontend/packages/release/*.deb frontend/packages/release/*.dmg frontend/packages/release/*.exe @@ -173,7 +172,6 @@ jobs: with: tag_name: ${{ steps.app-version.outputs.version }} files: | - artifacts/**/*.AppImage artifacts/**/*.apk artifacts/**/*.deb artifacts/**/*.dmg diff --git a/frontend/package.json b/frontend/package.json index 8b0e0e73..7fef4277 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -72,12 +72,6 @@ "linux": { "artifactName": "${productName}-${version}.${ext}", "target": [ - { - "target": "AppImage", - "arch": [ - "x64" - ] - }, { "target": "deb", "arch": [ diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 6406988d..d2ac3689 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -224,24 +224,23 @@ function getLinuxPackagePatternGroups() { const arch = process.arch === 'arm64' ? '(?:arm64|aarch64)' : '(?:amd64|x64|x86_64)'; - const appImage = [/\.appimage$/i]; const deb = [new RegExp(`${arch}\\.deb$`, 'i'), /\.deb$/i]; const rpm = [new RegExp(`${arch}\\.rpm$`, 'i'), /\.rpm$/i]; const installedPackageType = getInstalledLinuxPackageType(); - if (installedPackageType === 'appimage') return [appImage]; + if (installedPackageType === 'appimage') return []; if (installedPackageType === 'deb') return [deb]; if (installedPackageType === 'rpm') return [rpm]; const distroIds = getLinuxDistributionIds(); if (distroIds.some((id) => ['debian', 'ubuntu', 'linuxmint', 'pop'].includes(id))) { - return [deb, appImage, rpm]; + return [deb]; } if (distroIds.some((id) => ['fedora', 'rhel', 'centos', 'rocky', 'almalinux', 'suse', 'opensuse'].includes(id))) { - return [rpm, appImage, deb]; + return [rpm]; } - return [appImage, deb, rpm]; + return [deb, rpm]; } function getUpdateAsset(release) { From b29fa7bfce3af64ee5826ccad030a160c0f74392 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 20:47:58 -0300 Subject: [PATCH 51/90] changing deb and rpm to update through shell --- frontend/packages/electron/main.cjs | 97 ++++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 2 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index d2ac3689..57aaf40e 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -10,6 +10,12 @@ const UPDATE_RELEASE_URL = 'https://api.github.com/repos/dcoffin88/mailflow/rele const UPDATE_ERROR_MESSAGE = 'Could not check for MailFlow updates. Please visit the website instead.'; const NATIVE_ACTION_CHANNEL = 'mailflow:native-action'; const NATIVE_ACTION_ARG = '--mailflow-action='; +const LINUX_BADGE_DESKTOP_IDS = [ + 'MailFlow.desktop', + 'mailflow.desktop', + 'sh.mailflow.app.desktop', + 'mailflow-frontend.desktop', +]; let mainWindow; let tray = null; @@ -220,6 +226,59 @@ function getInstalledAppVersion(packageType = getInstalledLinuxPackageType()) { return getLinuxPackageManagerVersion(packageType) || app.getVersion(); } +function getAvailableCommand(commands = []) { + for (const command of commands) { + try { + const output = execFileSync('which', [command], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim(); + if (output) return command; + } catch {} + } + + return null; +} + +function emitUnityLauncherBadgeCount(count) { + if (process.platform !== 'linux') return false; + + const gdbus = getAvailableCommand(['gdbus']); + if (!gdbus) return false; + + const visible = count > 0; + const properties = visible + ? `{'count':<${count}>,'count-visible':}` + : `{'count-visible':}`; + + for (const desktopId of LINUX_BADGE_DESKTOP_IDS) { + const child = spawn(gdbus, [ + 'emit', + '--session', + '--object-path', + '/', + '--signal', + 'com.canonical.Unity.LauncherEntry.Update', + `application://${desktopId}`, + properties, + ], { + detached: true, + stdio: 'ignore', + }); + + child.unref(); + } + + return true; +} + +function setUnreadBadgeCount(count) { + let badgeSet = false; + + if (typeof app.setBadgeCount === 'function') { + badgeSet = app.setBadgeCount(count); + } + + return emitUnityLauncherBadgeCount(count) || badgeSet; +} + function getLinuxPackagePatternGroups() { const arch = process.arch === 'arm64' ? '(?:arm64|aarch64)' @@ -586,6 +645,41 @@ function launchDownloadedUpdate(updatePath) { return Promise.resolve(); } + if (process.platform === 'linux' && /\.deb$/i.test(updatePath)) { + const terminal = getAvailableCommand(['x-terminal-emulator', 'gnome-terminal', 'konsole', 'xfce4-terminal', 'mate-terminal', 'xterm']); + if (terminal) { + const terminalArgs = terminal === 'gnome-terminal' + ? ['--', 'sudo', 'dpkg', '--install', updatePath] + : ['-e', 'sudo', 'dpkg', '--install', updatePath]; + + const child = spawn(terminal, terminalArgs, { + detached: true, + stdio: 'ignore', + }); + + child.unref(); + return Promise.resolve(); + } + } + + if (process.platform === 'linux' && /\.rpm$/i.test(updatePath)) { + const terminal = getAvailableCommand(['x-terminal-emulator', 'gnome-terminal', 'konsole', 'xfce4-terminal', 'mate-terminal', 'xterm']); + const packageInstaller = getAvailableCommand(['dnf', 'dnf5', 'yum']); + if (terminal && packageInstaller) { + const terminalArgs = terminal === 'gnome-terminal' + ? ['--', 'sudo', packageInstaller, 'install', updatePath] + : ['-e', 'sudo', packageInstaller, 'install', updatePath]; + + const child = spawn(terminal, terminalArgs, { + detached: true, + stdio: 'ignore', + }); + + child.unref(); + return Promise.resolve(); + } + } + return shell.openPath(updatePath).then((error) => { if (error) throw new Error(error); }); @@ -1105,8 +1199,7 @@ ipcMain.handle('mailflow:resetHost', () => { ipcMain.handle('mailflow:badge:set-unread-count', (_event, count) => { const unreadCount = Math.max(0, Number.parseInt(count, 10) || 0); - if (typeof app.setBadgeCount !== 'function') return false; - return app.setBadgeCount(unreadCount); + return setUnreadBadgeCount(unreadCount); }); ipcMain.handle('mailflow:updates:check', async (_event, { verbose } = {}) => { From 9dfdaf42839e98f416583ae8f6c6368a06d36b7d Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 21:09:31 -0300 Subject: [PATCH 52/90] to fix unread badge on rpm --- frontend/packages/electron/main.cjs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 57aaf40e..f202a71d 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -189,6 +189,14 @@ function getLinuxDistributionIds() { } } +function isDebLikeLinuxDistribution(distroIds = getLinuxDistributionIds()) { + return distroIds.some((id) => ['debian', 'ubuntu', 'linuxmint', 'pop'].some((match) => id === match || id.includes(match))); +} + +function isRpmLikeLinuxDistribution(distroIds = getLinuxDistributionIds()) { + return distroIds.some((id) => ['fedora', 'rhel', 'centos', 'rocky', 'almalinux', 'suse', 'opensuse'].some((match) => id === match || id.includes(match))); +} + function getInstalledLinuxPackageType() { if (process.platform !== 'linux') return null; if (process.env.APPIMAGE) return 'appimage'; @@ -201,6 +209,10 @@ function getInstalledLinuxPackageType() { if (getLinuxPackageManagerVersion('rpm')) return 'rpm'; if (getLinuxPackageManagerVersion('deb')) return 'deb'; + const distroIds = getLinuxDistributionIds(); + if (isRpmLikeLinuxDistribution(distroIds) || getAvailableCommand(['rpm', 'dnf', 'dnf5', 'yum'])) return 'rpm'; + if (isDebLikeLinuxDistribution(distroIds) || getAvailableCommand(['dpkg', 'apt', 'apt-get'])) return 'deb'; + return null; } @@ -245,8 +257,8 @@ function emitUnityLauncherBadgeCount(count) { const visible = count > 0; const properties = visible - ? `{'count':<${count}>,'count-visible':}` - : `{'count-visible':}`; + ? `{'count': , 'count-visible': }` + : `{'count': , 'count-visible': }`; for (const desktopId of LINUX_BADGE_DESKTOP_IDS) { const child = spawn(gdbus, [ @@ -292,14 +304,17 @@ function getLinuxPackagePatternGroups() { if (installedPackageType === 'rpm') return [rpm]; const distroIds = getLinuxDistributionIds(); - if (distroIds.some((id) => ['debian', 'ubuntu', 'linuxmint', 'pop'].includes(id))) { + if (isDebLikeLinuxDistribution(distroIds)) { return [deb]; } - if (distroIds.some((id) => ['fedora', 'rhel', 'centos', 'rocky', 'almalinux', 'suse', 'opensuse'].includes(id))) { + if (isRpmLikeLinuxDistribution(distroIds)) { return [rpm]; } - return [deb, rpm]; + if (getAvailableCommand(['rpm', 'dnf', 'dnf5', 'yum'])) return [rpm]; + if (getAvailableCommand(['dpkg', 'apt', 'apt-get'])) return [deb]; + + return []; } function getUpdateAsset(release) { From 94dc0835056fbe23401426a4ef2b896e727ed408 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 21:33:58 -0300 Subject: [PATCH 53/90] add libunity dependency for counter badge --- frontend/package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/package.json b/frontend/package.json index 7fef4277..a654efb4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -112,6 +112,10 @@ "rpm": { "packageName": "mailflow", "artifactName": "${productName}-${version}-${arch}.${ext}", + "depends": [ + "default", + "libunity" + ], "fpm": [ "--replaces=mailflow-frontend", "packages/electron/package-type/rpm=/opt/MailFlow/resources/package-type" From 1c44328bef6cd837245586d4f7adad4e9d52141b Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 21:57:05 -0300 Subject: [PATCH 54/90] fix linux update flow --- frontend/packages/electron/main.cjs | 65 +++++++++++++++++------------ 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index f202a71d..6dee7be0 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -575,6 +575,37 @@ function setDownloadProgress(window, value) { } } +function getLinuxTerminalCommand() { + return getAvailableCommand([ + 'ptyxis', + 'kgx', + 'gnome-terminal', + 'konsole', + 'xterm', + 'x-terminal-emulator', + ]); +} + +function getTerminalArgs(terminal, command, args = []) { + const shellCommand = ['sh', '-lc', 'exec "$@"', 'mailflow-installer', command, ...args]; + if (['ptyxis', 'kgx', 'gnome-terminal'].includes(terminal)) return ['--', ...shellCommand]; + return ['-e', ...shellCommand]; +} + +function launchTerminalCommand(command, args = []) { + const terminal = getLinuxTerminalCommand(); + if (!terminal) { + throw new Error('No supported terminal was found.'); + } + + const child = spawn(terminal, getTerminalArgs(terminal, command, args), { + detached: true, + stdio: 'ignore', + }); + + child.unref(); +} + function initializeUpdateDownloads(window) { if (updateDownloadsInitialized) return; updateDownloadsInitialized = true; @@ -661,38 +692,18 @@ function launchDownloadedUpdate(updatePath) { } if (process.platform === 'linux' && /\.deb$/i.test(updatePath)) { - const terminal = getAvailableCommand(['x-terminal-emulator', 'gnome-terminal', 'konsole', 'xfce4-terminal', 'mate-terminal', 'xterm']); - if (terminal) { - const terminalArgs = terminal === 'gnome-terminal' - ? ['--', 'sudo', 'dpkg', '--install', updatePath] - : ['-e', 'sudo', 'dpkg', '--install', updatePath]; - - const child = spawn(terminal, terminalArgs, { - detached: true, - stdio: 'ignore', - }); - - child.unref(); - return Promise.resolve(); - } + launchTerminalCommand('sudo', ['dpkg', '--install', updatePath]); + return Promise.resolve(); } if (process.platform === 'linux' && /\.rpm$/i.test(updatePath)) { - const terminal = getAvailableCommand(['x-terminal-emulator', 'gnome-terminal', 'konsole', 'xfce4-terminal', 'mate-terminal', 'xterm']); const packageInstaller = getAvailableCommand(['dnf', 'dnf5', 'yum']); - if (terminal && packageInstaller) { - const terminalArgs = terminal === 'gnome-terminal' - ? ['--', 'sudo', packageInstaller, 'install', updatePath] - : ['-e', 'sudo', packageInstaller, 'install', updatePath]; - - const child = spawn(terminal, terminalArgs, { - detached: true, - stdio: 'ignore', - }); - - child.unref(); - return Promise.resolve(); + if (!packageInstaller) { + throw new Error('No RPM package installer was found.'); } + + launchTerminalCommand('sudo', [packageInstaller, 'install', updatePath]); + return Promise.resolve(); } return shell.openPath(updatePath).then((error) => { From f51ce0c347297deda530d452bb5df9ed0402a1b4 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 22:06:48 -0300 Subject: [PATCH 55/90] fix rpm build --- frontend/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index a654efb4..b6f30a35 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -113,7 +113,6 @@ "packageName": "mailflow", "artifactName": "${productName}-${version}-${arch}.${ext}", "depends": [ - "default", "libunity" ], "fpm": [ From d5628beffb50da5b096f349896c25fbcb0600515 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 22:53:05 -0300 Subject: [PATCH 56/90] Update README.md --- README.md | 83 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 61 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index efa9402c..d3aca435 100644 --- a/README.md +++ b/README.md @@ -73,28 +73,6 @@ There are three ways to run MailFlow. The pre-built image method is recommended --- -## Desktop and Android apps - -MailFlow remains a self-hosted web app, but release builds can also publish native wrappers for users who prefer an installed app alongside the PWA. - -- Windows, macOS, and Linux use Electron packages. -- Android uses a Capacitor WebView package, because Electron does not support Android. -- On first launch, the wrapper asks for the MailFlow host, such as `https://mail.your-domain.com`, stores it locally, and opens that server. -- Native package sources live under `frontend/packages`. - -To build locally: - -```bash -cd frontend -npm ci -npm run electron:dist -npm run android:dist -``` - -Android builds require a local JDK and Android SDK. The `.github/workflows/publish-apps.yml` workflow installs those tools in CI and attaches app artifacts to tagged releases. - ---- - ## Option A — Pre-built images (recommended) No cloning or building required. Docker pulls the pre-built images directly from GHCR. @@ -521,6 +499,67 @@ nginx (frontend container — internal only) └── backend, PostgreSQL, Redis (internal network, unchanged) ``` +## Desktop and Android apps + +MailFlow remains a self-hosted web app, but release builds also publish native wrappers for users who prefer an installed desktop or mobile application. + +- Windows, macOS, and Linux use Electron-based packages. +- Android uses a Capacitor WebView wrapper. +- On first launch, the native wrapper prompts for the MailFlow server URL, such as `https://mail.your-domain.com`, stores it locally, and connects to that server. +- Native package sources live under `frontend/packages`. + +Install release builds from the latest MailFlow release: + +- **Windows**: + - Download the latest `.exe` installer and run it. +- **macOS**: + - Download the latest `Universal.dmg` release and install the app. + - On first launch, macOS may display: + - `"MailFlow" can't be opened because Apple cannot check it for malicious software`. + - Click OK, then open: + - Settings -> Privacy & Security. + - Click Open Anyway beside: + - `"MailFlow" was blocked from use because it is not from an identified developer`. + - Click Open on the second confirmation dialog. + - MailFlow will run normally afterward, including future updates. +- **Ubuntu / Debian** + - Download the latest `.deb` release and install it: + + ```bash + sudo dpkg -i MailFlow--amd64.deb + ``` + or + ```bash + sudo dpkg -i MailFlow--arm64.deb + ``` + - If dependencies are missing: + ```bash + sudo apt-get install -f + ``` +- **Fedora / Red Hat** + - Download the latest `.rpm` release and install it: + + ```bash + sudo dnf install MailFlow--x86_64.rpm + ``` + or + ```bash + sudo dnf install MailFlow--aarch64.rpm + ``` + +- **Android** + - Download the latest Android `.apk` release and install it manually. + +Local Development Builds: + +```bash +cd frontend +npm ci +npm run electron:dist +npm run android:dist +``` +--- + ## Star History [![Star History Chart](https://api.star-history.com/svg?repos=maathimself/mailflow&type=Date)](https://star-history.com/#maathimself/mailflow&Date) From 98bb8538f41452c86fd06c3c0bdc127a50c4cd4f Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 23:09:12 -0300 Subject: [PATCH 57/90] feat to start forwarding inapp new mail notices to os --- frontend/packages/electron/main.cjs | 38 ++++++++++++++++++- frontend/packages/electron/preload.cjs | 1 + .../components/ElectronNotificationBridge.jsx | 25 ++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 6dee7be0..cbbe6703 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -1,4 +1,4 @@ -const { app, BrowserWindow, Menu, Tray, nativeImage, ipcMain, shell, dialog } = require('electron'); +const { app, BrowserWindow, Menu, Tray, nativeImage, ipcMain, shell, dialog, Notification } = require('electron'); const { execFileSync, spawn } = require('child_process'); const fs = require('fs'); const https = require('https'); @@ -10,6 +10,7 @@ const UPDATE_RELEASE_URL = 'https://api.github.com/repos/dcoffin88/mailflow/rele const UPDATE_ERROR_MESSAGE = 'Could not check for MailFlow updates. Please visit the website instead.'; const NATIVE_ACTION_CHANNEL = 'mailflow:native-action'; const NATIVE_ACTION_ARG = '--mailflow-action='; +const NEW_MAIL_NOTIFICATION_MAX_LENGTH = 240; const LINUX_BADGE_DESKTOP_IDS = [ 'MailFlow.desktop', 'mailflow.desktop', @@ -483,6 +484,37 @@ function notifyUpdateStatus({ title, message, type = 'info' }) { mainWindow.webContents.send('mailflow:notifications:push', { title, message, type }); } +function cleanNotificationText(value, fallback = '') { + const text = String(value || fallback) + .replace(/\s+/g, ' ') + .trim(); + + if (text.length <= NEW_MAIL_NOTIFICATION_MAX_LENGTH) return text; + return `${text.slice(0, NEW_MAIL_NOTIFICATION_MAX_LENGTH - 1)}…`; +} + +function showNewMailNotification({ title, body, count } = {}) { + if (!Notification.isSupported()) { + return { shown: false, reason: 'unsupported' }; + } + + const normalizedTitle = cleanNotificationText(title, 'New mail'); + const normalizedBody = cleanNotificationText(body, 'No subject'); + const notification = new Notification({ + title: normalizedTitle, + body: count > 1 ? `${normalizedBody}\n${count} new messages` : normalizedBody, + icon: getIconPath(), + silent: true, + }); + + notification.on('click', () => { + showMainWindow({ reload: true }); + }); + notification.show(); + + return { shown: true }; +} + function notifyCheckingUpdate(verbose) { if (!verbose) return; @@ -1228,6 +1260,10 @@ ipcMain.handle('mailflow:badge:set-unread-count', (_event, count) => { return setUnreadBadgeCount(unreadCount); }); +ipcMain.handle('mailflow:notification:new-mail', (_event, notification) => { + return showNewMailNotification(notification); +}); + ipcMain.handle('mailflow:updates:check', async (_event, { verbose } = {}) => { return checkForUpdates(verbose); }); diff --git a/frontend/packages/electron/preload.cjs b/frontend/packages/electron/preload.cjs index 087b2c69..2228c93a 100644 --- a/frontend/packages/electron/preload.cjs +++ b/frontend/packages/electron/preload.cjs @@ -43,6 +43,7 @@ contextBridge.exposeInMainWorld('mailflowNative', { }, notifications: { onPush: (callback) => subscribe('mailflow:notifications:push', callback), + showNewMail: (notification) => ipcRenderer.invoke('mailflow:notification:new-mail', notification), }, actions: { getPending: () => ipcRenderer.invoke('mailflow:native-actions:pending'), diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index 5a7c510f..ee2db020 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -8,6 +8,7 @@ export default function ElectronNotificationBridge() { const totalUnread = useStore(state => state.unreadCounts.total); const lastActionRef = useRef({ action: null, time: 0 }); const processedActionIdsRef = useRef(new Set()); + const forwardedNotificationIdsRef = useRef(new Set()); useEffect(() => { window.__mailflowNativeBridgeReady = true; @@ -21,6 +22,30 @@ export default function ElectronNotificationBridge() { window.mailflowNative?.badges?.setUnreadCount?.(totalUnread || 0); }, [totalUnread]); + useEffect(() => { + const showNewMail = window.mailflowNative?.notifications?.showNewMail; + if (typeof showNewMail !== 'function') return undefined; + + useStore.getState().notifications.forEach((notification) => { + if (notification?.id) forwardedNotificationIdsRef.current.add(notification.id); + }); + + return useStore.subscribe((state) => { + for (const notification of state.notifications) { + if (notification?.type !== 'new_mail' || !notification.id) continue; + if (forwardedNotificationIdsRef.current.has(notification.id)) continue; + + forwardedNotificationIdsRef.current.add(notification.id); + showNewMail({ + title: notification.title, + body: notification.body, + count: notification.count, + accountId: notification.accountId, + }).catch(() => {}); + } + }); + }, []); + useEffect(() => { const unsubscribe = window.mailflowNative?.notifications?.onPush?.((notification) => { addNotification({ From 266941c3179bdefa585338b0e22fe7cae4a994b2 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 23:34:37 -0300 Subject: [PATCH 58/90] fix to notify system os of new mail when minimized --- frontend/packages/electron/main.cjs | 1 + .../components/ElectronNotificationBridge.jsx | 28 ++++++++++++++----- frontend/src/hooks/useWebSocket.js | 26 ++++++++++++----- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index cbbe6703..4ec6d1df 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -1174,6 +1174,7 @@ function createWindow() { icon: getWindowIconPath(), webPreferences: { preload: path.join(__dirname, 'preload.cjs'), + backgroundThrottling: false, contextIsolation: true, nodeIntegration: false, sandbox: true, diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index ee2db020..d6989eb0 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -26,24 +26,38 @@ export default function ElectronNotificationBridge() { const showNewMail = window.mailflowNative?.notifications?.showNewMail; if (typeof showNewMail !== 'function') return undefined; + const forwardNewMail = (notification) => { + showNewMail({ + title: notification.title, + body: notification.body, + count: notification.count, + accountId: notification.accountId, + }).catch(() => {}); + }; + + const handleHiddenNewMail = (event) => { + forwardNewMail(event.detail || {}); + }; + useStore.getState().notifications.forEach((notification) => { if (notification?.id) forwardedNotificationIdsRef.current.add(notification.id); }); - return useStore.subscribe((state) => { + const unsubscribe = useStore.subscribe((state) => { for (const notification of state.notifications) { if (notification?.type !== 'new_mail' || !notification.id) continue; if (forwardedNotificationIdsRef.current.has(notification.id)) continue; forwardedNotificationIdsRef.current.add(notification.id); - showNewMail({ - title: notification.title, - body: notification.body, - count: notification.count, - accountId: notification.accountId, - }).catch(() => {}); + forwardNewMail(notification); } }); + + window.addEventListener('mailflow:new-mail-notification', handleHiddenNewMail); + return () => { + unsubscribe(); + window.removeEventListener('mailflow:new-mail-notification', handleHiddenNewMail); + }; }, []); useEffect(() => { diff --git a/frontend/src/hooks/useWebSocket.js b/frontend/src/hooks/useWebSocket.js index d3d415ed..04933e09 100644 --- a/frontend/src/hooks/useWebSocket.js +++ b/frontend/src/hooks/useWebSocket.js @@ -46,6 +46,12 @@ function _applyServerCounts(counts) { } } +function _emitNativeNewMailNotification(notification) { + window.dispatchEvent(new CustomEvent('mailflow:new-mail-notification', { + detail: notification, + })); +} + // Auth-related close codes that should not trigger reconnect const NO_RECONNECT_CODES = new Set([4001, 4003]); @@ -111,19 +117,25 @@ export function useWebSocket() { const isInbox = !folder || folder === 'INBOX'; if (messages && messages.length > 0) { - // In-app notifications and sounds are inbox-only — non-inbox folder syncs - // (Archive, Spam, on-demand syncs) should not trigger alerts for old mail. - if (isInbox && document.visibilityState === 'visible') { + // New-mail alerts are inbox-only — non-inbox folder syncs (Archive, + // Spam, on-demand syncs) should not trigger alerts for old mail. + if (isInbox) { const latest = messages[0]; - addNotification({ + const notification = { type: 'new_mail', accountId, title: latest.fromName || latest.fromEmail || t('notifications.newMessage'), body: latest.subject || t('common.noSubject'), count, - }); - const { notificationSound, customSoundDataUrl } = useStore.getState(); - playNotificationSound(notificationSound, customSoundDataUrl); + }; + + if (document.visibilityState === 'visible') { + addNotification(notification); + const { notificationSound, customSoundDataUrl } = useStore.getState(); + playNotificationSound(notificationSound, customSoundDataUrl); + } else { + _emitNativeNewMailNotification(notification); + } } // Refresh the message list when the affected folder is visible From 3db11d9d0629e2822fe9b2eaf9486477b6dae355 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Wed, 27 May 2026 23:51:19 -0300 Subject: [PATCH 59/90] expand bridge to open new mail from os notification --- frontend/packages/electron/main.cjs | 21 +++++++++--- .../components/ElectronNotificationBridge.jsx | 32 ++++++++++++++++++- frontend/src/hooks/useWebSocket.js | 5 ++- 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 4ec6d1df..3bc14568 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -493,7 +493,7 @@ function cleanNotificationText(value, fallback = '') { return `${text.slice(0, NEW_MAIL_NOTIFICATION_MAX_LENGTH - 1)}…`; } -function showNewMailNotification({ title, body, count } = {}) { +function showNewMailNotification({ title, body, count, messageId, accountId, folder, message } = {}) { if (!Notification.isSupported()) { return { shown: false, reason: 'unsupported' }; } @@ -508,7 +508,17 @@ function showNewMailNotification({ title, body, count } = {}) { }); notification.on('click', () => { - showMainWindow({ reload: true }); + if (messageId) { + sendNativeAction('open-message', { + messageId, + accountId, + folder, + message, + }); + return; + } + + showMainWindow(); }); notification.show(); @@ -785,8 +795,9 @@ function parseNativeActionArg(args = []) { return null; } -function createNativeActionPayload(action) { +function createNativeActionPayload(action, data = {}) { const payload = { + ...data, id: nextNativeActionId, action, createdAt: Date.now(), @@ -796,10 +807,10 @@ function createNativeActionPayload(action) { return payload; } -function sendNativeAction(action) { +function sendNativeAction(action, data = {}) { if (!action) return; - const payload = createNativeActionPayload(action); + const payload = createNativeActionPayload(action, data); showMainWindow(); const dispatchScript = ` diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index d6989eb0..5891ae3a 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -5,6 +5,9 @@ import { api } from '../utils/api.js'; export default function ElectronNotificationBridge() { const addNotification = useStore(state => state.addNotification); const openCompose = useStore(state => state.openCompose); + const setSelectedAccount = useStore(state => state.setSelectedAccount); + const setSelectedMessage = useStore(state => state.setSelectedMessage); + const setSearchQuery = useStore(state => state.setSearchQuery); const totalUnread = useStore(state => state.unreadCounts.total); const lastActionRef = useRef({ action: null, time: 0 }); const processedActionIdsRef = useRef(new Set()); @@ -32,6 +35,9 @@ export default function ElectronNotificationBridge() { body: notification.body, count: notification.count, accountId: notification.accountId, + folder: notification.folder, + messageId: notification.messageId, + message: notification.message, }).catch(() => {}); }; @@ -124,6 +130,30 @@ export default function ElectronNotificationBridge() { return; } + if (action === 'open-message') { + const messageId = payload?.messageId; + if (!messageId) return; + + const folder = payload.folder || 'INBOX'; + const message = payload.message; + const state = useStore.getState(); + + setSearchQuery(''); + if (payload.accountId) { + setSelectedAccount(payload.accountId, folder); + } + + if (message && !state.messages.some((item) => item.id === message.id)) { + useStore.setState((current) => ({ + messages: [{ ...message, account_id: message.account_id || payload.accountId }, ...current.messages], + })); + } + + window.dispatchEvent(new CustomEvent('mailflow:refresh')); + window.setTimeout(() => setSelectedMessage(messageId), 0); + return; + } + if (action === 'sync') { try { addNotification({ @@ -174,7 +204,7 @@ export default function ElectronNotificationBridge() { window.removeEventListener('message', handleNativeMessage); if (typeof unsubscribe === 'function') unsubscribe(); }; - }, [addNotification, openCompose]); + }, [addNotification, openCompose, setSearchQuery, setSelectedAccount, setSelectedMessage]); return null; } diff --git a/frontend/src/hooks/useWebSocket.js b/frontend/src/hooks/useWebSocket.js index 04933e09..5216c4b0 100644 --- a/frontend/src/hooks/useWebSocket.js +++ b/frontend/src/hooks/useWebSocket.js @@ -120,10 +120,13 @@ export function useWebSocket() { // New-mail alerts are inbox-only — non-inbox folder syncs (Archive, // Spam, on-demand syncs) should not trigger alerts for old mail. if (isInbox) { - const latest = messages[0]; + const latest = messages[messages.length - 1]; const notification = { type: 'new_mail', accountId, + folder: folder || 'INBOX', + messageId: latest.id, + message: latest, title: latest.fromName || latest.fromEmail || t('notifications.newMessage'), body: latest.subject || t('common.noSubject'), count, From e96b3089fab394c82d6e7bcad9c19c3a47662587 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 00:18:32 -0300 Subject: [PATCH 60/90] feat add os default handlers --- frontend/package.json | 8 ++ frontend/packages/electron/main.cjs | 105 ++++++++++++++++++ .../components/ElectronNotificationBridge.jsx | 2 +- 3 files changed, 114 insertions(+), 1 deletion(-) diff --git a/frontend/package.json b/frontend/package.json index b6f30a35..2ab74ffe 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -46,6 +46,14 @@ "buildResources": "packages/electron/icons" }, "icon": "icon", + "protocols": [ + { + "name": "MailFlow email link", + "schemes": [ + "mailto" + ] + } + ], "files": [ "packages/electron/**/*", "packages/native-shell/**/*", diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 3bc14568..942b7332 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -11,6 +11,7 @@ const UPDATE_ERROR_MESSAGE = 'Could not check for MailFlow updates. Please visit const NATIVE_ACTION_CHANNEL = 'mailflow:native-action'; const NATIVE_ACTION_ARG = '--mailflow-action='; const NEW_MAIL_NOTIFICATION_MAX_LENGTH = 240; +const MAILTO_PROTOCOL = 'mailto'; const LINUX_BADGE_DESKTOP_IDS = [ 'MailFlow.desktop', 'mailflow.desktop', @@ -26,6 +27,7 @@ let downloadedUpdate = null; let updateDownloadsInitialized = false; let nextNativeActionId = 1; const pendingNativeActions = new Map(); +const pendingProtocolUrls = []; app.setName('MailFlow'); if (process.platform === 'win32') { @@ -39,6 +41,19 @@ if (process.platform === 'linux' && process.env.APPIMAGE) { app.commandLine.appendSwitch('no-sandbox'); } +function registerMailtoProtocol() { + try { + if (process.defaultApp && process.argv.length >= 2) { + return app.setAsDefaultProtocolClient(MAILTO_PROTOCOL, process.execPath, [path.resolve(process.argv[1])]); + } + + return app.setAsDefaultProtocolClient(MAILTO_PROTOCOL); + } catch (error) { + console.error('Could not register mailto protocol handler:', error); + return false; + } +} + function getIconPath() { return path.join(__dirname, 'icons', 'icon.png'); } @@ -786,6 +801,76 @@ function openDownloadedUpdatePath() { shell.showItemInFolder(downloadedUpdate); } +function isMailtoUrl(value) { + return /^mailto:/i.test(String(value || '').trim()); +} + +function parseProtocolUrlArg(args = []) { + return args.find(isMailtoUrl) || null; +} + +function splitMailtoAddresses(value) { + return String(value || '') + .split(',') + .map((item) => item.trim()) + .filter(Boolean); +} + +function appendMailtoAddresses(target, value) { + target.push(...splitMailtoAddresses(value)); +} + +function parseMailtoUrl(url) { + const input = String(url || '').trim(); + if (!isMailtoUrl(input)) return null; + + try { + const parsed = new URL(input); + const composeData = { + to: [], + cc: [], + bcc: [], + subject: '', + body: '', + }; + + appendMailtoAddresses(composeData.to, decodeURIComponent(parsed.pathname || '')); + + for (const [key, value] of parsed.searchParams.entries()) { + const normalizedKey = key.toLowerCase(); + + if (normalizedKey === 'to') appendMailtoAddresses(composeData.to, value); + else if (normalizedKey === 'cc') appendMailtoAddresses(composeData.cc, value); + else if (normalizedKey === 'bcc') appendMailtoAddresses(composeData.bcc, value); + else if (normalizedKey === 'subject') composeData.subject = value; + else if (normalizedKey === 'body') composeData.body = value; + } + + composeData.to = [...new Set(composeData.to)]; + composeData.cc = [...new Set(composeData.cc)]; + composeData.bcc = [...new Set(composeData.bcc)]; + + return composeData; + } catch (error) { + console.error('Could not parse mailto URL:', error); + return null; + } +} + +function sendMailtoAction(url) { + const composeData = parseMailtoUrl(url); + if (!composeData) return false; + + sendNativeAction('new-mail', { composeData, source: 'mailto' }); + return true; +} + +function flushPendingProtocolUrls() { + while (pendingProtocolUrls.length > 0) { + sendMailtoAction(pendingProtocolUrls.shift()); + } +} + function parseNativeActionArg(args = []) { const actionArg = args.find((arg) => String(arg).startsWith(NATIVE_ACTION_ARG)); if (!actionArg) return null; @@ -1306,6 +1391,7 @@ if (!gotSingleInstanceLock) { app.quit(); } else { app.whenReady().then(() => { + registerMailtoProtocol(); setupMenu(); setupDockMenu(); setupTaskbarTasks(); @@ -1313,6 +1399,8 @@ if (!gotSingleInstanceLock) { createWindow(); scheduleStartupUpdateCheck(); sendNativeAction(parseNativeActionArg(process.argv)); + sendMailtoAction(parseProtocolUrlArg(process.argv)); + flushPendingProtocolUrls(); app.on('activate', () => { showMainWindow(); @@ -1320,6 +1408,12 @@ if (!gotSingleInstanceLock) { }); app.on('second-instance', (_event, args) => { + const mailtoUrl = parseProtocolUrlArg(args); + if (mailtoUrl) { + sendMailtoAction(mailtoUrl); + return; + } + showMainWindow(); sendNativeAction(parseNativeActionArg(args)); }); @@ -1329,6 +1423,17 @@ app.on('before-quit', () => { isQuitting = true; }); +app.on('open-url', (event, url) => { + event.preventDefault(); + + if (mainWindow) { + sendMailtoAction(url); + return; + } + + pendingProtocolUrls.push(url); +}); + app.on('window-all-closed', () => { if (process.platform !== 'darwin') app.quit(); }); diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index 5891ae3a..aee65c42 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -126,7 +126,7 @@ export default function ElectronNotificationBridge() { try { if (action === 'new-mail') { - openCompose({}); + openCompose(payload?.composeData || {}); return; } From e3c2ed714cbebd261b7b886481b7e5d574221210 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 00:57:53 -0300 Subject: [PATCH 61/90] fix windows default mail handler --- frontend/package.json | 3 ++ frontend/packages/electron/installer.nsh | 19 ++++++++++++ frontend/packages/electron/main.cjs | 39 ++++++++++++++++++++++-- 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 frontend/packages/electron/installer.nsh diff --git a/frontend/package.json b/frontend/package.json index 2ab74ffe..5ed9d122 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -66,6 +66,9 @@ "nsis" ] }, + "nsis": { + "include": "packages/electron/installer.nsh" + }, "mac": { "artifactName": "${productName}-${version}-Universal.${ext}", "target": [ diff --git a/frontend/packages/electron/installer.nsh b/frontend/packages/electron/installer.nsh new file mode 100644 index 00000000..1413b636 --- /dev/null +++ b/frontend/packages/electron/installer.nsh @@ -0,0 +1,19 @@ +!macro customInstall + WriteRegStr SHCTX "Software\RegisteredApplications" "MailFlow" "Software\Clients\Mail\MailFlow\Capabilities" + + WriteRegStr SHCTX "Software\Clients\Mail\MailFlow" "" "MailFlow" + WriteRegStr SHCTX "Software\Clients\Mail\MailFlow\Capabilities" "ApplicationName" "MailFlow" + WriteRegStr SHCTX "Software\Clients\Mail\MailFlow\Capabilities" "ApplicationDescription" "A self-hosted, unified webmail client." + WriteRegStr SHCTX "Software\Clients\Mail\MailFlow\Capabilities\URLAssociations" "mailto" "MailFlow.mailto" + + WriteRegStr SHCTX "Software\Classes\MailFlow.mailto" "" "URL:MailFlow MailTo Protocol" + WriteRegStr SHCTX "Software\Classes\MailFlow.mailto" "URL Protocol" "" + WriteRegStr SHCTX "Software\Classes\MailFlow.mailto\DefaultIcon" "" "$INSTDIR\MailFlow.exe,0" + WriteRegStr SHCTX "Software\Classes\MailFlow.mailto\shell\open\command" "" '"$INSTDIR\MailFlow.exe" "%1"' +!macroend + +!macro customUnInstall + DeleteRegValue SHCTX "Software\RegisteredApplications" "MailFlow" + DeleteRegKey SHCTX "Software\Clients\Mail\MailFlow" + DeleteRegKey SHCTX "Software\Classes\MailFlow.mailto" +!macroend diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 942b7332..a9ad0a20 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -44,16 +44,51 @@ if (process.platform === 'linux' && process.env.APPIMAGE) { function registerMailtoProtocol() { try { if (process.defaultApp && process.argv.length >= 2) { - return app.setAsDefaultProtocolClient(MAILTO_PROTOCOL, process.execPath, [path.resolve(process.argv[1])]); + const registered = app.setAsDefaultProtocolClient(MAILTO_PROTOCOL, process.execPath, [path.resolve(process.argv[1])]); + registerWindowsMailtoCapabilities(); + return registered; } - return app.setAsDefaultProtocolClient(MAILTO_PROTOCOL); + const registered = app.setAsDefaultProtocolClient(MAILTO_PROTOCOL); + registerWindowsMailtoCapabilities(); + return registered; } catch (error) { console.error('Could not register mailto protocol handler:', error); return false; } } +function writeCurrentUserRegValue(key, name, value) { + const args = ['add', key, name ? '/v' : '/ve']; + if (name) args.push(name); + args.push('/t', 'REG_SZ', '/d', value, '/f'); + execFileSync('reg', args, { stdio: 'ignore', windowsHide: true }); +} + +function registerWindowsMailtoCapabilities() { + if (process.platform !== 'win32') return false; + + try { + const exePath = process.execPath; + const command = `"${exePath}" "%1"`; + + writeCurrentUserRegValue('HKCU\\Software\\RegisteredApplications', 'MailFlow', 'Software\\Clients\\Mail\\MailFlow\\Capabilities'); + writeCurrentUserRegValue('HKCU\\Software\\Clients\\Mail\\MailFlow', '', 'MailFlow'); + writeCurrentUserRegValue('HKCU\\Software\\Clients\\Mail\\MailFlow\\Capabilities', 'ApplicationName', 'MailFlow'); + writeCurrentUserRegValue('HKCU\\Software\\Clients\\Mail\\MailFlow\\Capabilities', 'ApplicationDescription', 'A self-hosted, unified webmail client.'); + writeCurrentUserRegValue('HKCU\\Software\\Clients\\Mail\\MailFlow\\Capabilities\\URLAssociations', 'mailto', 'MailFlow.mailto'); + writeCurrentUserRegValue('HKCU\\Software\\Classes\\MailFlow.mailto', '', 'URL:MailFlow MailTo Protocol'); + writeCurrentUserRegValue('HKCU\\Software\\Classes\\MailFlow.mailto', 'URL Protocol', ''); + writeCurrentUserRegValue('HKCU\\Software\\Classes\\MailFlow.mailto\\DefaultIcon', '', `${exePath},0`); + writeCurrentUserRegValue('HKCU\\Software\\Classes\\MailFlow.mailto\\shell\\open\\command', '', command); + + return true; + } catch (error) { + console.error('Could not register Windows mailto capabilities:', error); + return false; + } +} + function getIconPath() { return path.join(__dirname, 'icons', 'icon.png'); } From fd737223dd080a5ff1b7cc910caff226b0a42dde Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 01:12:40 -0300 Subject: [PATCH 62/90] rewrite host unavailable error page to branded page --- frontend/packages/electron/main.cjs | 34 +++++++ .../native-shell/host-unavailable.html | 96 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 frontend/packages/native-shell/host-unavailable.html diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index a9ad0a20..e9ac422f 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -12,6 +12,10 @@ const NATIVE_ACTION_CHANNEL = 'mailflow:native-action'; const NATIVE_ACTION_ARG = '--mailflow-action='; const NEW_MAIL_NOTIFICATION_MAX_LENGTH = 240; const MAILTO_PROTOCOL = 'mailto'; +const REWRITE_ERROR_PATTERNS = [ + /Rewrite\s+502\s+Bad\s+Gateway\s+Page/i, + /Rewrite\s+404\s+Error\s+Page/i, +]; const LINUX_BADGE_DESKTOP_IDS = [ 'MailFlow.desktop', 'mailflow.desktop', @@ -1322,6 +1326,17 @@ function createWindow() { return { action: 'deny' }; }); + mainWindow.webContents.on('did-fail-load', (_event, _errorCode, _errorDescription, validatedURL, isMainFrame) => { + if (!isMainFrame) return; + const host = readHost(); + if (!host || !String(validatedURL || '').startsWith(host)) return; + loadHostUnavailable(); + }); + + mainWindow.webContents.on('did-finish-load', () => { + detectRewriteErrorPage(); + }); + mainWindow.on('close', (event) => { if (!isQuitting && tray) { event.preventDefault(); @@ -1356,6 +1371,25 @@ function loadSetup() { mainWindow.loadFile(path.join(__dirname, '..', 'native-shell', 'index.html')); } +function loadHostUnavailable() { + if (!mainWindow || mainWindow.isDestroyed()) return; + mainWindow.loadFile(path.join(__dirname, '..', 'native-shell', 'host-unavailable.html')); +} + +function detectRewriteErrorPage() { + if (!mainWindow || mainWindow.isDestroyed()) return; + const currentUrl = mainWindow.webContents.getURL(); + const host = readHost(); + if (!host || !currentUrl.startsWith(host)) return; + + mainWindow.webContents.executeJavaScript('document.body ? document.body.innerText : ""', true) + .then((text) => { + if (!REWRITE_ERROR_PATTERNS.some((pattern) => pattern.test(String(text || '')))) return; + loadHostUnavailable(); + }) + .catch(() => {}); +} + function scheduleStartupUpdateCheck() { if (!mainWindow || mainWindow.isDestroyed()) return; if (!readHost()) return; diff --git a/frontend/packages/native-shell/host-unavailable.html b/frontend/packages/native-shell/host-unavailable.html new file mode 100644 index 00000000..e2035f9d --- /dev/null +++ b/frontend/packages/native-shell/host-unavailable.html @@ -0,0 +1,96 @@ + + + + + + MailFlow Host Unavailable + + + +
    + MailFlow +

    Host is not available

    +

    MailFlow could not reach the configured server. Check the host address or choose a different MailFlow server.

    + +
    + + + + From 277ba0fd810e5e946936b74867e6a80f259fe04b Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 01:27:30 -0300 Subject: [PATCH 63/90] expand branded host unavailable page catcher --- frontend/packages/electron/main.cjs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index e9ac422f..7f68eea3 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -16,6 +16,7 @@ const REWRITE_ERROR_PATTERNS = [ /Rewrite\s+502\s+Bad\s+Gateway\s+Page/i, /Rewrite\s+404\s+Error\s+Page/i, ]; +const HOST_UNAVAILABLE_STATUS_CODES = new Set([404, 502, 503, 504]); const LINUX_BADGE_DESKTOP_IDS = [ 'MailFlow.desktop', 'mailflow.desktop', @@ -1333,6 +1334,18 @@ function createWindow() { loadHostUnavailable(); }); + mainWindow.webContents.session.webRequest.onCompleted((details) => { + if (!mainWindow || mainWindow.isDestroyed()) return; + if (details.webContentsId !== mainWindow.webContents.id) return; + if (details.resourceType !== 'mainFrame') return; + if (!HOST_UNAVAILABLE_STATUS_CODES.has(details.statusCode)) return; + + const host = readHost(); + if (!host || !String(details.url || '').startsWith(host)) return; + + setTimeout(() => loadHostUnavailable(), 0); + }); + mainWindow.webContents.on('did-finish-load', () => { detectRewriteErrorPage(); }); From 3af2df879b68f1e93e5aa62679242dd821fcd78a Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 01:51:01 -0300 Subject: [PATCH 64/90] implementing android --- frontend/packages/android/app/build.gradle | 1 + .../android/app/src/main/AndroidManifest.xml | 14 + .../sh/mailflow/app/MailFlowNativePlugin.java | 330 ++++++++++++++++++ .../mailflow/app/MailFlowWebViewClient.java | 68 ++++ .../java/sh/mailflow/app/MainActivity.java | 38 +- .../native-shell/host-unavailable.html | 10 + frontend/packages/native-shell/index.html | 19 + .../packages/scripts/prepare-native-shell.cjs | 10 +- .../components/ElectronNotificationBridge.jsx | 7 + frontend/src/utils/capacitorNativeBridge.js | 50 +++ 10 files changed, 545 insertions(+), 2 deletions(-) create mode 100644 frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java create mode 100644 frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java create mode 100644 frontend/src/utils/capacitorNativeBridge.js diff --git a/frontend/packages/android/app/build.gradle b/frontend/packages/android/app/build.gradle index 35e00626..c52a1082 100644 --- a/frontend/packages/android/app/build.gradle +++ b/frontend/packages/android/app/build.gradle @@ -34,6 +34,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" + implementation "androidx.core:core:$androidxCoreVersion" implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" implementation project(':capacitor-android') testImplementation "junit:junit:$junitVersion" diff --git a/frontend/packages/android/app/src/main/AndroidManifest.xml b/frontend/packages/android/app/src/main/AndroidManifest.xml index de737252..ab940968 100644 --- a/frontend/packages/android/app/src/main/AndroidManifest.xml +++ b/frontend/packages/android/app/src/main/AndroidManifest.xml @@ -23,6 +23,19 @@ + + + + + + + + + + + + + + diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java new file mode 100644 index 00000000..f961e1ce --- /dev/null +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -0,0 +1,330 @@ +package sh.mailflow.app; + +import android.Manifest; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import androidx.core.app.ActivityCompat; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; +import androidx.core.content.ContextCompat; +import com.getcapacitor.JSArray; +import com.getcapacitor.JSObject; +import com.getcapacitor.Plugin; +import com.getcapacitor.PluginCall; +import com.getcapacitor.PluginMethod; +import com.getcapacitor.annotation.CapacitorPlugin; +import java.net.URI; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import org.json.JSONException; + +@CapacitorPlugin(name = "MailFlowNative") +public class MailFlowNativePlugin extends Plugin { + static final String ACTION_OPEN_MESSAGE = "sh.mailflow.app.OPEN_MESSAGE"; + private static final String CHANNEL_NEW_MAIL = "mailflow_new_mail"; + private static final String PREFS_NAME = "mailflow-native"; + private static final String PREF_HOST = "host"; + private static final String SETUP_URL = "file:///android_asset/public/index.html"; + + private static final List pendingActions = new ArrayList<>(); + private static MailFlowNativePlugin instance; + + @Override + public void load() { + instance = this; + createNotificationChannel(getContext()); + } + + @PluginMethod + public void getHost(PluginCall call) { + JSObject result = new JSObject(); + result.put("host", getSavedHost(getContext())); + call.resolve(result); + } + + @PluginMethod + public void saveHost(PluginCall call) { + String host = call.getString("host", ""); + String normalizedHost = normalizeHost(host); + + if (normalizedHost == null) { + call.reject("Host must start with https:// or http://"); + return; + } + + getPrefs(getContext()).edit().putString(PREF_HOST, normalizedHost).apply(); + + JSObject result = new JSObject(); + result.put("host", normalizedHost); + call.resolve(result); + } + + @PluginMethod + public void resetHost(PluginCall call) { + getPrefs(getContext()).edit().remove(PREF_HOST).apply(); + getActivity().runOnUiThread(() -> getBridge().getWebView().loadUrl(SETUP_URL)); + call.resolve(); + } + + @PluginMethod + public void setUnreadCount(PluginCall call) { + call.resolve(); + } + + @PluginMethod + public void requestNotificationPermission(PluginCall call) { + requestNotificationPermissionIfNeeded(); + call.resolve(); + } + + @PluginMethod + public void showNewMail(PluginCall call) { + requestNotificationPermissionIfNeeded(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && ContextCompat.checkSelfPermission( + getContext(), + Manifest.permission.POST_NOTIFICATIONS + ) != PackageManager.PERMISSION_GRANTED) { + call.resolve(); + return; + } + + String title = call.getString("title", "New mail"); + String body = call.getString("body", "You have new mail."); + String messageId = call.getString("messageId", null); + String accountId = call.getString("accountId", null); + String folder = call.getString("folder", "INBOX"); + JSObject message = call.getObject("message"); + + Intent intent = new Intent(getContext(), MainActivity.class); + intent.setAction(ACTION_OPEN_MESSAGE); + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); + putExtra(intent, "messageId", messageId); + putExtra(intent, "accountId", accountId); + putExtra(intent, "folder", folder); + if (message != null) putExtra(intent, "message", message.toString()); + + int notificationId = Math.abs(UUID.randomUUID().hashCode()); + PendingIntent pendingIntent = PendingIntent.getActivity( + getContext(), + notificationId, + intent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE + ); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext(), CHANNEL_NEW_MAIL) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle(title) + .setContentText(body) + .setStyle(new NotificationCompat.BigTextStyle().bigText(body)) + .setContentIntent(pendingIntent) + .setAutoCancel(true) + .setPriority(NotificationCompat.PRIORITY_DEFAULT); + + NotificationManagerCompat.from(getContext()).notify(notificationId, builder.build()); + call.resolve(); + } + + @PluginMethod + public void getPendingActions(PluginCall call) { + JSObject result = new JSObject(); + synchronized (pendingActions) { + result.put("actions", new JSArray(new ArrayList<>(pendingActions))); + } + call.resolve(result); + } + + @PluginMethod + public void ackAction(PluginCall call) { + String id = call.getString("id", null); + if (id != null) { + synchronized (pendingActions) { + pendingActions.removeIf((action) -> id.equals(action.getString("id"))); + } + } + call.resolve(); + } + + static String getSavedHost(Context context) { + return getPrefs(context).getString(PREF_HOST, null); + } + + static void sendOpenMessageAction(Intent intent) { + JSObject action = newAction("open-message"); + copyStringExtra(intent, action, "messageId"); + copyStringExtra(intent, action, "accountId"); + copyStringExtra(intent, action, "folder"); + + String messageJson = intent.getStringExtra("message"); + if (messageJson != null) { + try { + action.put("message", new JSObject(messageJson)); + } catch (JSONException ignored) {} + } + + dispatchAction(action); + } + + static void sendMailtoAction(Uri uri) { + JSObject composeData = parseMailto(uri); + if (composeData == null) return; + + JSObject action = newAction("new-mail"); + action.put("composeData", composeData); + action.put("source", "mailto"); + dispatchAction(action); + } + + private static void dispatchAction(JSObject action) { + synchronized (pendingActions) { + pendingActions.add(action); + } + + if (instance != null) { + instance.notifyListeners("nativeAction", action, true); + } + } + + private static JSObject newAction(String actionName) { + JSObject action = new JSObject(); + action.put("id", UUID.randomUUID().toString()); + action.put("action", actionName); + return action; + } + + private static JSObject parseMailto(Uri uri) { + if (uri == null || !"mailto".equalsIgnoreCase(uri.getScheme())) return null; + + String schemeSpecificPart = uri.getEncodedSchemeSpecificPart(); + String[] parts = (schemeSpecificPart == null ? "" : schemeSpecificPart).split("\\?", 2); + String addressPart = parts.length > 0 ? parts[0] : ""; + String queryPart = parts.length > 1 ? parts[1] : ""; + + JSObject composeData = new JSObject(); + composeData.put("to", new JSArray(unique(splitAddresses(decodePath(addressPart))))); + composeData.put("cc", new JSArray()); + composeData.put("bcc", new JSArray()); + composeData.put("subject", ""); + composeData.put("body", ""); + + for (String pair : queryPart.split("&")) { + if (pair.isEmpty()) continue; + + String[] queryParts = pair.split("=", 2); + String normalizedName = decodeQuery(queryParts[0]).toLowerCase(); + String value = queryParts.length > 1 ? decodeQuery(queryParts[1]) : ""; + + if ("to".equals(normalizedName)) { + composeData.put("to", new JSArray(unique(merge(composeData.optJSONArray("to"), splitAddresses(value))))); + } else if ("cc".equals(normalizedName)) { + composeData.put("cc", new JSArray(unique(splitAddresses(value)))); + } else if ("bcc".equals(normalizedName)) { + composeData.put("bcc", new JSArray(unique(splitAddresses(value)))); + } else if ("subject".equals(normalizedName)) { + composeData.put("subject", value); + } else if ("body".equals(normalizedName)) { + composeData.put("body", value); + } + } + + return composeData; + } + + private static List splitAddresses(String value) { + List addresses = new ArrayList<>(); + if (value == null) return addresses; + for (String item : value.split(",")) { + String address = item.trim(); + if (!address.isEmpty()) addresses.add(address); + } + return addresses; + } + + private static List merge(org.json.JSONArray current, List next) { + List merged = new ArrayList<>(); + if (current != null) { + for (int i = 0; i < current.length(); i++) { + String value = current.optString(i, ""); + if (!value.isEmpty()) merged.add(value); + } + } + merged.addAll(next); + return merged; + } + + private static List unique(List values) { + Set set = new LinkedHashSet<>(values); + return new ArrayList<>(set); + } + + private static String decodePath(String value) { + return decodeQuery((value == null ? "" : value).replace("+", "%2B")); + } + + private static String decodeQuery(String value) { + try { + return URLDecoder.decode(value == null ? "" : value, "UTF-8"); + } catch (Exception ignored) { + return value == null ? "" : value; + } + } + + private static String normalizeHost(String host) { + try { + URI uri = new URI(host.trim()); + String scheme = uri.getScheme(); + if (!"http".equalsIgnoreCase(scheme) && !"https".equalsIgnoreCase(scheme)) return null; + if (uri.getHost() == null) return null; + + return new URI(scheme.toLowerCase(), null, uri.getHost(), uri.getPort(), null, null, null).toString(); + } catch (Exception ignored) { + return null; + } + } + + private static SharedPreferences getPrefs(Context context) { + return context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); + } + + private static void createNotificationChannel(Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return; + + NotificationChannel channel = new NotificationChannel( + CHANNEL_NEW_MAIL, + "New mail", + NotificationManager.IMPORTANCE_DEFAULT + ); + channel.setDescription("New mail notifications from MailFlow."); + NotificationManager manager = context.getSystemService(NotificationManager.class); + if (manager != null) manager.createNotificationChannel(channel); + } + + private void requestNotificationPermissionIfNeeded() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && ContextCompat.checkSelfPermission( + getContext(), + Manifest.permission.POST_NOTIFICATIONS + ) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(getActivity(), new String[] { Manifest.permission.POST_NOTIFICATIONS }, 4901); + } + } + + private static void putExtra(Intent intent, String key, String value) { + if (value != null) intent.putExtra(key, value); + } + + private static void copyStringExtra(Intent intent, JSObject target, String key) { + String value = intent.getStringExtra(key); + if (value != null) target.put(key, value); + } +} diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java new file mode 100644 index 00000000..3c0d4128 --- /dev/null +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java @@ -0,0 +1,68 @@ +package sh.mailflow.app; + +import android.content.Context; +import android.webkit.WebResourceError; +import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; +import android.webkit.WebView; +import com.getcapacitor.Bridge; +import com.getcapacitor.BridgeWebViewClient; + +public class MailFlowWebViewClient extends BridgeWebViewClient { + private static final String FALLBACK_URL = "file:///android_asset/public/host-unavailable.html"; + private final Context context; + private boolean loadingFallback = false; + + public MailFlowWebViewClient(Bridge bridge, Context context) { + super(bridge); + this.context = context.getApplicationContext(); + } + + @Override + public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { + super.onReceivedHttpError(view, request, errorResponse); + + if (!request.isForMainFrame() || errorResponse == null) return; + int statusCode = errorResponse.getStatusCode(); + if ((statusCode == 404 || statusCode == 502 || statusCode == 503 || statusCode == 504) && isConfiguredHost(request.getUrl().toString())) { + loadFallback(view); + } + } + + @Override + public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + super.onReceivedError(view, request, error); + + if (request.isForMainFrame() && isConfiguredHost(request.getUrl().toString())) { + loadFallback(view); + } + } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + + if (FALLBACK_URL.equals(url)) return; + loadingFallback = false; + + if (!isConfiguredHost(url)) return; + + view.evaluateJavascript("(document.body ? document.body.innerText : '')", (text) -> { + String bodyText = text == null ? "" : text.toLowerCase(); + if (bodyText.contains("rewrite 502 bad gateway page") || bodyText.contains("rewrite 404 error page")) { + loadFallback(view); + } + }); + } + + private boolean isConfiguredHost(String url) { + String host = MailFlowNativePlugin.getSavedHost(context); + return host != null && url != null && url.startsWith(host); + } + + private void loadFallback(WebView view) { + if (loadingFallback) return; + loadingFallback = true; + view.post(() -> view.loadUrl(FALLBACK_URL)); + } +} diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java index 4e5d95aa..06ee19ef 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java @@ -1,5 +1,41 @@ package sh.mailflow.app; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; import com.getcapacitor.BridgeActivity; -public class MainActivity extends BridgeActivity {} +public class MainActivity extends BridgeActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + registerPlugin(MailFlowNativePlugin.class); + super.onCreate(savedInstanceState); + + if (bridge != null) { + bridge.setWebViewClient(new MailFlowWebViewClient(bridge, this)); + } + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + handleNativeIntent(intent); + } + + private void handleNativeIntent(Intent intent) { + if (intent == null) return; + + String action = intent.getAction(); + Uri data = intent.getData(); + + if (MailFlowNativePlugin.ACTION_OPEN_MESSAGE.equals(action)) { + MailFlowNativePlugin.sendOpenMessageAction(intent); + return; + } + + if ((Intent.ACTION_SENDTO.equals(action) || Intent.ACTION_VIEW.equals(action)) && data != null && "mailto".equalsIgnoreCase(data.getScheme())) { + MailFlowNativePlugin.sendMailtoAction(data); + } + } +} diff --git a/frontend/packages/native-shell/host-unavailable.html b/frontend/packages/native-shell/host-unavailable.html index e2035f9d..9eba9a46 100644 --- a/frontend/packages/native-shell/host-unavailable.html +++ b/frontend/packages/native-shell/host-unavailable.html @@ -82,10 +82,20 @@

    Host is not available

    From ae2b927b94157c4557d800652a790ac1a830e28d Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 17:45:58 -0300 Subject: [PATCH 69/90] enable android permission prompt --- .../sh/mailflow/app/MailFlowNativePlugin.java | 56 ++++++++++++++++--- frontend/src/hooks/usePushNotifications.js | 7 ++- frontend/src/utils/capacitorNativeBridge.js | 9 ++- 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index f961e1ce..bf8c88af 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -16,6 +16,9 @@ import androidx.core.content.ContextCompat; import com.getcapacitor.JSArray; import com.getcapacitor.JSObject; +import com.getcapacitor.PermissionState; +import com.getcapacitor.annotation.Permission; +import com.getcapacitor.annotation.PermissionCallback; import com.getcapacitor.Plugin; import com.getcapacitor.PluginCall; import com.getcapacitor.PluginMethod; @@ -29,7 +32,12 @@ import java.util.UUID; import org.json.JSONException; -@CapacitorPlugin(name = "MailFlowNative") +@CapacitorPlugin( + name = "MailFlowNative", + permissions = { + @Permission(alias = "notifications", strings = { Manifest.permission.POST_NOTIFICATIONS }) + } +) public class MailFlowNativePlugin extends Plugin { static final String ACTION_OPEN_MESSAGE = "sh.mailflow.app.OPEN_MESSAGE"; private static final String CHANNEL_NEW_MAIL = "mailflow_new_mail"; @@ -84,8 +92,17 @@ public void setUnreadCount(PluginCall call) { @PluginMethod public void requestNotificationPermission(PluginCall call) { - requestNotificationPermissionIfNeeded(); - call.resolve(); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || hasNotificationPermission()) { + call.resolve(notificationPermissionResult("granted")); + return; + } + + requestPermissionForAlias("notifications", call, "notificationPermissionCallback"); + } + + @PluginMethod + public void checkNotificationPermission(PluginCall call) { + call.resolve(notificationPermissionResult(getNotificationPermissionState())); } @PluginMethod @@ -311,14 +328,39 @@ private static void createNotificationChannel(Context context) { } private void requestNotificationPermissionIfNeeded() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && ContextCompat.checkSelfPermission( - getContext(), - Manifest.permission.POST_NOTIFICATIONS - ) != PackageManager.PERMISSION_GRANTED) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !hasNotificationPermission()) { ActivityCompat.requestPermissions(getActivity(), new String[] { Manifest.permission.POST_NOTIFICATIONS }, 4901); } } + @PermissionCallback + private void notificationPermissionCallback(PluginCall call) { + call.resolve(notificationPermissionResult(getNotificationPermissionState())); + } + + private boolean hasNotificationPermission() { + return ContextCompat.checkSelfPermission( + getContext(), + Manifest.permission.POST_NOTIFICATIONS + ) == PackageManager.PERMISSION_GRANTED; + } + + private String getNotificationPermissionState() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || hasNotificationPermission()) { + return "granted"; + } + + PermissionState state = getPermissionState("notifications"); + if (state == PermissionState.DENIED) return "denied"; + return "default"; + } + + private JSObject notificationPermissionResult(String permission) { + JSObject result = new JSObject(); + result.put("permission", permission); + return result; + } + private static void putExtra(Intent intent, String key, String value) { if (value != null) intent.putExtra(key, value); } diff --git a/frontend/src/hooks/usePushNotifications.js b/frontend/src/hooks/usePushNotifications.js index 7ea98f43..2f3f675a 100644 --- a/frontend/src/hooks/usePushNotifications.js +++ b/frontend/src/hooks/usePushNotifications.js @@ -42,6 +42,9 @@ export function usePushNotifications() { if (!ok) return; setPermission(Notification.permission); + window.mailflowNative?.notifications?.checkPermission?.() + .then((nativePermission) => setPermission(nativePermission || Notification.permission)) + .catch(() => {}); // Check whether the backend has VAPID keys configured before the user // tries to subscribe — lets us show a clear error instead of a cryptic 503. @@ -69,7 +72,9 @@ export function usePushNotifications() { const subscribe = async () => { setLoading(true); try { - const perm = await Notification.requestPermission(); + const perm = window.mailflowNative?.notifications?.requestPermission + ? await window.mailflowNative.notifications.requestPermission() + : await Notification.requestPermission(); setPermission(perm); if (perm !== 'granted') return false; diff --git a/frontend/src/utils/capacitorNativeBridge.js b/frontend/src/utils/capacitorNativeBridge.js index dca46c8d..61b15416 100644 --- a/frontend/src/utils/capacitorNativeBridge.js +++ b/frontend/src/utils/capacitorNativeBridge.js @@ -28,7 +28,14 @@ export function installCapacitorNativeBridge() { setUnreadCount: async (count) => MailFlowNative.setUnreadCount({ count }), }, notifications: { - requestPermission: async () => MailFlowNative.requestNotificationPermission(), + checkPermission: async () => { + const result = await MailFlowNative.checkNotificationPermission(); + return result?.permission || 'default'; + }, + requestPermission: async () => { + const result = await MailFlowNative.requestNotificationPermission(); + return result?.permission || 'default'; + }, showNewMail: async (notification) => MailFlowNative.showNewMail(notification || {}), }, actions: { From 9556632b7603302ac61fbf1ee5e98dc2f333145b Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 17:48:23 -0300 Subject: [PATCH 70/90] update android mail handler intent --- .../main/java/sh/mailflow/app/MainActivity.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java index 74be0a7d..ea941b69 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java @@ -6,6 +6,8 @@ import com.getcapacitor.BridgeActivity; public class MainActivity extends BridgeActivity { + private String lastHandledIntentKey = null; + @Override protected void onCreate(Bundle savedInstanceState) { registerPlugin(MailFlowNativePlugin.class); @@ -18,6 +20,8 @@ protected void onCreate(Bundle savedInstanceState) { bridge.getWebView().post(() -> bridge.getWebView().loadUrl(savedHost)); } } + + handleNativeIntent(getIntent()); } @Override @@ -29,6 +33,7 @@ protected void onNewIntent(Intent intent) { private void handleNativeIntent(Intent intent) { if (intent == null) return; + if (!markIntentHandled(intent)) return; String action = intent.getAction(); Uri data = intent.getData(); @@ -42,4 +47,15 @@ private void handleNativeIntent(Intent intent) { MailFlowNativePlugin.sendMailtoAction(data); } } + + private boolean markIntentHandled(Intent intent) { + String action = intent.getAction(); + Uri data = intent.getData(); + String messageId = intent.getStringExtra("messageId"); + String key = String.valueOf(action) + "|" + String.valueOf(data) + "|" + String.valueOf(messageId); + + if (key.equals(lastHandledIntentKey)) return false; + lastHandledIntentKey = key; + return true; + } } From 2ae76cfdb1421a982af995a0be8e4ccb690dec81 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 18:15:38 -0300 Subject: [PATCH 71/90] fixing android notification prompt --- .../android/app/src/main/AndroidManifest.xml | 4 ++ .../sh/mailflow/app/MailFlowNativePlugin.java | 66 ++++++++++++++----- .../java/sh/mailflow/app/MainActivity.java | 10 +++ .../app/src/main/res/values/strings.xml | 4 ++ .../app/src/main/res/xml/shortcuts.xml | 26 ++++++++ frontend/packages/native-shell/index.html | 18 +++++ .../components/ElectronNotificationBridge.jsx | 4 -- frontend/src/utils/capacitorNativeBridge.js | 1 + 8 files changed, 113 insertions(+), 20 deletions(-) create mode 100644 frontend/packages/android/app/src/main/res/xml/shortcuts.xml diff --git a/frontend/packages/android/app/src/main/AndroidManifest.xml b/frontend/packages/android/app/src/main/AndroidManifest.xml index ab940968..f7deb5bd 100644 --- a/frontend/packages/android/app/src/main/AndroidManifest.xml +++ b/frontend/packages/android/app/src/main/AndroidManifest.xml @@ -23,6 +23,10 @@ + + diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index bf8c88af..d58dfb31 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -4,13 +4,14 @@ import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; -import androidx.core.app.ActivityCompat; +import android.provider.Settings; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.content.ContextCompat; @@ -40,6 +41,8 @@ ) public class MailFlowNativePlugin extends Plugin { static final String ACTION_OPEN_MESSAGE = "sh.mailflow.app.OPEN_MESSAGE"; + static final String ACTION_COMPOSE = "sh.mailflow.app.COMPOSE"; + static final String ACTION_SYNC = "sh.mailflow.app.SYNC"; private static final String CHANNEL_NEW_MAIL = "mailflow_new_mail"; private static final String PREFS_NAME = "mailflow-native"; private static final String PREF_HOST = "host"; @@ -92,11 +95,16 @@ public void setUnreadCount(PluginCall call) { @PluginMethod public void requestNotificationPermission(PluginCall call) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || hasNotificationPermission()) { + if (hasNotificationPermission()) { call.resolve(notificationPermissionResult("granted")); return; } + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + call.resolve(notificationPermissionResult("denied")); + return; + } + requestPermissionForAlias("notifications", call, "notificationPermissionCallback"); } @@ -106,13 +114,26 @@ public void checkNotificationPermission(PluginCall call) { } @PluginMethod - public void showNewMail(PluginCall call) { - requestNotificationPermissionIfNeeded(); + public void openNotificationSettings(PluginCall call) { + Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS) + .putExtra(Settings.EXTRA_APP_PACKAGE, getContext().getPackageName()); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + try { + getContext().startActivity(intent); + } catch (ActivityNotFoundException err) { + Intent fallbackIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + .setData(Uri.parse("package:" + getContext().getPackageName())); + fallbackIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + getContext().startActivity(fallbackIntent); + } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && ContextCompat.checkSelfPermission( - getContext(), - Manifest.permission.POST_NOTIFICATIONS - ) != PackageManager.PERMISSION_GRANTED) { + call.resolve(); + } + + @PluginMethod + public void showNewMail(PluginCall call) { + if (!hasNotificationPermission()) { call.resolve(); return; } @@ -203,6 +224,19 @@ static void sendMailtoAction(Uri uri) { dispatchAction(action); } + static void sendComposeAction() { + JSObject action = newAction("new-mail"); + action.put("composeData", new JSObject()); + action.put("source", "shortcut"); + dispatchAction(action); + } + + static void sendSyncAction() { + JSObject action = newAction("sync"); + action.put("source", "shortcut"); + dispatchAction(action); + } + private static void dispatchAction(JSObject action) { synchronized (pendingActions) { pendingActions.add(action); @@ -327,29 +361,29 @@ private static void createNotificationChannel(Context context) { if (manager != null) manager.createNotificationChannel(channel); } - private void requestNotificationPermissionIfNeeded() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && !hasNotificationPermission()) { - ActivityCompat.requestPermissions(getActivity(), new String[] { Manifest.permission.POST_NOTIFICATIONS }, 4901); - } - } - @PermissionCallback private void notificationPermissionCallback(PluginCall call) { call.resolve(notificationPermissionResult(getNotificationPermissionState())); } private boolean hasNotificationPermission() { - return ContextCompat.checkSelfPermission( + if (!NotificationManagerCompat.from(getContext()).areNotificationsEnabled()) { + return false; + } + + return Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || ContextCompat.checkSelfPermission( getContext(), Manifest.permission.POST_NOTIFICATIONS ) == PackageManager.PERMISSION_GRANTED; } private String getNotificationPermissionState() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || hasNotificationPermission()) { + if (hasNotificationPermission()) { return "granted"; } + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) return "denied"; + PermissionState state = getPermissionState("notifications"); if (state == PermissionState.DENIED) return "denied"; return "default"; diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java index ea941b69..5aa8feb9 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java @@ -43,6 +43,16 @@ private void handleNativeIntent(Intent intent) { return; } + if (MailFlowNativePlugin.ACTION_COMPOSE.equals(action)) { + MailFlowNativePlugin.sendComposeAction(); + return; + } + + if (MailFlowNativePlugin.ACTION_SYNC.equals(action)) { + MailFlowNativePlugin.sendSyncAction(); + return; + } + if ((Intent.ACTION_SENDTO.equals(action) || Intent.ACTION_VIEW.equals(action)) && data != null && "mailto".equalsIgnoreCase(data.getScheme())) { MailFlowNativePlugin.sendMailtoAction(data); } diff --git a/frontend/packages/android/app/src/main/res/values/strings.xml b/frontend/packages/android/app/src/main/res/values/strings.xml index 121ec6f3..36ca1222 100644 --- a/frontend/packages/android/app/src/main/res/values/strings.xml +++ b/frontend/packages/android/app/src/main/res/values/strings.xml @@ -4,4 +4,8 @@ MailFlow sh.mailflow.app sh.mailflow.app + New email + Compose new email + Sync + Sync mail diff --git a/frontend/packages/android/app/src/main/res/xml/shortcuts.xml b/frontend/packages/android/app/src/main/res/xml/shortcuts.xml new file mode 100644 index 00000000..8b7bb097 --- /dev/null +++ b/frontend/packages/android/app/src/main/res/xml/shortcuts.xml @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/frontend/packages/native-shell/index.html b/frontend/packages/native-shell/index.html index 265fd4d8..340befb2 100644 --- a/frontend/packages/native-shell/index.html +++ b/frontend/packages/native-shell/index.html @@ -144,6 +144,14 @@

    Connect MailFlow

    const result = await plugin.saveHost({ host }); return result?.host || host; }, + checkNotificationPermission: async () => { + const result = await plugin.checkNotificationPermission(); + return result?.permission || 'default'; + }, + requestNotificationPermission: async () => { + const result = await plugin.requestNotificationPermission(); + return result?.permission || 'default'; + }, resetHost: async () => plugin.resetHost(), }; } @@ -172,10 +180,20 @@

    Connect MailFlow

    document.body.classList.remove('setup-pending'); } + async function requestInitialNotificationPermission() { + if (!window.mailflowNative) return; + + const permission = await window.mailflowNative.checkNotificationPermission(); + if (permission === 'default') { + await window.mailflowNative.requestNotificationPermission(); + } + } + async function restoreHost() { installCapacitorNativeBridge(); if (window.mailflowNative) { + requestInitialNotificationPermission().catch(() => {}); const host = await window.mailflowNative.getHost(); if (host) loadHost(host); else showSetup(); diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index 924cfa41..71842a87 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -28,10 +28,6 @@ export default function ElectronNotificationBridge() { window.mailflowNative?.badges?.setUnreadCount?.(totalUnread || 0); }, [totalUnread]); - useEffect(() => { - window.mailflowNative?.notifications?.requestPermission?.().catch(() => {}); - }, []); - useEffect(() => { const showNewMail = window.mailflowNative?.notifications?.showNewMail; if (typeof showNewMail !== 'function') return undefined; diff --git a/frontend/src/utils/capacitorNativeBridge.js b/frontend/src/utils/capacitorNativeBridge.js index 61b15416..ca883f1b 100644 --- a/frontend/src/utils/capacitorNativeBridge.js +++ b/frontend/src/utils/capacitorNativeBridge.js @@ -36,6 +36,7 @@ export function installCapacitorNativeBridge() { const result = await MailFlowNative.requestNotificationPermission(); return result?.permission || 'default'; }, + openSettings: async () => MailFlowNative.openNotificationSettings(), showNewMail: async (notification) => MailFlowNative.showNewMail(notification || {}), }, actions: { From 023156eccce62b7ea74b7ee266d05fab3aab7bf7 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 18:39:39 -0300 Subject: [PATCH 72/90] updating android bridge --- .../sh/mailflow/app/MailFlowNativePlugin.java | 47 ++++++++++++++++++ .../mailflow/app/MailFlowWebViewClient.java | 2 + .../java/sh/mailflow/app/MainActivity.java | 35 ++++++++++++++ .../components/ElectronNotificationBridge.jsx | 17 ++++++- frontend/src/utils/capacitorNativeBridge.js | 48 +++++++++++++------ 5 files changed, 133 insertions(+), 16 deletions(-) diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index d58dfb31..0951b188 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -12,6 +12,7 @@ import android.net.Uri; import android.os.Build; import android.provider.Settings; +import android.webkit.WebView; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.content.ContextCompat; @@ -198,6 +199,41 @@ static String getSavedHost(Context context) { return getPrefs(context).getString(PREF_HOST, null); } + static void injectPendingActions(WebView webView, Context context) { + if (webView == null || context == null || !isConfiguredHost(context, webView.getUrl())) return; + + List actions; + synchronized (pendingActions) { + if (pendingActions.isEmpty()) return; + actions = new ArrayList<>(pendingActions); + pendingActions.clear(); + } + + String actionJson = new JSArray(actions).toString(); + String script = "(function(actions){" + + "window.__mailflowPendingNativeActions=(window.__mailflowPendingNativeActions||[]).concat(actions);" + + "var delivered=false;" + + "var deliver=function(force){" + + "if(delivered)return true;" + + "if(!force&&window.__mailflowNativeBridgeReady!==true)return false;" + + "delivered=true;" + + "actions.forEach(function(payload){" + + "window.dispatchEvent(new CustomEvent('mailflow:native-action',{detail:payload}));" + + "window.postMessage({type:'mailflow:native-action',payload:payload},'*');" + + "});" + + "window.dispatchEvent(new CustomEvent('mailflow:native-actions-ready'));" + + "window.postMessage({type:'mailflow:native-actions-ready'},'*');" + + "return true;" + + "};" + + "if(!deliver(false)){" + + "var attempts=0;" + + "var timer=window.setInterval(function(){attempts+=1;if(deliver(false)||attempts>=100){if(!delivered)deliver(true);window.clearInterval(timer);}},100);" + + "}" + + "})( " + actionJson + " );"; + + webView.post(() -> webView.evaluateJavascript(script, null)); + } + static void sendOpenMessageAction(Intent intent) { JSObject action = newAction("open-message"); copyStringExtra(intent, action, "messageId"); @@ -244,9 +280,15 @@ private static void dispatchAction(JSObject action) { if (instance != null) { instance.notifyListeners("nativeAction", action, true); + instance.injectPendingActionsToWebView(); } } + private void injectPendingActionsToWebView() { + if (getBridge() == null) return; + injectPendingActions(getBridge().getWebView(), getContext()); + } + private static JSObject newAction(String actionName) { JSObject action = new JSObject(); action.put("id", UUID.randomUUID().toString()); @@ -348,6 +390,11 @@ private static SharedPreferences getPrefs(Context context) { return context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); } + private static boolean isConfiguredHost(Context context, String url) { + String host = getSavedHost(context); + return host != null && url != null && url.startsWith(host); + } + private static void createNotificationChannel(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return; diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java index 3c0d4128..89e3a085 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java @@ -47,6 +47,8 @@ public void onPageFinished(WebView view, String url) { if (!isConfiguredHost(url)) return; + MailFlowNativePlugin.injectPendingActions(view, context); + view.evaluateJavascript("(document.body ? document.body.innerText : '')", (text) -> { String bodyText = text == null ? "" : text.toLowerCase(); if (bodyText.contains("rewrite 502 bad gateway page") || bodyText.contains("rewrite 404 error page")) { diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java index 5aa8feb9..88508bb7 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java @@ -2,7 +2,9 @@ import android.content.Intent; import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.webkit.CookieManager; import com.getcapacitor.BridgeActivity; public class MainActivity extends BridgeActivity { @@ -14,6 +16,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (bridge != null) { + configureCookies(); bridge.setWebViewClient(new MailFlowWebViewClient(bridge, this)); String savedHost = MailFlowNativePlugin.getSavedHost(this); if (savedHost != null) { @@ -24,6 +27,24 @@ protected void onCreate(Bundle savedInstanceState) { handleNativeIntent(getIntent()); } + @Override + public void onPause() { + flushCookies(); + super.onPause(); + } + + @Override + public void onStop() { + flushCookies(); + super.onStop(); + } + + @Override + public void onDestroy() { + flushCookies(); + super.onDestroy(); + } + @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); @@ -68,4 +89,18 @@ private boolean markIntentHandled(Intent intent) { lastHandledIntentKey = key; return true; } + + private void configureCookies() { + CookieManager cookieManager = CookieManager.getInstance(); + cookieManager.setAcceptCookie(true); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && bridge != null && bridge.getWebView() != null) { + cookieManager.setAcceptThirdPartyCookies(bridge.getWebView(), true); + } + } + + private void flushCookies() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + CookieManager.getInstance().flush(); + } + } } diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index 71842a87..01dfa723 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -186,8 +186,18 @@ export default function ElectronNotificationBridge() { const handleNativeMessage = (event) => { if (event.source !== window) return; - if (event.data?.type !== 'mailflow:native-action') return; - runNativeAction(event.data.payload); + if (event.data?.type === 'mailflow:native-action') { + runNativeAction(event.data.payload); + } else if (event.data?.type === 'mailflow:native-actions-ready') { + drainInjectedActions(); + } + }; + + const drainInjectedActions = () => { + const actions = Array.isArray(window.__mailflowPendingNativeActions) + ? window.__mailflowPendingNativeActions.splice(0) + : []; + actions.forEach(runNativeAction); }; const unsubscribe = window.mailflowNative?.actions?.onAction?.((payload) => { @@ -200,10 +210,13 @@ export default function ElectronNotificationBridge() { }) .catch(() => {}); + drainInjectedActions(); window.addEventListener('mailflow:native-action', handleNativeAction); + window.addEventListener('mailflow:native-actions-ready', drainInjectedActions); window.addEventListener('message', handleNativeMessage); return () => { window.removeEventListener('mailflow:native-action', handleNativeAction); + window.removeEventListener('mailflow:native-actions-ready', drainInjectedActions); window.removeEventListener('message', handleNativeMessage); if (typeof unsubscribe === 'function') unsubscribe(); }; diff --git a/frontend/src/utils/capacitorNativeBridge.js b/frontend/src/utils/capacitorNativeBridge.js index ca883f1b..d1aa144a 100644 --- a/frontend/src/utils/capacitorNativeBridge.js +++ b/frontend/src/utils/capacitorNativeBridge.js @@ -2,6 +2,7 @@ import { Capacitor, registerPlugin } from '@capacitor/core'; let installed = false; let plugin = null; +let pluginUnavailable = false; function getPlugin() { if (plugin) return plugin; @@ -9,46 +10,65 @@ function getPlugin() { return plugin; } +async function callNative(method, args, fallback = null) { + if (pluginUnavailable) return fallback; + + try { + const MailFlowNative = getPlugin(); + return await MailFlowNative[method](args); + } catch (error) { + if (String(error?.message || error).includes('not implemented')) { + pluginUnavailable = true; + } + return fallback; + } +} + export function installCapacitorNativeBridge() { if (installed || window.mailflowNative || !Capacitor.isNativePlatform()) return; - const MailFlowNative = getPlugin(); - window.mailflowNative = { getHost: async () => { - const result = await MailFlowNative.getHost(); + const result = await callNative('getHost', undefined, {}); return result?.host || null; }, saveHost: async (host) => { - const result = await MailFlowNative.saveHost({ host }); + const result = await callNative('saveHost', { host }, { host }); return result?.host || host; }, - resetHost: async () => MailFlowNative.resetHost(), + resetHost: async () => callNative('resetHost'), badges: { - setUnreadCount: async (count) => MailFlowNative.setUnreadCount({ count }), + setUnreadCount: async (count) => callNative('setUnreadCount', { count }), }, notifications: { checkPermission: async () => { - const result = await MailFlowNative.checkNotificationPermission(); + const result = await callNative('checkNotificationPermission', undefined, {}); return result?.permission || 'default'; }, requestPermission: async () => { - const result = await MailFlowNative.requestNotificationPermission(); + const result = await callNative('requestNotificationPermission', undefined, {}); return result?.permission || 'default'; }, - openSettings: async () => MailFlowNative.openNotificationSettings(), - showNewMail: async (notification) => MailFlowNative.showNewMail(notification || {}), + openSettings: async () => callNative('openNotificationSettings'), + showNewMail: async (notification) => callNative('showNewMail', notification || {}), }, actions: { getPending: async () => { - const result = await MailFlowNative.getPendingActions(); + const result = await callNative('getPendingActions', undefined, {}); return result?.actions || []; }, - ack: async (id) => MailFlowNative.ackAction({ id }), + ack: async (id) => callNative('ackAction', { id }), onAction: (callback) => { - const handlePromise = MailFlowNative.addListener('nativeAction', callback); + if (pluginUnavailable) return () => {}; + const MailFlowNative = getPlugin(); + const handlePromise = MailFlowNative.addListener('nativeAction', callback).catch((error) => { + if (String(error?.message || error).includes('not implemented')) { + pluginUnavailable = true; + } + return null; + }); return () => { - handlePromise.then((handle) => handle.remove()).catch(() => {}); + handlePromise.then((handle) => handle?.remove?.()).catch(() => {}); }; }, }, From 8565cfcf5425e1a624c3edf00fdac763b2311e62 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 18:57:13 -0300 Subject: [PATCH 73/90] fix android navigation integration --- .../android/app/src/main/AndroidManifest.xml | 7 +++ .../sh/mailflow/app/MailFlowNativePlugin.java | 23 ++++++++- .../mailflow/app/MailFlowWebViewClient.java | 1 + .../java/sh/mailflow/app/MainActivity.java | 46 ++++++++++++++++++ .../app/src/main/res/xml/shortcuts.xml | 6 ++- frontend/src/components/MailApp.jsx | 47 +++++++++++++++++++ 6 files changed, 127 insertions(+), 3 deletions(-) diff --git a/frontend/packages/android/app/src/main/AndroidManifest.xml b/frontend/packages/android/app/src/main/AndroidManifest.xml index f7deb5bd..d6ccc5d1 100644 --- a/frontend/packages/android/app/src/main/AndroidManifest.xml +++ b/frontend/packages/android/app/src/main/AndroidManifest.xml @@ -40,6 +40,13 @@
    + + + + + + + actions; synchronized (pendingActions) { if (pendingActions.isEmpty()) return; @@ -234,6 +236,26 @@ static void injectPendingActions(WebView webView, Context context) { webView.post(() -> webView.evaluateJavascript(script, null)); } + static void injectCapacitorCompat(WebView webView) { + if (webView == null) return; + + String script = "(function(){try{" + + "window.Capacitor=window.Capacitor||{};" + + "if(typeof window.Capacitor.triggerEvent!=='function'){" + + "window.Capacitor.triggerEvent=function(eventName,target,eventData){" + + "var receiver=target==='document'?document:window;" + + "var event;" + + "try{event=new CustomEvent(eventName,{detail:eventData});}" + + "catch(e){event=document.createEvent('CustomEvent');event.initCustomEvent(eventName,false,false,eventData);}" + + "receiver.dispatchEvent(event);" + + "return true;" + + "};" + + "}" + + "}catch(e){}})();"; + + webView.post(() -> webView.evaluateJavascript(script, null)); + } + static void sendOpenMessageAction(Intent intent) { JSObject action = newAction("open-message"); copyStringExtra(intent, action, "messageId"); @@ -279,7 +301,6 @@ private static void dispatchAction(JSObject action) { } if (instance != null) { - instance.notifyListeners("nativeAction", action, true); instance.injectPendingActionsToWebView(); } } diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java index 89e3a085..a3593240 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowWebViewClient.java @@ -47,6 +47,7 @@ public void onPageFinished(WebView view, String url) { if (!isConfiguredHost(url)) return; + MailFlowNativePlugin.injectCapacitorCompat(view); MailFlowNativePlugin.injectPendingActions(view, context); view.evaluateJavascript("(document.body ? document.body.innerText : '')", (text) -> { diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java index 88508bb7..da7c711f 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java @@ -5,6 +5,8 @@ import android.os.Build; import android.os.Bundle; import android.webkit.CookieManager; +import android.webkit.WebView; +import androidx.activity.OnBackPressedCallback; import com.getcapacitor.BridgeActivity; public class MainActivity extends BridgeActivity { @@ -14,6 +16,12 @@ public class MainActivity extends BridgeActivity { protected void onCreate(Bundle savedInstanceState) { registerPlugin(MailFlowNativePlugin.class); super.onCreate(savedInstanceState); + getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + handleAndroidBack(); + } + }); if (bridge != null) { configureCookies(); @@ -52,6 +60,27 @@ protected void onNewIntent(Intent intent) { handleNativeIntent(intent); } + private void handleAndroidBack() { + if (bridge == null || bridge.getWebView() == null) { + moveTaskToBack(true); + return; + } + + WebView webView = bridge.getWebView(); + webView.evaluateJavascript( + "(function(){try{" + + "if(typeof window.__mailflowHandleAndroidBack==='function'){return !!window.__mailflowHandleAndroidBack();}" + + "}catch(e){}" + + "return false;" + + "})()", + (handled) -> { + if ("true".equals(handled)) return; + + runOnUiThread(() -> moveTaskToBack(true)); + } + ); + } + private void handleNativeIntent(Intent intent) { if (intent == null) return; if (!markIntentHandled(intent)) return; @@ -74,6 +103,23 @@ private void handleNativeIntent(Intent intent) { return; } + if (Intent.ACTION_VIEW.equals(action) && data != null && "mailflow".equalsIgnoreCase(data.getScheme())) { + String route = data.getHost(); + if (route == null || route.isEmpty()) { + route = data.getPath() == null ? "" : data.getPath().replaceFirst("^/", ""); + } + + if ("compose".equalsIgnoreCase(route)) { + MailFlowNativePlugin.sendComposeAction(); + return; + } + + if ("sync".equalsIgnoreCase(route)) { + MailFlowNativePlugin.sendSyncAction(); + return; + } + } + if ((Intent.ACTION_SENDTO.equals(action) || Intent.ACTION_VIEW.equals(action)) && data != null && "mailto".equalsIgnoreCase(data.getScheme())) { MailFlowNativePlugin.sendMailtoAction(data); } diff --git a/frontend/packages/android/app/src/main/res/xml/shortcuts.xml b/frontend/packages/android/app/src/main/res/xml/shortcuts.xml index 8b7bb097..530c7738 100644 --- a/frontend/packages/android/app/src/main/res/xml/shortcuts.xml +++ b/frontend/packages/android/app/src/main/res/xml/shortcuts.xml @@ -7,7 +7,8 @@ android:shortcutShortLabel="@string/shortcut_compose_short_label" android:shortcutLongLabel="@string/shortcut_compose_long_label"> @@ -19,7 +20,8 @@ android:shortcutShortLabel="@string/shortcut_sync_short_label" android:shortcutLongLabel="@string/shortcut_sync_long_label"> diff --git a/frontend/src/components/MailApp.jsx b/frontend/src/components/MailApp.jsx index a964275a..0c6b99cc 100644 --- a/frontend/src/components/MailApp.jsx +++ b/frontend/src/components/MailApp.jsx @@ -169,6 +169,53 @@ export default function MailApp() { useEffect(() => { composingRef.current = composing; }, [composing]); useEffect(() => { showAdminRef.current = showAdmin; }, [showAdmin]); + const mobileSidebarOpenRef = useRef(mobileSidebarOpen); + const showShortcutHelpRef = useRef(showShortcutHelp); + const paletteOpenRef = useRef(paletteOpen); + useEffect(() => { mobileSidebarOpenRef.current = mobileSidebarOpen; }, [mobileSidebarOpen]); + useEffect(() => { showShortcutHelpRef.current = showShortcutHelp; }, [showShortcutHelp]); + useEffect(() => { paletteOpenRef.current = paletteOpen; }, [paletteOpen]); + + useEffect(() => { + window.__mailflowHandleAndroidBack = () => { + if (composingRef.current) { + useStore.getState().closeCompose(); + return true; + } + + if (showAdminRef.current) { + setShowAdmin(false); + return true; + } + + if (paletteOpenRef.current) { + setPaletteOpen(false); + return true; + } + + if (showShortcutHelpRef.current) { + setShowShortcutHelp(false); + return true; + } + + if (mobileSidebarOpenRef.current) { + setMobileSidebarOpen(false); + return true; + } + + if (selectedMessageIdRef.current) { + setSelectedMessage(null); + return true; + } + + return false; + }; + + return () => { + if (window.__mailflowHandleAndroidBack) delete window.__mailflowHandleAndroidBack; + }; + }, [setMobileSidebarOpen, setSelectedMessage, setShowAdmin]); + useEffect(() => { if (isMobile) return; const keyMap = buildKeyMap(shortcuts); From 138158f1c264fb1e082aa9965106cdf73bf36680 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 19:15:51 -0300 Subject: [PATCH 74/90] integrate new mail notifications --- .../sh/mailflow/app/MailFlowNativePlugin.java | 68 +++++++++++++++---- .../java/sh/mailflow/app/MainActivity.java | 1 + .../components/ElectronNotificationBridge.jsx | 42 ------------ frontend/src/hooks/useWebSocket.js | 20 ++++-- frontend/src/utils/capacitorNativeBridge.js | 5 +- 5 files changed, 73 insertions(+), 63 deletions(-) diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index 441811d5..3ea3694b 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -12,6 +12,7 @@ import android.net.Uri; import android.os.Build; import android.provider.Settings; +import android.webkit.JavascriptInterface; import android.webkit.WebView; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; @@ -33,6 +34,7 @@ import java.util.Set; import java.util.UUID; import org.json.JSONException; +import org.json.JSONObject; @CapacitorPlugin( name = "MailFlowNative", @@ -134,11 +136,6 @@ public void openNotificationSettings(PluginCall call) { @PluginMethod public void showNewMail(PluginCall call) { - if (!hasNotificationPermission()) { - call.resolve(); - return; - } - String title = call.getString("title", "New mail"); String body = call.getString("body", "You have new mail."); String messageId = call.getString("messageId", null); @@ -146,7 +143,14 @@ public void showNewMail(PluginCall call) { String folder = call.getString("folder", "INBOX"); JSObject message = call.getObject("message"); - Intent intent = new Intent(getContext(), MainActivity.class); + postNewMailNotification(getContext(), title, body, messageId, accountId, folder, message); + call.resolve(); + } + + static void postNewMailNotification(Context context, String title, String body, String messageId, String accountId, String folder, JSObject message) { + if (!hasNotificationPermission(context)) return; + + Intent intent = new Intent(context, MainActivity.class); intent.setAction(ACTION_OPEN_MESSAGE); intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); putExtra(intent, "messageId", messageId); @@ -156,13 +160,13 @@ public void showNewMail(PluginCall call) { int notificationId = Math.abs(UUID.randomUUID().hashCode()); PendingIntent pendingIntent = PendingIntent.getActivity( - getContext(), + context, notificationId, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); - NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext(), CHANNEL_NEW_MAIL) + NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_NEW_MAIL) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(title) .setContentText(body) @@ -171,8 +175,7 @@ public void showNewMail(PluginCall call) { .setAutoCancel(true) .setPriority(NotificationCompat.PRIORITY_DEFAULT); - NotificationManagerCompat.from(getContext()).notify(notificationId, builder.build()); - call.resolve(); + NotificationManagerCompat.from(context).notify(notificationId, builder.build()); } @PluginMethod @@ -251,6 +254,15 @@ static void injectCapacitorCompat(WebView webView) { + "return true;" + "};" + "}" + + "var androidNotifications=window.MailFlowAndroid;" + + "var plugin=function(){return window.Capacitor&&window.Capacitor.Plugins&&window.Capacitor.Plugins.MailFlowNative;};" + + "var call=function(method,args,fallback){var p=plugin();if(!p||typeof p[method]!=='function')return Promise.resolve(fallback||null);return p[method](args||{}).catch(function(){return fallback||null;});};" + + "window.mailflowNative=window.mailflowNative||{};" + + "window.mailflowNative.notifications=window.mailflowNative.notifications||{};" + + "window.mailflowNative.notifications.showNewMail=function(notification){if(androidNotifications&&typeof androidNotifications.showNewMail==='function'){androidNotifications.showNewMail(JSON.stringify(notification||{}));return Promise.resolve(null);}return call('showNewMail',notification||{});};" + + "window.mailflowNative.notifications.checkPermission=function(){return call('checkNotificationPermission',{},{}).then(function(result){return result&&result.permission||'default';});};" + + "window.mailflowNative.notifications.requestPermission=function(){return call('requestNotificationPermission',{},{}).then(function(result){return result&&result.permission||'default';});};" + + "window.mailflowNative.notifications.openSettings=function(){return call('openNotificationSettings',{});};" + "}catch(e){}})();"; webView.post(() -> webView.evaluateJavascript(script, null)); @@ -435,12 +447,16 @@ private void notificationPermissionCallback(PluginCall call) { } private boolean hasNotificationPermission() { - if (!NotificationManagerCompat.from(getContext()).areNotificationsEnabled()) { + return hasNotificationPermission(getContext()); + } + + private static boolean hasNotificationPermission(Context context) { + if (!NotificationManagerCompat.from(context).areNotificationsEnabled()) { return false; } return Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || ContextCompat.checkSelfPermission( - getContext(), + context, Manifest.permission.POST_NOTIFICATIONS ) == PackageManager.PERMISSION_GRANTED; } @@ -463,6 +479,34 @@ private JSObject notificationPermissionResult(String permission) { return result; } + public static class NotificationBridge { + private final Context context; + + NotificationBridge(Context context) { + this.context = context.getApplicationContext(); + createNotificationChannel(this.context); + } + + @JavascriptInterface + public void showNewMail(String notificationJson) { + try { + JSONObject notification = new JSONObject(notificationJson == null ? "{}" : notificationJson); + JSONObject messageObject = notification.optJSONObject("message"); + JSObject message = messageObject == null ? null : JSObject.fromJSONObject(messageObject); + + postNewMailNotification( + context, + notification.optString("title", "New mail"), + notification.optString("body", "You have new mail."), + notification.optString("messageId", null), + notification.optString("accountId", null), + notification.optString("folder", "INBOX"), + message + ); + } catch (JSONException ignored) {} + } + } + private static void putExtra(Intent intent, String key, String value) { if (value != null) intent.putExtra(key, value); } diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java index da7c711f..7acf069a 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java @@ -25,6 +25,7 @@ public void handleOnBackPressed() { if (bridge != null) { configureCookies(); + bridge.getWebView().addJavascriptInterface(new MailFlowNativePlugin.NotificationBridge(this), "MailFlowAndroid"); bridge.setWebViewClient(new MailFlowWebViewClient(bridge, this)); String savedHost = MailFlowNativePlugin.getSavedHost(this); if (savedHost != null) { diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index 01dfa723..c029e1f9 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -14,7 +14,6 @@ export default function ElectronNotificationBridge() { const totalUnread = useStore(state => state.unreadCounts.total); const lastActionRef = useRef({ action: null, time: 0 }); const processedActionIdsRef = useRef(new Set()); - const forwardedNotificationIdsRef = useRef(new Set()); useEffect(() => { window.__mailflowNativeBridgeReady = true; @@ -28,47 +27,6 @@ export default function ElectronNotificationBridge() { window.mailflowNative?.badges?.setUnreadCount?.(totalUnread || 0); }, [totalUnread]); - useEffect(() => { - const showNewMail = window.mailflowNative?.notifications?.showNewMail; - if (typeof showNewMail !== 'function') return undefined; - - const forwardNewMail = (notification) => { - showNewMail({ - title: notification.title, - body: notification.body, - count: notification.count, - accountId: notification.accountId, - folder: notification.folder, - messageId: notification.messageId, - message: notification.message, - }).catch(() => {}); - }; - - const handleHiddenNewMail = (event) => { - forwardNewMail(event.detail || {}); - }; - - useStore.getState().notifications.forEach((notification) => { - if (notification?.id) forwardedNotificationIdsRef.current.add(notification.id); - }); - - const unsubscribe = useStore.subscribe((state) => { - for (const notification of state.notifications) { - if (notification?.type !== 'new_mail' || !notification.id) continue; - if (forwardedNotificationIdsRef.current.has(notification.id)) continue; - - forwardedNotificationIdsRef.current.add(notification.id); - forwardNewMail(notification); - } - }); - - window.addEventListener('mailflow:new-mail-notification', handleHiddenNewMail); - return () => { - unsubscribe(); - window.removeEventListener('mailflow:new-mail-notification', handleHiddenNewMail); - }; - }, []); - useEffect(() => { const unsubscribe = window.mailflowNative?.notifications?.onPush?.((notification) => { addNotification({ diff --git a/frontend/src/hooks/useWebSocket.js b/frontend/src/hooks/useWebSocket.js index 5216c4b0..ee5a0ef3 100644 --- a/frontend/src/hooks/useWebSocket.js +++ b/frontend/src/hooks/useWebSocket.js @@ -2,6 +2,7 @@ import { useEffect, useRef, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { useStore } from '../store/index.js'; import { api } from '../utils/api.js'; +import { installCapacitorNativeBridge } from '../utils/capacitorNativeBridge.js'; import { playNotificationSound } from '../utils/notificationSounds.js'; import { pendingMarkReadMap } from '../utils/pendingReads.js'; import { updateFaviconBadge } from '../themes.js'; @@ -46,10 +47,17 @@ function _applyServerCounts(counts) { } } -function _emitNativeNewMailNotification(notification) { - window.dispatchEvent(new CustomEvent('mailflow:new-mail-notification', { - detail: notification, - })); +function _forwardNativeNewMailNotification(notification) { + installCapacitorNativeBridge(); + window.mailflowNative?.notifications?.showNewMail?.({ + title: notification.title, + body: notification.body, + count: notification.count, + accountId: notification.accountId, + folder: notification.folder, + messageId: notification.messageId, + message: notification.message, + }).catch(() => {}); } // Auth-related close codes that should not trigger reconnect @@ -136,9 +144,9 @@ export function useWebSocket() { addNotification(notification); const { notificationSound, customSoundDataUrl } = useStore.getState(); playNotificationSound(notificationSound, customSoundDataUrl); - } else { - _emitNativeNewMailNotification(notification); } + + _forwardNativeNewMailNotification(notification); } // Refresh the message list when the affected folder is visible diff --git a/frontend/src/utils/capacitorNativeBridge.js b/frontend/src/utils/capacitorNativeBridge.js index d1aa144a..82a753c2 100644 --- a/frontend/src/utils/capacitorNativeBridge.js +++ b/frontend/src/utils/capacitorNativeBridge.js @@ -62,9 +62,8 @@ export function installCapacitorNativeBridge() { if (pluginUnavailable) return () => {}; const MailFlowNative = getPlugin(); const handlePromise = MailFlowNative.addListener('nativeAction', callback).catch((error) => { - if (String(error?.message || error).includes('not implemented')) { - pluginUnavailable = true; - } + // Listener support can be unavailable on hosted/older native shells while + // direct plugin methods such as showNewMail still work. return null; }); return () => { From 7bef75e5348c5df1e8dc00f6f9dd6b1cb6bbe030 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 19:19:55 -0300 Subject: [PATCH 75/90] rename shortcuts --- frontend/packages/android/app/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/packages/android/app/src/main/res/values/strings.xml b/frontend/packages/android/app/src/main/res/values/strings.xml index 36ca1222..f1fd3a5d 100644 --- a/frontend/packages/android/app/src/main/res/values/strings.xml +++ b/frontend/packages/android/app/src/main/res/values/strings.xml @@ -5,7 +5,7 @@ sh.mailflow.app sh.mailflow.app New email - Compose new email + Compose Sync - Sync mail + Sync From 058a59618d5c29779074f819902de7ef22ccb23f Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Thu, 28 May 2026 19:38:36 -0300 Subject: [PATCH 76/90] implement background new mail checker --- frontend/packages/android/app/build.gradle | 1 + .../mailflow/app/MailFlowBackgroundSync.java | 43 +++++++ .../app/MailFlowBackgroundWorker.java | 115 ++++++++++++++++++ .../sh/mailflow/app/MailFlowNativePlugin.java | 6 + .../java/sh/mailflow/app/MainActivity.java | 2 + frontend/packages/android/variables.gradle | 3 +- 6 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundSync.java create mode 100644 frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundWorker.java diff --git a/frontend/packages/android/app/build.gradle b/frontend/packages/android/app/build.gradle index 47d97ba4..3c28da23 100644 --- a/frontend/packages/android/app/build.gradle +++ b/frontend/packages/android/app/build.gradle @@ -54,6 +54,7 @@ dependencies { implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" implementation "androidx.core:core:$androidxCoreVersion" implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" + implementation "androidx.work:work-runtime:$androidxWorkVersion" implementation project(':capacitor-android') testImplementation "junit:junit:$junitVersion" androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundSync.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundSync.java new file mode 100644 index 00000000..517c4a15 --- /dev/null +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundSync.java @@ -0,0 +1,43 @@ +package sh.mailflow.app; + +import android.content.Context; +import androidx.work.Constraints; +import androidx.work.ExistingPeriodicWorkPolicy; +import androidx.work.ExistingWorkPolicy; +import androidx.work.NetworkType; +import androidx.work.OneTimeWorkRequest; +import androidx.work.PeriodicWorkRequest; +import androidx.work.WorkManager; +import java.util.concurrent.TimeUnit; + +public final class MailFlowBackgroundSync { + private static final String PERIODIC_WORK = "mailflow-background-mail-check"; + private static final String ONE_TIME_WORK = "mailflow-background-mail-check-once"; + + private MailFlowBackgroundSync() {} + + public static void schedule(Context context) { + if (context == null || MailFlowNativePlugin.getSavedHost(context) == null) return; + + Constraints constraints = new Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build(); + + PeriodicWorkRequest periodicRequest = new PeriodicWorkRequest.Builder( + MailFlowBackgroundWorker.class, + 15, + TimeUnit.MINUTES + ) + .setConstraints(constraints) + .build(); + + OneTimeWorkRequest oneTimeRequest = new OneTimeWorkRequest.Builder(MailFlowBackgroundWorker.class) + .setInitialDelay(45, TimeUnit.SECONDS) + .setConstraints(constraints) + .build(); + + WorkManager workManager = WorkManager.getInstance(context.getApplicationContext()); + workManager.enqueueUniquePeriodicWork(PERIODIC_WORK, ExistingPeriodicWorkPolicy.UPDATE, periodicRequest); + workManager.enqueueUniqueWork(ONE_TIME_WORK, ExistingWorkPolicy.REPLACE, oneTimeRequest); + } +} diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundWorker.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundWorker.java new file mode 100644 index 00000000..fa01b9ff --- /dev/null +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundWorker.java @@ -0,0 +1,115 @@ +package sh.mailflow.app; + +import android.content.Context; +import android.content.SharedPreferences; +import android.webkit.CookieManager; +import androidx.annotation.NonNull; +import androidx.work.Worker; +import androidx.work.WorkerParameters; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import org.json.JSONArray; +import org.json.JSONObject; + +public class MailFlowBackgroundWorker extends Worker { + private static final String PREFS_NAME = "mailflow-background-sync"; + private static final String PREF_LAST_UNREAD_TOTAL = "lastUnreadTotal"; + + public MailFlowBackgroundWorker(@NonNull Context context, @NonNull WorkerParameters params) { + super(context, params); + } + + static void updateUnreadBaseline(Context context, int unreadTotal) { + if (context == null) return; + context.getApplicationContext() + .getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) + .edit() + .putInt(PREF_LAST_UNREAD_TOTAL, Math.max(0, unreadTotal)) + .apply(); + } + + @NonNull + @Override + public Result doWork() { + Context context = getApplicationContext(); + String host = MailFlowNativePlugin.getSavedHost(context); + if (host == null || host.isEmpty()) return Result.success(); + + String cookie = CookieManager.getInstance().getCookie(host); + if (cookie == null || cookie.trim().isEmpty()) return Result.success(); + + try { + JSONObject counts = getJson(host + "/api/mail/unread-counts", cookie); + int unreadTotal = counts.optInt("total", 0); + + SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); + int lastUnreadTotal = prefs.getInt(PREF_LAST_UNREAD_TOTAL, -1); + + if (lastUnreadTotal >= 0 && unreadTotal > lastUnreadTotal) { + JSONObject latest = getLatestUnreadMessage(host, cookie); + int delta = unreadTotal - lastUnreadTotal; + String title = latest.optString("from_name", latest.optString("from_email", "New mail")); + String body = latest.optString("subject", delta == 1 ? "You have new mail." : delta + " new messages"); + String messageId = latest.optString("id", null); + String accountId = latest.optString("account_id", null); + String folder = latest.optString("folder", "INBOX"); + + MailFlowNativePlugin.postNewMailNotification( + context, + title == null || title.isEmpty() ? "New mail" : title, + body == null || body.isEmpty() ? "You have new mail." : body, + messageId, + accountId, + folder, + null + ); + } + + updateUnreadBaseline(context, unreadTotal); + return Result.success(); + } catch (Exception ignored) { + return Result.retry(); + } + } + + private static JSONObject getLatestUnreadMessage(String host, String cookie) throws Exception { + JSONObject result = getJson(host + "/api/mail/messages?folder=INBOX&limit=1&unreadOnly=true", cookie); + JSONArray messages = result.optJSONArray("messages"); + if (messages == null || messages.length() == 0) return new JSONObject(); + return messages.optJSONObject(0) == null ? new JSONObject() : messages.optJSONObject(0); + } + + private static JSONObject getJson(String url, String cookie) throws Exception { + HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + connection.setRequestMethod("GET"); + connection.setConnectTimeout(15000); + connection.setReadTimeout(15000); + connection.setRequestProperty("Accept", "application/json"); + connection.setRequestProperty("Cookie", cookie); + + int status = connection.getResponseCode(); + InputStream stream = status >= 200 && status < 300 + ? connection.getInputStream() + : connection.getErrorStream(); + String body = readAll(stream); + connection.disconnect(); + + if (status < 200 || status >= 300) { + throw new IllegalStateException("MailFlow background check failed: HTTP " + status); + } + + return new JSONObject(body); + } + + private static String readAll(InputStream stream) throws Exception { + if (stream == null) return "{}"; + StringBuilder result = new StringBuilder(); + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + String line; + while ((line = reader.readLine()) != null) result.append(line); + return result.toString(); + } +} diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index 3ea3694b..514e7a61 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -78,6 +78,7 @@ public void saveHost(PluginCall call) { } getPrefs(getContext()).edit().putString(PREF_HOST, normalizedHost).apply(); + MailFlowBackgroundSync.schedule(getContext()); JSObject result = new JSObject(); result.put("host", normalizedHost); @@ -93,6 +94,11 @@ public void resetHost(PluginCall call) { @PluginMethod public void setUnreadCount(PluginCall call) { + Integer count = call.getInt("count"); + if (count != null) { + MailFlowBackgroundWorker.updateUnreadBaseline(getContext(), count); + MailFlowBackgroundSync.schedule(getContext()); + } call.resolve(); } diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java index 7acf069a..dfed3f6a 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java @@ -29,6 +29,7 @@ public void handleOnBackPressed() { bridge.setWebViewClient(new MailFlowWebViewClient(bridge, this)); String savedHost = MailFlowNativePlugin.getSavedHost(this); if (savedHost != null) { + MailFlowBackgroundSync.schedule(this); bridge.getWebView().post(() -> bridge.getWebView().loadUrl(savedHost)); } } @@ -45,6 +46,7 @@ public void onPause() { @Override public void onStop() { flushCookies(); + MailFlowBackgroundSync.schedule(this); super.onStop(); } diff --git a/frontend/packages/android/variables.gradle b/frontend/packages/android/variables.gradle index ee4ba41c..7d38ad3a 100644 --- a/frontend/packages/android/variables.gradle +++ b/frontend/packages/android/variables.gradle @@ -9,8 +9,9 @@ ext { androidxFragmentVersion = '1.8.9' coreSplashScreenVersion = '1.2.0' androidxWebkitVersion = '1.14.0' + androidxWorkVersion = '2.10.1' junitVersion = '4.13.2' androidxJunitVersion = '1.3.0' androidxEspressoCoreVersion = '3.7.0' cordovaAndroidVersion = '14.0.1' -} \ No newline at end of file +} From ef8dbc17f381270ad7d05810d1633d92455b60ff Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Fri, 29 May 2026 20:19:52 -0300 Subject: [PATCH 77/90] sync quick action without displaying app --- .../android/app/src/main/AndroidManifest.xml | 7 ++++ .../mailflow/app/MailFlowBackgroundSync.java | 19 +++++++++++ .../app/MailFlowBackgroundWorker.java | 33 +++++++++++++++++++ .../sh/mailflow/app/SyncShortcutActivity.java | 14 ++++++++ .../app/src/main/res/values/styles.xml | 6 +++- .../app/src/main/res/xml/shortcuts.xml | 2 +- 6 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 frontend/packages/android/app/src/main/java/sh/mailflow/app/SyncShortcutActivity.java diff --git a/frontend/packages/android/app/src/main/AndroidManifest.xml b/frontend/packages/android/app/src/main/AndroidManifest.xml index d6ccc5d1..a44b5ac3 100644 --- a/frontend/packages/android/app/src/main/AndroidManifest.xml +++ b/frontend/packages/android/app/src/main/AndroidManifest.xml @@ -49,6 +49,13 @@ + + = 200 && status < 300 + ? connection.getInputStream() + : connection.getErrorStream(); + String responseBody = readAll(stream); + connection.disconnect(); + + if (status < 200 || status >= 300) { + throw new IllegalStateException("MailFlow background sync failed: HTTP " + status); + } + + return new JSONObject(responseBody); + } + private static String readAll(InputStream stream) throws Exception { if (stream == null) return "{}"; StringBuilder result = new StringBuilder(); diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/SyncShortcutActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/SyncShortcutActivity.java new file mode 100644 index 00000000..63f2178f --- /dev/null +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/SyncShortcutActivity.java @@ -0,0 +1,14 @@ +package sh.mailflow.app; + +import android.app.Activity; +import android.os.Bundle; + +public class SyncShortcutActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + MailFlowBackgroundSync.syncNow(this); + finish(); + overridePendingTransition(0, 0); + } +} diff --git a/frontend/packages/android/app/src/main/res/values/styles.xml b/frontend/packages/android/app/src/main/res/values/styles.xml index be874e54..6892bf3a 100644 --- a/frontend/packages/android/app/src/main/res/values/styles.xml +++ b/frontend/packages/android/app/src/main/res/values/styles.xml @@ -19,4 +19,8 @@ - \ No newline at end of file + + + diff --git a/frontend/packages/android/app/src/main/res/xml/shortcuts.xml b/frontend/packages/android/app/src/main/res/xml/shortcuts.xml index 530c7738..d9297a93 100644 --- a/frontend/packages/android/app/src/main/res/xml/shortcuts.xml +++ b/frontend/packages/android/app/src/main/res/xml/shortcuts.xml @@ -23,6 +23,6 @@ android:action="android.intent.action.VIEW" android:data="mailflow://sync" android:targetPackage="sh.mailflow.app" - android:targetClass="sh.mailflow.app.MainActivity" /> + android:targetClass="sh.mailflow.app.SyncShortcutActivity" /> From 8b80814cac1043e36825d4cb7de70011cac1d9c8 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Fri, 29 May 2026 20:42:28 -0300 Subject: [PATCH 78/90] revert Commit d71d10e --- .../android/app/src/main/AndroidManifest.xml | 7 ---- .../mailflow/app/MailFlowBackgroundSync.java | 19 ----------- .../app/MailFlowBackgroundWorker.java | 33 ------------------- .../sh/mailflow/app/SyncShortcutActivity.java | 14 -------- .../app/src/main/res/values/styles.xml | 4 --- .../app/src/main/res/xml/shortcuts.xml | 2 +- 6 files changed, 1 insertion(+), 78 deletions(-) delete mode 100644 frontend/packages/android/app/src/main/java/sh/mailflow/app/SyncShortcutActivity.java diff --git a/frontend/packages/android/app/src/main/AndroidManifest.xml b/frontend/packages/android/app/src/main/AndroidManifest.xml index a44b5ac3..d6ccc5d1 100644 --- a/frontend/packages/android/app/src/main/AndroidManifest.xml +++ b/frontend/packages/android/app/src/main/AndroidManifest.xml @@ -49,13 +49,6 @@ - - = 200 && status < 300 - ? connection.getInputStream() - : connection.getErrorStream(); - String responseBody = readAll(stream); - connection.disconnect(); - - if (status < 200 || status >= 300) { - throw new IllegalStateException("MailFlow background sync failed: HTTP " + status); - } - - return new JSONObject(responseBody); - } - private static String readAll(InputStream stream) throws Exception { if (stream == null) return "{}"; StringBuilder result = new StringBuilder(); diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/SyncShortcutActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/SyncShortcutActivity.java deleted file mode 100644 index 63f2178f..00000000 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/SyncShortcutActivity.java +++ /dev/null @@ -1,14 +0,0 @@ -package sh.mailflow.app; - -import android.app.Activity; -import android.os.Bundle; - -public class SyncShortcutActivity extends Activity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - MailFlowBackgroundSync.syncNow(this); - finish(); - overridePendingTransition(0, 0); - } -} diff --git a/frontend/packages/android/app/src/main/res/values/styles.xml b/frontend/packages/android/app/src/main/res/values/styles.xml index 6892bf3a..abf55cf2 100644 --- a/frontend/packages/android/app/src/main/res/values/styles.xml +++ b/frontend/packages/android/app/src/main/res/values/styles.xml @@ -19,8 +19,4 @@ - - diff --git a/frontend/packages/android/app/src/main/res/xml/shortcuts.xml b/frontend/packages/android/app/src/main/res/xml/shortcuts.xml index d9297a93..530c7738 100644 --- a/frontend/packages/android/app/src/main/res/xml/shortcuts.xml +++ b/frontend/packages/android/app/src/main/res/xml/shortcuts.xml @@ -23,6 +23,6 @@ android:action="android.intent.action.VIEW" android:data="mailflow://sync" android:targetPackage="sh.mailflow.app" - android:targetClass="sh.mailflow.app.SyncShortcutActivity" /> + android:targetClass="sh.mailflow.app.MainActivity" /> From f161a8ed452ef5d02d73b5a65c29942d2e0d5a1b Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Fri, 29 May 2026 20:51:57 -0300 Subject: [PATCH 79/90] implement android updater --- .../android/app/src/main/AndroidManifest.xml | 1 + .../sh/mailflow/app/MailFlowNativePlugin.java | 364 ++++++++++++++++++ frontend/packages/electron/main.cjs | 2 +- .../components/ElectronNotificationBridge.jsx | 5 + frontend/src/utils/capacitorNativeBridge.js | 15 + 5 files changed, 386 insertions(+), 1 deletion(-) diff --git a/frontend/packages/android/app/src/main/AndroidManifest.xml b/frontend/packages/android/app/src/main/AndroidManifest.xml index d6ccc5d1..d76d1e70 100644 --- a/frontend/packages/android/app/src/main/AndroidManifest.xml +++ b/frontend/packages/android/app/src/main/AndroidManifest.xml @@ -64,4 +64,5 @@ + diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index 514e7a61..5612855b 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -11,12 +11,14 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; +import android.os.Environment; import android.provider.Settings; import android.webkit.JavascriptInterface; import android.webkit.WebView; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.content.ContextCompat; +import androidx.core.content.FileProvider; import com.getcapacitor.JSArray; import com.getcapacitor.JSObject; import com.getcapacitor.PermissionState; @@ -26,13 +28,21 @@ import com.getcapacitor.PluginCall; import com.getcapacitor.PluginMethod; import com.getcapacitor.annotation.CapacitorPlugin; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; import java.net.URI; import java.net.URLDecoder; +import java.net.URL; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.json.JSONException; import org.json.JSONObject; @@ -50,9 +60,14 @@ public class MailFlowNativePlugin extends Plugin { private static final String PREFS_NAME = "mailflow-native"; private static final String PREF_HOST = "host"; private static final String SETUP_URL = "file:///android_asset/public/index.html"; + private static final String UPDATE_RELEASE_URL = "https://api.github.com/repos/dcoffin88/mailflow/releases/latest"; + private static final String UPDATE_ERROR_MESSAGE = "Could not check for MailFlow updates. Please visit the website instead."; + private static final Pattern VERSION_PATTERN = Pattern.compile("\\d+(?:\\.\\d+){0,2}"); private static final List pendingActions = new ArrayList<>(); private static MailFlowNativePlugin instance; + private ReleaseInfo updateInfo = null; + private File downloadedUpdate = null; @Override public void load() { @@ -102,6 +117,73 @@ public void setUnreadCount(PluginCall call) { call.resolve(); } + @PluginMethod + public void checkForUpdates(PluginCall call) { + boolean verbose = Boolean.TRUE.equals(call.getBoolean("verbose")); + if (verbose) { + sendUpdateStatus(updateStatus("checking")); + } + + new Thread(() -> { + try { + ReleaseInfo release = fetchLatestRelease(); + if (!isNewerVersion(release.version, getInstalledVersion())) { + if (verbose) { + sendUpdateStatus(updateStatus("up-to-date")); + } + + JSObject result = new JSObject(); + result.put("updateAvailable", false); + call.resolve(result); + return; + } + + if (release.downloadUrl == null) { + sendUpdateError("A MailFlow update is available, but no Android APK was found."); + JSObject result = new JSObject(); + result.put("updateAvailable", true); + result.put("downloadAvailable", false); + call.resolve(result); + return; + } + + updateInfo = release; + downloadedUpdate = null; + sendUpdateStatus(updateStatus("available", release.toStatusData())); + + JSObject result = new JSObject(); + result.put("updateAvailable", true); + result.put("downloadAvailable", true); + call.resolve(result); + + downloadUpdate(release); + } catch (Exception error) { + sendUpdateError(UPDATE_ERROR_MESSAGE); + JSObject result = new JSObject(); + result.put("updateAvailable", false); + result.put("error", error.getMessage()); + call.resolve(result); + } + }).start(); + } + + @PluginMethod + public void installDownloadedUpdate(PluginCall call) { + JSObject result = installDownloadedUpdate(); + call.resolve(result); + } + + @PluginMethod + public void openDownloadedUpdate(PluginCall call) { + if (downloadedUpdate == null || !downloadedUpdate.exists()) { + call.resolve(); + return; + } + + installDownloadedUpdate(); + call.resolve(); + } + @PluginMethod public void requestNotificationPermission(PluginCall call) { if (hasNotificationPermission()) { @@ -264,6 +346,13 @@ static void injectCapacitorCompat(WebView webView) { + "var plugin=function(){return window.Capacitor&&window.Capacitor.Plugins&&window.Capacitor.Plugins.MailFlowNative;};" + "var call=function(method,args,fallback){var p=plugin();if(!p||typeof p[method]!=='function')return Promise.resolve(fallback||null);return p[method](args||{}).catch(function(){return fallback||null;});};" + "window.mailflowNative=window.mailflowNative||{};" + + "window.mailflowNative.platform='android';" + + "window.mailflowNative.updates=window.mailflowNative.updates||{};" + + "window.mailflowNative.updates.check=function(verbose){return call('checkForUpdates',{verbose:!!verbose});};" + + "window.mailflowNative.updates.installDownloaded=function(){return call('installDownloadedUpdate',{}, {installed:false,reason:'unavailable'});};" + + "window.mailflowNative.updates.installAuto=window.mailflowNative.updates.installDownloaded;" + + "window.mailflowNative.updates.openDownload=function(){return call('openDownloadedUpdate',{});};" + + "window.mailflowNative.updates.onStatus=function(callback){if(typeof callback!=='function')return function(){};var handler=function(event){callback(event.detail);};window.addEventListener('mailflow:update-status',handler);return function(){window.removeEventListener('mailflow:update-status',handler);};};" + "window.mailflowNative.notifications=window.mailflowNative.notifications||{};" + "window.mailflowNative.notifications.showNewMail=function(notification){if(androidNotifications&&typeof androidNotifications.showNewMail==='function'){androidNotifications.showNewMail(JSON.stringify(notification||{}));return Promise.resolve(null);}return call('showNewMail',notification||{});};" + "window.mailflowNative.notifications.checkPermission=function(){return call('checkNotificationPermission',{},{}).then(function(result){return result&&result.permission||'default';});};" @@ -429,11 +518,286 @@ private static SharedPreferences getPrefs(Context context) { return context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); } + private ReleaseInfo fetchLatestRelease() throws Exception { + JSONObject release = requestJson(UPDATE_RELEASE_URL); + org.json.JSONArray assets = release.optJSONArray("assets"); + JSONObject apkAsset = null; + + if (assets != null) { + for (int i = 0; i < assets.length(); i++) { + JSONObject asset = assets.optJSONObject(i); + if (asset == null) continue; + + String name = asset.optString("name", ""); + String downloadUrl = asset.optString("browser_download_url", ""); + if (name.toLowerCase().endsWith(".apk") && !downloadUrl.isEmpty()) { + apkAsset = asset; + break; + } + } + } + + ReleaseInfo info = new ReleaseInfo(); + info.version = release.optString("tag_name", release.optString("name", "")); + info.releaseName = release.optString("name", info.version); + info.releaseNotes = release.optString("body", ""); + info.releaseDate = release.optString("published_at", ""); + + if (apkAsset != null) { + info.assetName = apkAsset.optString("name", "MailFlow.apk"); + info.downloadUrl = apkAsset.optString("browser_download_url", null); + } + + return info; + } + + private JSONObject requestJson(String url) throws Exception { + HttpURLConnection connection = openConnection(url); + int status = connection.getResponseCode(); + if (status >= 300 && status < 400) { + String location = connection.getHeaderField("Location"); + connection.disconnect(); + if (location != null) return requestJson(location); + } + + if (status < 200 || status >= 300) { + connection.disconnect(); + throw new Exception("Update request failed with status " + status); + } + + try (InputStream stream = connection.getInputStream()) { + return new JSONObject(readStream(stream)); + } finally { + connection.disconnect(); + } + } + + private void downloadUpdate(ReleaseInfo release) { + sendUpdateStatus(updateStatus("downloading")); + + new Thread(() -> { + try { + File directory = getContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS); + if (directory == null) directory = getContext().getCacheDir(); + if (!directory.exists()) directory.mkdirs(); + + File output = uniqueFile(directory, sanitizeApkName(release.assetName)); + HttpURLConnection connection = openConnection(release.downloadUrl); + int status = connection.getResponseCode(); + if (status >= 300 && status < 400 && connection.getHeaderField("Location") != null) { + release.downloadUrl = connection.getHeaderField("Location"); + connection.disconnect(); + downloadUpdate(release); + return; + } + if (status < 200 || status >= 300) { + connection.disconnect(); + throw new Exception("APK download failed with status " + status); + } + + try ( + InputStream input = new BufferedInputStream(connection.getInputStream()); + FileOutputStream outputStream = new FileOutputStream(output) + ) { + byte[] buffer = new byte[8192]; + int read; + while ((read = input.read(buffer)) != -1) { + outputStream.write(buffer, 0, read); + } + } finally { + connection.disconnect(); + } + + downloadedUpdate = output; + sendUpdateStatus(updateStatus("downloaded", release.toStatusData(output.getAbsolutePath()))); + } catch (Exception error) { + sendUpdateError("The MailFlow update could not be downloaded."); + } + }).start(); + } + + private HttpURLConnection openConnection(String url) throws Exception { + HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + connection.setConnectTimeout(15000); + connection.setReadTimeout(30000); + connection.setRequestProperty("Accept", "application/vnd.github+json"); + connection.setRequestProperty("User-Agent", "MailFlow/" + getInstalledVersion()); + return connection; + } + + private String getInstalledVersion() { + try { + return getContext() + .getPackageManager() + .getPackageInfo(getContext().getPackageName(), 0) + .versionName; + } catch (Exception ignored) { + return "0.0.0"; + } + } + + private JSObject installDownloadedUpdate() { + JSObject result = new JSObject(); + + if (downloadedUpdate == null || !downloadedUpdate.exists()) { + result.put("installed", false); + result.put("reason", "missing-download"); + return result; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !getContext().getPackageManager().canRequestPackageInstalls()) { + openInstallPermissionSettings(); + result.put("installed", false); + result.put("reason", "permission-required"); + return result; + } + + try { + Uri uri = FileProvider.getUriForFile( + getContext(), + getContext().getPackageName() + ".fileprovider", + downloadedUpdate + ); + Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); + intent.setData(uri); + intent.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true); + intent.putExtra(Intent.EXTRA_RETURN_RESULT, true); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + + getActivity().startActivity(intent); + result.put("installed", true); + return result; + } catch (Exception error) { + sendUpdateError("The update was downloaded, but MailFlow could not start the installer."); + result.put("installed", false); + result.put("reason", "launch-failed"); + result.put("error", error.getMessage()); + return result; + } + } + + private void openInstallPermissionSettings() { + Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES) + .setData(Uri.parse("package:" + getContext().getPackageName())); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + getContext().startActivity(intent); + } + + private void sendUpdateError(String message) { + JSObject status = updateStatus("error"); + status.put("message", message); + sendUpdateStatus(status); + } + + private void sendUpdateStatus(JSObject status) { + notifyListeners("updateStatus", status); + + if (getBridge() == null || getBridge().getWebView() == null) return; + String script = "(function(status){" + + "window.dispatchEvent(new CustomEvent('mailflow:update-status',{detail:status}));" + + "window.postMessage({type:'mailflow:update-status',payload:status},'*');" + + "})(" + status.toString() + ");"; + getBridge().getWebView().post(() -> getBridge().getWebView().evaluateJavascript(script, null)); + } + + private JSObject updateStatus(String type) { + JSObject status = new JSObject(); + status.put("type", type); + return status; + } + + private JSObject updateStatus(String type, JSObject data) { + JSObject status = updateStatus(type); + status.put("data", data); + return status; + } + + private static boolean isNewerVersion(String candidate, String current) { + int[] next = parseVersion(candidate); + int[] installed = parseVersion(current); + if (next == null || installed == null) return false; + + for (int i = 0; i < 3; i++) { + if (next[i] > installed[i]) return true; + if (next[i] < installed[i]) return false; + } + + return false; + } + + private static int[] parseVersion(String value) { + Matcher matcher = VERSION_PATTERN.matcher(value == null ? "" : value); + if (!matcher.find()) return null; + + String[] parts = matcher.group().split("\\."); + int[] version = new int[] { 0, 0, 0 }; + for (int i = 0; i < Math.min(parts.length, 3); i++) { + try { + version[i] = Integer.parseInt(parts[i]); + } catch (NumberFormatException ignored) { + return null; + } + } + return version; + } + + private static String readStream(InputStream stream) throws Exception { + StringBuilder builder = new StringBuilder(); + byte[] buffer = new byte[8192]; + int read; + while ((read = stream.read(buffer)) != -1) { + builder.append(new String(buffer, 0, read, "UTF-8")); + } + return builder.toString(); + } + + private static File uniqueFile(File directory, String filename) { + File file = new File(directory, filename); + if (!file.exists()) return file; + + String base = filename.replaceFirst("\\.apk$", ""); + for (int i = 1; i < 1000; i++) { + file = new File(directory, base + " (" + i + ").apk"); + if (!file.exists()) return file; + } + return new File(directory, base + "-" + UUID.randomUUID() + ".apk"); + } + + private static String sanitizeApkName(String value) { + String name = value == null ? "MailFlow.apk" : value.replaceAll("[^A-Za-z0-9._ -]", "_"); + if (!name.toLowerCase().endsWith(".apk")) name += ".apk"; + return name; + } + private static boolean isConfiguredHost(Context context, String url) { String host = getSavedHost(context); return host != null && url != null && url.startsWith(host); } + private static class ReleaseInfo { + String version; + String releaseName; + String releaseNotes; + String releaseDate; + String assetName; + String downloadUrl; + + JSObject toStatusData() { + return toStatusData(null); + } + + JSObject toStatusData(String filePath) { + JSObject data = new JSObject(); + data.put("releaseNotes", releaseNotes); + data.put("releaseName", releaseName); + data.put("releaseDate", releaseDate); + data.put("updateUrl", downloadUrl); + data.put("manual", true); + if (filePath != null) data.put("filePath", filePath); + return data; + } + } + private static void createNotificationChannel(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return; diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 6c06f99b..219efeb6 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -6,7 +6,7 @@ const path = require('path'); const CONFIG_FILE = 'mailflow-host.json'; const UPDATE_STATUS_CHANNEL = 'mailflow:updates:status'; -const UPDATE_RELEASE_URL = 'https://api.github.com/repos/maathimself/mailflow/releases/latest'; +const UPDATE_RELEASE_URL = 'https://api.github.com/repos/dcoffin88/mailflow/releases/latest'; const UPDATE_ERROR_MESSAGE = 'Could not check for MailFlow updates. Please visit the website instead.'; const NATIVE_ACTION_CHANNEL = 'mailflow:native-action'; const NATIVE_ACTION_ARG = '--mailflow-action='; diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index c029e1f9..e9a99f8c 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -70,6 +70,11 @@ export default function ElectronNotificationBridge() { }; }, [addNotification]); + useEffect(() => { + if (window.mailflowNative?.platform !== 'android') return; + window.mailflowNative?.updates?.check?.(false)?.catch?.(() => {}); + }, []); + useEffect(() => { const runNativeAction = async (payload) => { const action = typeof payload === 'string' ? payload : payload?.action; diff --git a/frontend/src/utils/capacitorNativeBridge.js b/frontend/src/utils/capacitorNativeBridge.js index 82a753c2..46084c9d 100644 --- a/frontend/src/utils/capacitorNativeBridge.js +++ b/frontend/src/utils/capacitorNativeBridge.js @@ -28,6 +28,7 @@ export function installCapacitorNativeBridge() { if (installed || window.mailflowNative || !Capacitor.isNativePlatform()) return; window.mailflowNative = { + platform: 'android', getHost: async () => { const result = await callNative('getHost', undefined, {}); return result?.host || null; @@ -40,6 +41,20 @@ export function installCapacitorNativeBridge() { badges: { setUnreadCount: async (count) => callNative('setUnreadCount', { count }), }, + updates: { + check: async (verbose) => callNative('checkForUpdates', { verbose }), + installDownloaded: async () => callNative('installDownloadedUpdate', undefined, { installed: false, reason: 'unavailable' }), + installAuto: async () => callNative('installDownloadedUpdate', undefined, { installed: false, reason: 'unavailable' }), + openDownload: async () => callNative('openDownloadedUpdate'), + onStatus: (callback) => { + if (pluginUnavailable) return () => {}; + const MailFlowNative = getPlugin(); + const handlePromise = MailFlowNative.addListener('updateStatus', callback).catch(() => null); + return () => { + handlePromise.then((handle) => handle?.remove?.()).catch(() => {}); + }; + }, + }, notifications: { checkPermission: async () => { const result = await callNative('checkNotificationPermission', undefined, {}); From 53aeae40900bca50ece7cd6084f6bc5fc16ab035 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Fri, 29 May 2026 21:44:26 -0300 Subject: [PATCH 80/90] enable AlertDialog for update flow --- .../sh/mailflow/app/MailFlowNativePlugin.java | 148 ++++++++++++++++-- .../java/sh/mailflow/app/MainActivity.java | 11 ++ 2 files changed, 142 insertions(+), 17 deletions(-) diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index 5612855b..dc861e84 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -4,6 +4,7 @@ import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; +import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; @@ -13,6 +14,7 @@ import android.os.Build; import android.os.Environment; import android.provider.Settings; +import android.util.Log; import android.webkit.JavascriptInterface; import android.webkit.WebView; import androidx.core.app.NotificationCompat; @@ -56,7 +58,10 @@ public class MailFlowNativePlugin extends Plugin { static final String ACTION_OPEN_MESSAGE = "sh.mailflow.app.OPEN_MESSAGE"; static final String ACTION_COMPOSE = "sh.mailflow.app.COMPOSE"; static final String ACTION_SYNC = "sh.mailflow.app.SYNC"; + static final String ACTION_INSTALL_UPDATE = "sh.mailflow.app.INSTALL_UPDATE"; + private static final String TAG = "MailFlowUpdater"; private static final String CHANNEL_NEW_MAIL = "mailflow_new_mail"; + private static final String CHANNEL_UPDATES = "mailflow_updates"; private static final String PREFS_NAME = "mailflow-native"; private static final String PREF_HOST = "host"; private static final String SETUP_URL = "file:///android_asset/public/index.html"; @@ -68,11 +73,14 @@ public class MailFlowNativePlugin extends Plugin { private static MailFlowNativePlugin instance; private ReleaseInfo updateInfo = null; private File downloadedUpdate = null; + private boolean updateCheckStarted = false; + private boolean installPendingPermission = false; @Override public void load() { instance = this; createNotificationChannel(getContext()); + checkForUpdatesInBackground(false, null); } @PluginMethod @@ -119,31 +127,51 @@ public void setUnreadCount(PluginCall call) { @PluginMethod public void checkForUpdates(PluginCall call) { - boolean verbose = Boolean.TRUE.equals(call.getBoolean("verbose")); + checkForUpdatesInBackground(Boolean.TRUE.equals(call.getBoolean("verbose")), call); + } + + private void checkForUpdatesInBackground(boolean verbose, PluginCall call) { + if (!verbose && updateCheckStarted) { + if (call != null) { + JSObject result = new JSObject(); + result.put("updateAvailable", false); + result.put("skipped", true); + call.resolve(result); + } + return; + } + + updateCheckStarted = true; if (verbose) { sendUpdateStatus(updateStatus("checking")); } new Thread(() -> { try { + Log.i(TAG, "Checking for updates from " + UPDATE_RELEASE_URL); ReleaseInfo release = fetchLatestRelease(); + Log.i(TAG, "Latest release " + release.version + ", installed " + getInstalledVersion() + ", APK " + release.downloadUrl); if (!isNewerVersion(release.version, getInstalledVersion())) { if (verbose) { sendUpdateStatus(updateStatus("up-to-date")); } - JSObject result = new JSObject(); - result.put("updateAvailable", false); - call.resolve(result); + if (call != null) { + JSObject result = new JSObject(); + result.put("updateAvailable", false); + call.resolve(result); + } return; } if (release.downloadUrl == null) { sendUpdateError("A MailFlow update is available, but no Android APK was found."); - JSObject result = new JSObject(); - result.put("updateAvailable", true); - result.put("downloadAvailable", false); - call.resolve(result); + if (call != null) { + JSObject result = new JSObject(); + result.put("updateAvailable", true); + result.put("downloadAvailable", false); + call.resolve(result); + } return; } @@ -151,18 +179,23 @@ public void checkForUpdates(PluginCall call) { downloadedUpdate = null; sendUpdateStatus(updateStatus("available", release.toStatusData())); - JSObject result = new JSObject(); - result.put("updateAvailable", true); - result.put("downloadAvailable", true); - call.resolve(result); + if (call != null) { + JSObject result = new JSObject(); + result.put("updateAvailable", true); + result.put("downloadAvailable", true); + call.resolve(result); + } downloadUpdate(release); } catch (Exception error) { + Log.e(TAG, "Update check failed", error); sendUpdateError(UPDATE_ERROR_MESSAGE); - JSObject result = new JSObject(); - result.put("updateAvailable", false); - result.put("error", error.getMessage()); - call.resolve(result); + if (call != null) { + JSObject result = new JSObject(); + result.put("updateAvailable", false); + result.put("error", error.getMessage()); + call.resolve(result); + } } }).start(); } @@ -402,6 +435,18 @@ static void sendSyncAction() { dispatchAction(action); } + static void installDownloadedUpdateFromIntent() { + if (instance != null) { + instance.installDownloadedUpdate(); + } + } + + static void resumePendingUpdateInstall() { + if (instance != null) { + instance.continuePendingUpdateInstall(); + } + } + private static void dispatchAction(JSObject action) { synchronized (pendingActions) { pendingActions.add(action); @@ -577,6 +622,7 @@ private void downloadUpdate(ReleaseInfo release) { new Thread(() -> { try { + Log.i(TAG, "Downloading update APK from " + release.downloadUrl); File directory = getContext().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS); if (directory == null) directory = getContext().getCacheDir(); if (!directory.exists()) directory.mkdirs(); @@ -609,8 +655,11 @@ private void downloadUpdate(ReleaseInfo release) { } downloadedUpdate = output; + Log.i(TAG, "Downloaded update APK to " + output.getAbsolutePath()); sendUpdateStatus(updateStatus("downloaded", release.toStatusData(output.getAbsolutePath()))); + showUpdateReadyPrompt(release); } catch (Exception error) { + Log.e(TAG, "Update download failed", error); sendUpdateError("The MailFlow update could not be downloaded."); } }).start(); @@ -640,12 +689,15 @@ private JSObject installDownloadedUpdate() { JSObject result = new JSObject(); if (downloadedUpdate == null || !downloadedUpdate.exists()) { + Log.w(TAG, "Install requested with no downloaded APK"); result.put("installed", false); result.put("reason", "missing-download"); return result; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !getContext().getPackageManager().canRequestPackageInstalls()) { + Log.i(TAG, "Install requires unknown-apps permission"); + installPendingPermission = true; openInstallPermissionSettings(); result.put("installed", false); result.put("reason", "permission-required"); @@ -653,6 +705,7 @@ private JSObject installDownloadedUpdate() { } try { + installPendingPermission = false; Uri uri = FileProvider.getUriForFile( getContext(), getContext().getPackageName() + ".fileprovider", @@ -665,9 +718,11 @@ private JSObject installDownloadedUpdate() { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); getActivity().startActivity(intent); + Log.i(TAG, "Started Android package installer for " + downloadedUpdate.getAbsolutePath()); result.put("installed", true); return result; } catch (Exception error) { + Log.e(TAG, "Could not start package installer", error); sendUpdateError("The update was downloaded, but MailFlow could not start the installer."); result.put("installed", false); result.put("reason", "launch-failed"); @@ -676,6 +731,12 @@ private JSObject installDownloadedUpdate() { } } + private void continuePendingUpdateInstall() { + if (!installPendingPermission || downloadedUpdate == null || !downloadedUpdate.exists()) return; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !getContext().getPackageManager().canRequestPackageInstalls()) return; + installDownloadedUpdate(); + } + private void openInstallPermissionSettings() { Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES) .setData(Uri.parse("package:" + getContext().getPackageName())); @@ -689,6 +750,49 @@ private void sendUpdateError(String message) { sendUpdateStatus(status); } + private void showUpdateReadyPrompt(ReleaseInfo release) { + postUpdateReadyNotification(release); + + if (getActivity() == null || getActivity().isFinishing()) return; + getActivity().runOnUiThread(() -> { + if (getActivity() == null || getActivity().isFinishing()) return; + + new AlertDialog.Builder(getActivity()) + .setTitle("Update ready") + .setMessage("MailFlow " + release.version + " has been downloaded and is ready to install.") + .setPositiveButton("Install", (dialog, which) -> installDownloadedUpdate()) + .setNegativeButton("Later", null) + .show(); + }); + } + + private void postUpdateReadyNotification(ReleaseInfo release) { + Intent intent = new Intent(getContext(), MainActivity.class); + intent.setAction(ACTION_INSTALL_UPDATE); + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); + + PendingIntent pendingIntent = PendingIntent.getActivity( + getContext(), + 1002, + intent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE + ); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(getContext(), CHANNEL_UPDATES) + .setSmallIcon(R.mipmap.ic_launcher) + .setContentTitle("MailFlow update ready") + .setContentText("MailFlow " + release.version + " has been downloaded.") + .setStyle(new NotificationCompat.BigTextStyle().bigText("MailFlow " + release.version + " has been downloaded and is ready to install.")) + .setContentIntent(pendingIntent) + .setAutoCancel(false) + .setOngoing(false) + .setPriority(NotificationCompat.PRIORITY_DEFAULT); + + if (hasNotificationPermission(getContext())) { + NotificationManagerCompat.from(getContext()).notify(1002, builder.build()); + } + } + private void sendUpdateStatus(JSObject status) { notifyListeners("updateStatus", status); @@ -808,7 +912,17 @@ private static void createNotificationChannel(Context context) { ); channel.setDescription("New mail notifications from MailFlow."); NotificationManager manager = context.getSystemService(NotificationManager.class); - if (manager != null) manager.createNotificationChannel(channel); + if (manager != null) { + manager.createNotificationChannel(channel); + + NotificationChannel updatesChannel = new NotificationChannel( + CHANNEL_UPDATES, + "Updates", + NotificationManager.IMPORTANCE_DEFAULT + ); + updatesChannel.setDescription("MailFlow app update notifications."); + manager.createNotificationChannel(updatesChannel); + } } @PermissionCallback diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java index dfed3f6a..04dc1c9a 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java @@ -43,6 +43,12 @@ public void onPause() { super.onPause(); } + @Override + public void onResume() { + super.onResume(); + MailFlowNativePlugin.resumePendingUpdateInstall(); + } + @Override public void onStop() { flushCookies(); @@ -106,6 +112,11 @@ private void handleNativeIntent(Intent intent) { return; } + if (MailFlowNativePlugin.ACTION_INSTALL_UPDATE.equals(action)) { + MailFlowNativePlugin.installDownloadedUpdateFromIntent(); + return; + } + if (Intent.ACTION_VIEW.equals(action) && data != null && "mailflow".equalsIgnoreCase(data.getScheme())) { String route = data.getHost(); if (route == null || route.isEmpty()) { From e6ae870f618ce4ff8ad3dbc6c348221a4d1a9da3 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Fri, 29 May 2026 22:16:24 -0300 Subject: [PATCH 81/90] update from notification install button --- .../sh/mailflow/app/MailFlowNativePlugin.java | 70 ++++++++++++------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index dc861e84..81b3498d 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -1,10 +1,10 @@ package sh.mailflow.app; import android.Manifest; +import android.app.AlertDialog; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; -import android.app.AlertDialog; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; @@ -437,7 +437,7 @@ static void sendSyncAction() { static void installDownloadedUpdateFromIntent() { if (instance != null) { - instance.installDownloadedUpdate(); + instance.showUpdateReadyDialog(); } } @@ -657,7 +657,7 @@ private void downloadUpdate(ReleaseInfo release) { downloadedUpdate = output; Log.i(TAG, "Downloaded update APK to " + output.getAbsolutePath()); sendUpdateStatus(updateStatus("downloaded", release.toStatusData(output.getAbsolutePath()))); - showUpdateReadyPrompt(release); + postUpdateReadyNotification(release); } catch (Exception error) { Log.e(TAG, "Update download failed", error); sendUpdateError("The MailFlow update could not be downloaded."); @@ -737,44 +737,65 @@ private void continuePendingUpdateInstall() { installDownloadedUpdate(); } - private void openInstallPermissionSettings() { - Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES) - .setData(Uri.parse("package:" + getContext().getPackageName())); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - getContext().startActivity(intent); - } + private void showUpdateReadyDialog() { + if (downloadedUpdate == null || !downloadedUpdate.exists()) { + installDownloadedUpdate(); + return; + } - private void sendUpdateError(String message) { - JSObject status = updateStatus("error"); - status.put("message", message); - sendUpdateStatus(status); - } + if (getActivity() == null || getActivity().isFinishing()) { + installDownloadedUpdate(); + return; + } - private void showUpdateReadyPrompt(ReleaseInfo release) { - postUpdateReadyNotification(release); + String version = updateInfo == null || updateInfo.version == null || updateInfo.version.isEmpty() + ? "update" + : updateInfo.version; - if (getActivity() == null || getActivity().isFinishing()) return; getActivity().runOnUiThread(() -> { if (getActivity() == null || getActivity().isFinishing()) return; new AlertDialog.Builder(getActivity()) .setTitle("Update ready") - .setMessage("MailFlow " + release.version + " has been downloaded and is ready to install.") + .setMessage("MailFlow " + version + " has been downloaded and is ready to install.") .setPositiveButton("Install", (dialog, which) -> installDownloadedUpdate()) .setNegativeButton("Later", null) .show(); }); } + private void openInstallPermissionSettings() { + Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES) + .setData(Uri.parse("package:" + getContext().getPackageName())); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + getContext().startActivity(intent); + } + + private void sendUpdateError(String message) { + JSObject status = updateStatus("error"); + status.put("message", message); + sendUpdateStatus(status); + } + private void postUpdateReadyNotification(ReleaseInfo release) { - Intent intent = new Intent(getContext(), MainActivity.class); - intent.setAction(ACTION_INSTALL_UPDATE); - intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); + Intent openIntent = new Intent(getContext(), MainActivity.class); + openIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); - PendingIntent pendingIntent = PendingIntent.getActivity( + PendingIntent openPendingIntent = PendingIntent.getActivity( getContext(), 1002, - intent, + openIntent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE + ); + + Intent installIntent = new Intent(getContext(), MainActivity.class); + installIntent.setAction(ACTION_INSTALL_UPDATE); + installIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); + + PendingIntent installPendingIntent = PendingIntent.getActivity( + getContext(), + 1003, + installIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); @@ -783,7 +804,8 @@ private void postUpdateReadyNotification(ReleaseInfo release) { .setContentTitle("MailFlow update ready") .setContentText("MailFlow " + release.version + " has been downloaded.") .setStyle(new NotificationCompat.BigTextStyle().bigText("MailFlow " + release.version + " has been downloaded and is ready to install.")) - .setContentIntent(pendingIntent) + .setContentIntent(openPendingIntent) + .addAction(R.mipmap.ic_launcher, "Install", installPendingIntent) .setAutoCancel(false) .setOngoing(false) .setPriority(NotificationCompat.PRIORITY_DEFAULT); From 97c7d551f861f4a6df54cab662c0a5931868b969 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Fri, 29 May 2026 22:41:05 -0300 Subject: [PATCH 82/90] android install button update flow --- .../sh/mailflow/app/MailFlowNativePlugin.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index 81b3498d..1cfe8b54 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -64,6 +64,9 @@ public class MailFlowNativePlugin extends Plugin { private static final String CHANNEL_UPDATES = "mailflow_updates"; private static final String PREFS_NAME = "mailflow-native"; private static final String PREF_HOST = "host"; + private static final String PREF_UPDATE_APK_PATH = "update_apk_path"; + private static final String PREF_UPDATE_VERSION = "update_version"; + private static final String PREF_UPDATE_RELEASE_NAME = "update_release_name"; private static final String SETUP_URL = "file:///android_asset/public/index.html"; private static final String UPDATE_RELEASE_URL = "https://api.github.com/repos/dcoffin88/mailflow/releases/latest"; private static final String UPDATE_ERROR_MESSAGE = "Could not check for MailFlow updates. Please visit the website instead."; @@ -80,6 +83,7 @@ public class MailFlowNativePlugin extends Plugin { public void load() { instance = this; createNotificationChannel(getContext()); + restoreDownloadedUpdateState(); checkForUpdatesInBackground(false, null); } @@ -152,6 +156,7 @@ private void checkForUpdatesInBackground(boolean verbose, PluginCall call) { ReleaseInfo release = fetchLatestRelease(); Log.i(TAG, "Latest release " + release.version + ", installed " + getInstalledVersion() + ", APK " + release.downloadUrl); if (!isNewerVersion(release.version, getInstalledVersion())) { + clearDownloadedUpdateState(); if (verbose) { sendUpdateStatus(updateStatus("up-to-date")); } @@ -655,6 +660,7 @@ private void downloadUpdate(ReleaseInfo release) { } downloadedUpdate = output; + persistDownloadedUpdateState(release, output); Log.i(TAG, "Downloaded update APK to " + output.getAbsolutePath()); sendUpdateStatus(updateStatus("downloaded", release.toStatusData(output.getAbsolutePath()))); postUpdateReadyNotification(release); @@ -687,6 +693,7 @@ private String getInstalledVersion() { private JSObject installDownloadedUpdate() { JSObject result = new JSObject(); + restoreDownloadedUpdateState(); if (downloadedUpdate == null || !downloadedUpdate.exists()) { Log.w(TAG, "Install requested with no downloaded APK"); @@ -738,6 +745,8 @@ private void continuePendingUpdateInstall() { } private void showUpdateReadyDialog() { + restoreDownloadedUpdateState(); + if (downloadedUpdate == null || !downloadedUpdate.exists()) { installDownloadedUpdate(); return; @@ -764,6 +773,51 @@ private void showUpdateReadyDialog() { }); } + private void persistDownloadedUpdateState(ReleaseInfo release, File file) { + if (release == null || file == null) return; + + getPrefs(getContext()) + .edit() + .putString(PREF_UPDATE_APK_PATH, file.getAbsolutePath()) + .putString(PREF_UPDATE_VERSION, release.version == null ? "" : release.version) + .putString(PREF_UPDATE_RELEASE_NAME, release.releaseName == null ? "" : release.releaseName) + .apply(); + } + + private void restoreDownloadedUpdateState() { + if (downloadedUpdate != null && downloadedUpdate.exists()) return; + + SharedPreferences prefs = getPrefs(getContext()); + String path = prefs.getString(PREF_UPDATE_APK_PATH, null); + if (path == null || path.isEmpty()) return; + + File file = new File(path); + if (!file.exists()) { + clearDownloadedUpdateState(); + return; + } + + downloadedUpdate = file; + if (updateInfo == null) { + ReleaseInfo restored = new ReleaseInfo(); + restored.version = prefs.getString(PREF_UPDATE_VERSION, ""); + restored.releaseName = prefs.getString(PREF_UPDATE_RELEASE_NAME, restored.version); + restored.assetName = file.getName(); + updateInfo = restored; + } + } + + private void clearDownloadedUpdateState() { + downloadedUpdate = null; + installPendingPermission = false; + getPrefs(getContext()) + .edit() + .remove(PREF_UPDATE_APK_PATH) + .remove(PREF_UPDATE_VERSION) + .remove(PREF_UPDATE_RELEASE_NAME) + .apply(); + } + private void openInstallPermissionSettings() { Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES) .setData(Uri.parse("package:" + getContext().getPackageName())); From 441a00228965c722e5dd816e378eb5176fd2bcd0 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Fri, 29 May 2026 23:02:55 -0300 Subject: [PATCH 83/90] fix in app install button --- .../sh/mailflow/app/MailFlowNativePlugin.java | 38 ++++++++++--------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index 1cfe8b54..fae6a6ad 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -207,19 +207,14 @@ private void checkForUpdatesInBackground(boolean verbose, PluginCall call) { @PluginMethod public void installDownloadedUpdate(PluginCall call) { - JSObject result = installDownloadedUpdate(); + JSObject result = showUpdateReadyDialog(); call.resolve(result); } @PluginMethod public void openDownloadedUpdate(PluginCall call) { - if (downloadedUpdate == null || !downloadedUpdate.exists()) { - call.resolve(); - return; - } - - installDownloadedUpdate(); - call.resolve(); + JSObject result = showUpdateReadyDialog(); + call.resolve(result); } @PluginMethod @@ -691,7 +686,7 @@ private String getInstalledVersion() { } } - private JSObject installDownloadedUpdate() { + private JSObject startDownloadedUpdateInstall() { JSObject result = new JSObject(); restoreDownloadedUpdateState(); @@ -741,20 +736,22 @@ private JSObject installDownloadedUpdate() { private void continuePendingUpdateInstall() { if (!installPendingPermission || downloadedUpdate == null || !downloadedUpdate.exists()) return; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !getContext().getPackageManager().canRequestPackageInstalls()) return; - installDownloadedUpdate(); + startDownloadedUpdateInstall(); } - private void showUpdateReadyDialog() { + private JSObject showUpdateReadyDialog() { + JSObject result = new JSObject(); restoreDownloadedUpdateState(); if (downloadedUpdate == null || !downloadedUpdate.exists()) { - installDownloadedUpdate(); - return; + Log.w(TAG, "Install dialog requested with no downloaded APK"); + result.put("installed", false); + result.put("reason", "missing-download"); + return result; } if (getActivity() == null || getActivity().isFinishing()) { - installDownloadedUpdate(); - return; + return startDownloadedUpdateInstall(); } String version = updateInfo == null || updateInfo.version == null || updateInfo.version.isEmpty() @@ -762,15 +759,22 @@ private void showUpdateReadyDialog() { : updateInfo.version; getActivity().runOnUiThread(() -> { - if (getActivity() == null || getActivity().isFinishing()) return; + if (getActivity() == null || getActivity().isFinishing()) { + startDownloadedUpdateInstall(); + return; + } new AlertDialog.Builder(getActivity()) .setTitle("Update ready") .setMessage("MailFlow " + version + " has been downloaded and is ready to install.") - .setPositiveButton("Install", (dialog, which) -> installDownloadedUpdate()) + .setPositiveButton("Install", (dialog, which) -> startDownloadedUpdateInstall()) .setNegativeButton("Later", null) .show(); }); + + result.put("installed", true); + result.put("dialog", true); + return result; } private void persistDownloadedUpdateState(ReleaseInfo release, File file) { From ccdce8d37b6bf65930976a2088cacd01dd57d75a Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Fri, 29 May 2026 23:29:42 -0300 Subject: [PATCH 84/90] fix capacitor bridge --- .../java/sh/mailflow/app/MailFlowNativePlugin.java | 14 +++++++++++++- frontend/src/utils/capacitorNativeBridge.js | 9 ++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index fae6a6ad..92eb1a05 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -382,7 +382,7 @@ static void injectCapacitorCompat(WebView webView) { + "window.mailflowNative.platform='android';" + "window.mailflowNative.updates=window.mailflowNative.updates||{};" + "window.mailflowNative.updates.check=function(verbose){return call('checkForUpdates',{verbose:!!verbose});};" - + "window.mailflowNative.updates.installDownloaded=function(){return call('installDownloadedUpdate',{}, {installed:false,reason:'unavailable'});};" + + "window.mailflowNative.updates.installDownloaded=function(){if(androidNotifications&&typeof androidNotifications.installDownloadedUpdate==='function'){try{return Promise.resolve(JSON.parse(androidNotifications.installDownloadedUpdate()||'{}'));}catch(e){return Promise.resolve({installed:false,reason:'unavailable'});}}return call('installDownloadedUpdate',{}, {installed:false,reason:'unavailable'});};" + "window.mailflowNative.updates.installAuto=window.mailflowNative.updates.installDownloaded;" + "window.mailflowNative.updates.openDownload=function(){return call('openDownloadedUpdate',{});};" + "window.mailflowNative.updates.onStatus=function(callback){if(typeof callback!=='function')return function(){};var handler=function(event){callback(event.detail);};window.addEventListener('mailflow:update-status',handler);return function(){window.removeEventListener('mailflow:update-status',handler);};};" @@ -1069,6 +1069,18 @@ public void showNewMail(String notificationJson) { ); } catch (JSONException ignored) {} } + + @JavascriptInterface + public String installDownloadedUpdate() { + if (instance == null) { + JSObject result = new JSObject(); + result.put("installed", false); + result.put("reason", "unavailable"); + return result.toString(); + } + + return instance.showUpdateReadyDialog().toString(); + } } private static void putExtra(Intent intent, String key, String value) { diff --git a/frontend/src/utils/capacitorNativeBridge.js b/frontend/src/utils/capacitorNativeBridge.js index 46084c9d..0bf40a98 100644 --- a/frontend/src/utils/capacitorNativeBridge.js +++ b/frontend/src/utils/capacitorNativeBridge.js @@ -25,9 +25,12 @@ async function callNative(method, args, fallback = null) { } export function installCapacitorNativeBridge() { - if (installed || window.mailflowNative || !Capacitor.isNativePlatform()) return; + if (installed || !Capacitor.isNativePlatform()) return; + + const existingBridge = window.mailflowNative || {}; window.mailflowNative = { + ...existingBridge, platform: 'android', getHost: async () => { const result = await callNative('getHost', undefined, {}); @@ -39,9 +42,11 @@ export function installCapacitorNativeBridge() { }, resetHost: async () => callNative('resetHost'), badges: { + ...existingBridge.badges, setUnreadCount: async (count) => callNative('setUnreadCount', { count }), }, updates: { + ...existingBridge.updates, check: async (verbose) => callNative('checkForUpdates', { verbose }), installDownloaded: async () => callNative('installDownloadedUpdate', undefined, { installed: false, reason: 'unavailable' }), installAuto: async () => callNative('installDownloadedUpdate', undefined, { installed: false, reason: 'unavailable' }), @@ -56,6 +61,7 @@ export function installCapacitorNativeBridge() { }, }, notifications: { + ...existingBridge.notifications, checkPermission: async () => { const result = await callNative('checkNotificationPermission', undefined, {}); return result?.permission || 'default'; @@ -68,6 +74,7 @@ export function installCapacitorNativeBridge() { showNewMail: async (notification) => callNative('showNewMail', notification || {}), }, actions: { + ...existingBridge.actions, getPending: async () => { const result = await callNative('getPendingActions', undefined, {}); return result?.actions || []; From e6bca3d5bff5d5ff5a6ead73e7a87db1232b1060 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Sat, 30 May 2026 00:08:18 -0300 Subject: [PATCH 85/90] android notification quick actions --- .../sh/mailflow/app/MailFlowNativePlugin.java | 85 +++++++++++++++ .../java/sh/mailflow/app/MainActivity.java | 15 +++ .../components/ElectronNotificationBridge.jsx | 100 +++++++++++++++--- 3 files changed, 185 insertions(+), 15 deletions(-) diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index 92eb1a05..c0422e2e 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -56,6 +56,9 @@ ) public class MailFlowNativePlugin extends Plugin { static final String ACTION_OPEN_MESSAGE = "sh.mailflow.app.OPEN_MESSAGE"; + static final String ACTION_REPLY_MESSAGE = "sh.mailflow.app.REPLY_MESSAGE"; + static final String ACTION_DELETE_MESSAGE = "sh.mailflow.app.DELETE_MESSAGE"; + static final String ACTION_STAR_MESSAGE = "sh.mailflow.app.STAR_MESSAGE"; static final String ACTION_COMPOSE = "sh.mailflow.app.COMPOSE"; static final String ACTION_SYNC = "sh.mailflow.app.SYNC"; static final String ACTION_INSTALL_UPDATE = "sh.mailflow.app.INSTALL_UPDATE"; @@ -286,6 +289,33 @@ static void postNewMailNotification(Context context, String title, String body, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE ); + PendingIntent replyPendingIntent = messageActionPendingIntent( + context, + notificationId, + ACTION_REPLY_MESSAGE, + messageId, + accountId, + folder, + message + ); + PendingIntent deletePendingIntent = messageActionPendingIntent( + context, + notificationId, + ACTION_DELETE_MESSAGE, + messageId, + accountId, + folder, + message + ); + PendingIntent starPendingIntent = messageActionPendingIntent( + context, + notificationId, + ACTION_STAR_MESSAGE, + messageId, + accountId, + folder, + message + ); NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_NEW_MAIL) .setSmallIcon(R.mipmap.ic_launcher) @@ -293,12 +323,34 @@ static void postNewMailNotification(Context context, String title, String body, .setContentText(body) .setStyle(new NotificationCompat.BigTextStyle().bigText(body)) .setContentIntent(pendingIntent) + .addAction(R.mipmap.ic_launcher, "Reply", replyPendingIntent) + .addAction(R.mipmap.ic_launcher, "Delete", deletePendingIntent) + .addAction(R.mipmap.ic_launcher, "Star", starPendingIntent) .setAutoCancel(true) .setPriority(NotificationCompat.PRIORITY_DEFAULT); NotificationManagerCompat.from(context).notify(notificationId, builder.build()); } + private static PendingIntent messageActionPendingIntent(Context context, int notificationId, String action, String messageId, String accountId, String folder, JSObject message) { + Intent intent = new Intent(context, MainActivity.class); + intent.setAction(action); + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.putExtra("notificationId", notificationId); + putExtra(intent, "messageId", messageId); + putExtra(intent, "accountId", accountId); + putExtra(intent, "folder", folder); + if (message != null) putExtra(intent, "message", message.toString()); + + int requestCode = Math.abs((action + ":" + notificationId).hashCode()); + return PendingIntent.getActivity( + context, + requestCode, + intent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE + ); + } + @PluginMethod public void getPendingActions(PluginCall call) { JSObject result = new JSObject(); @@ -412,6 +464,39 @@ static void sendOpenMessageAction(Intent intent) { dispatchAction(action); } + static void sendReplyMessageAction(Intent intent) { + sendMessageNotificationAction(intent, "reply-message"); + } + + static void sendDeleteMessageAction(Intent intent) { + sendMessageNotificationAction(intent, "delete-message"); + } + + static void sendStarMessageAction(Intent intent) { + sendMessageNotificationAction(intent, "star-message"); + } + + private static void sendMessageNotificationAction(Intent intent, String actionName) { + int notificationId = intent.getIntExtra("notificationId", -1); + if (notificationId != -1 && instance != null) { + NotificationManagerCompat.from(instance.getContext()).cancel(notificationId); + } + + JSObject action = newAction(actionName); + copyStringExtra(intent, action, "messageId"); + copyStringExtra(intent, action, "accountId"); + copyStringExtra(intent, action, "folder"); + + String messageJson = intent.getStringExtra("message"); + if (messageJson != null) { + try { + action.put("message", new JSObject(messageJson)); + } catch (JSONException ignored) {} + } + + dispatchAction(action); + } + static void sendMailtoAction(Uri uri) { JSObject composeData = parseMailto(uri); if (composeData == null) return; diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java index 04dc1c9a..c49b1bc3 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MainActivity.java @@ -102,6 +102,21 @@ private void handleNativeIntent(Intent intent) { return; } + if (MailFlowNativePlugin.ACTION_REPLY_MESSAGE.equals(action)) { + MailFlowNativePlugin.sendReplyMessageAction(intent); + return; + } + + if (MailFlowNativePlugin.ACTION_DELETE_MESSAGE.equals(action)) { + MailFlowNativePlugin.sendDeleteMessageAction(intent); + return; + } + + if (MailFlowNativePlugin.ACTION_STAR_MESSAGE.equals(action)) { + MailFlowNativePlugin.sendStarMessageAction(intent); + return; + } + if (MailFlowNativePlugin.ACTION_COMPOSE.equals(action)) { MailFlowNativePlugin.sendComposeAction(); return; diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index e9a99f8c..7407e2cc 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -76,6 +76,71 @@ export default function ElectronNotificationBridge() { }, []); useEffect(() => { + const getPayloadMessage = (payload) => { + const state = useStore.getState(); + return payload?.message || state.messages.find((item) => item.id === payload?.messageId) || null; + }; + + const openMessageFromPayload = (payload) => { + const messageId = payload?.messageId; + if (!messageId) return null; + + const folder = payload.folder || 'INBOX'; + const message = getPayloadMessage(payload); + const state = useStore.getState(); + + setSearchQuery(''); + if (payload.accountId) { + setSelectedAccount(payload.accountId, folder); + } + + if (message && !state.messages.some((item) => item.id === message.id)) { + useStore.setState((current) => ({ + messages: [{ ...message, account_id: message.account_id || payload.accountId }, ...current.messages], + })); + } + + window.dispatchEvent(new CustomEvent('mailflow:refresh')); + window.setTimeout(() => setSelectedMessage(messageId), 0); + return message; + }; + + const normalizeAddressList = (value) => { + if (Array.isArray(value)) return value; + try { + const parsed = JSON.parse(value || '[]'); + return Array.isArray(parsed) ? parsed : []; + } catch (_) { + return []; + } + }; + + const openReplyFromPayload = (payload) => { + const message = openMessageFromPayload(payload); + if (!message) return; + + const replyTo = normalizeAddressList(message.reply_to); + const replyTarget = replyTo[0]?.email + ? replyTo[0] + : { name: message.from_name || '', email: message.from_email || '' }; + const sender = replyTarget.email ? [replyTarget] : []; + const rawSubject = (message.subject || '').trim(); + const subject = rawSubject.startsWith('Re:') ? rawSubject : rawSubject ? `Re: ${rawSubject}` : 'Re:'; + + openCompose({ + to: sender, + cc: [], + subject, + body: '', + inReplyTo: message.message_id, + references: [message.in_reply_to, message.message_id].filter(Boolean).join(' ').trim() || null, + accountId: message.account_id || payload.accountId, + isReply: true, + originalFrom: sender, + allRecipients: [], + }); + }; + const runNativeAction = async (payload) => { const action = typeof payload === 'string' ? payload : payload?.action; const id = typeof payload === 'object' ? payload?.id : null; @@ -97,26 +162,31 @@ export default function ElectronNotificationBridge() { } if (action === 'open-message') { + openMessageFromPayload(payload); + return; + } + + if (action === 'reply-message') { + openReplyFromPayload(payload); + return; + } + + if (action === 'delete-message') { const messageId = payload?.messageId; if (!messageId) return; - const folder = payload.folder || 'INBOX'; - const message = payload.message; - const state = useStore.getState(); - - setSearchQuery(''); - if (payload.accountId) { - setSelectedAccount(payload.accountId, folder); - } + await api.deleteMessage(messageId); + useStore.getState().removeMessage(messageId); + window.dispatchEvent(new CustomEvent('mailflow:refresh')); + return; + } - if (message && !state.messages.some((item) => item.id === message.id)) { - useStore.setState((current) => ({ - messages: [{ ...message, account_id: message.account_id || payload.accountId }, ...current.messages], - })); - } + if (action === 'star-message') { + const messageId = payload?.messageId; + if (!messageId) return; - window.dispatchEvent(new CustomEvent('mailflow:refresh')); - window.setTimeout(() => setSelectedMessage(messageId), 0); + await api.markStarred(messageId, true); + useStore.getState().updateMessage(messageId, { is_starred: true }); return; } From d38db548235c722545ae23caa633393b8c231993 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Sat, 30 May 2026 00:48:40 -0300 Subject: [PATCH 86/90] optimize android notification action flow --- .../android/app/src/main/AndroidManifest.xml | 4 + .../app/MailFlowBackgroundWorker.java | 2 +- .../sh/mailflow/app/MailFlowNativePlugin.java | 20 +++-- .../MailFlowNotificationActionReceiver.java | 43 +++++++++++ .../app/MailFlowNotificationActionWorker.java | 73 +++++++++++++++++++ .../components/ElectronNotificationBridge.jsx | 2 +- 6 files changed, 134 insertions(+), 10 deletions(-) create mode 100644 frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNotificationActionReceiver.java create mode 100644 frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNotificationActionWorker.java diff --git a/frontend/packages/android/app/src/main/AndroidManifest.xml b/frontend/packages/android/app/src/main/AndroidManifest.xml index d76d1e70..0a0b92c5 100644 --- a/frontend/packages/android/app/src/main/AndroidManifest.xml +++ b/frontend/packages/android/app/src/main/AndroidManifest.xml @@ -58,6 +58,10 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths">
    + + diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundWorker.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundWorker.java index fa01b9ff..d134a54b 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundWorker.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowBackgroundWorker.java @@ -64,7 +64,7 @@ public Result doWork() { messageId, accountId, folder, - null + com.getcapacitor.JSObject.fromJSONObject(latest) ); } diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index c0422e2e..ca75c255 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -333,9 +333,15 @@ static void postNewMailNotification(Context context, String title, String body, } private static PendingIntent messageActionPendingIntent(Context context, int notificationId, String action, String messageId, String accountId, String folder, JSObject message) { - Intent intent = new Intent(context, MainActivity.class); + boolean backgroundAction = ACTION_DELETE_MESSAGE.equals(action) || ACTION_STAR_MESSAGE.equals(action); + Intent intent = new Intent( + context, + backgroundAction ? MailFlowNotificationActionReceiver.class : MainActivity.class + ); intent.setAction(action); - intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); + if (!backgroundAction) { + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); + } intent.putExtra("notificationId", notificationId); putExtra(intent, "messageId", messageId); putExtra(intent, "accountId", accountId); @@ -343,12 +349,10 @@ private static PendingIntent messageActionPendingIntent(Context context, int not if (message != null) putExtra(intent, "message", message.toString()); int requestCode = Math.abs((action + ":" + notificationId).hashCode()); - return PendingIntent.getActivity( - context, - requestCode, - intent, - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE - ); + int flags = PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE; + return backgroundAction + ? PendingIntent.getBroadcast(context, requestCode, intent, flags) + : PendingIntent.getActivity(context, requestCode, intent, flags); } @PluginMethod diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNotificationActionReceiver.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNotificationActionReceiver.java new file mode 100644 index 00000000..8db820e5 --- /dev/null +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNotificationActionReceiver.java @@ -0,0 +1,43 @@ +package sh.mailflow.app; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import androidx.core.app.NotificationManagerCompat; +import androidx.work.Constraints; +import androidx.work.Data; +import androidx.work.NetworkType; +import androidx.work.OneTimeWorkRequest; +import androidx.work.WorkManager; + +public class MailFlowNotificationActionReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (context == null || intent == null) return; + + String action = intent.getAction(); + String messageId = intent.getStringExtra("messageId"); + if (messageId == null || messageId.isEmpty()) return; + if (!MailFlowNativePlugin.ACTION_DELETE_MESSAGE.equals(action) + && !MailFlowNativePlugin.ACTION_STAR_MESSAGE.equals(action)) return; + + int notificationId = intent.getIntExtra("notificationId", -1); + if (notificationId != -1) { + NotificationManagerCompat.from(context).cancel(notificationId); + } + + Constraints constraints = new Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build(); + Data input = new Data.Builder() + .putString(MailFlowNotificationActionWorker.KEY_ACTION, action) + .putString(MailFlowNotificationActionWorker.KEY_MESSAGE_ID, messageId) + .build(); + OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MailFlowNotificationActionWorker.class) + .setInputData(input) + .setConstraints(constraints) + .build(); + + WorkManager.getInstance(context.getApplicationContext()).enqueue(request); + } +} diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNotificationActionWorker.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNotificationActionWorker.java new file mode 100644 index 00000000..2e0dd28e --- /dev/null +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNotificationActionWorker.java @@ -0,0 +1,73 @@ +package sh.mailflow.app; + +import android.content.Context; +import android.webkit.CookieManager; +import androidx.annotation.NonNull; +import androidx.work.Worker; +import androidx.work.WorkerParameters; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +public class MailFlowNotificationActionWorker extends Worker { + static final String KEY_ACTION = "action"; + static final String KEY_MESSAGE_ID = "messageId"; + + public MailFlowNotificationActionWorker(@NonNull Context context, @NonNull WorkerParameters params) { + super(context, params); + } + + @NonNull + @Override + public Result doWork() { + Context context = getApplicationContext(); + String host = MailFlowNativePlugin.getSavedHost(context); + String action = getInputData().getString(KEY_ACTION); + String messageId = getInputData().getString(KEY_MESSAGE_ID); + if (host == null || host.isEmpty() || action == null || messageId == null || messageId.isEmpty()) { + return Result.failure(); + } + + String cookie = CookieManager.getInstance().getCookie(host); + if (cookie == null || cookie.trim().isEmpty()) return Result.failure(); + + try { + if (MailFlowNativePlugin.ACTION_DELETE_MESSAGE.equals(action)) { + request(host + "/api/mail/messages/" + messageId, "DELETE", cookie, null); + } else if (MailFlowNativePlugin.ACTION_STAR_MESSAGE.equals(action)) { + request(host + "/api/mail/messages/" + messageId + "/star", "PATCH", cookie, "{\"starred\":true}"); + } else { + return Result.failure(); + } + + return Result.success(); + } catch (Exception ignored) { + return Result.retry(); + } + } + + private static void request(String url, String method, String cookie, String body) throws Exception { + HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + connection.setRequestMethod(method); + connection.setConnectTimeout(15000); + connection.setReadTimeout(15000); + connection.setRequestProperty("Accept", "application/json"); + connection.setRequestProperty("Cookie", cookie); + + if (body != null) { + byte[] bytes = body.getBytes("UTF-8"); + connection.setDoOutput(true); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setFixedLengthStreamingMode(bytes.length); + try (OutputStream output = connection.getOutputStream()) { + output.write(bytes); + } + } + + int status = connection.getResponseCode(); + connection.disconnect(); + if (status < 200 || status >= 300) { + throw new IllegalStateException("MailFlow notification action failed: HTTP " + status); + } + } +} diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index 7407e2cc..b75959d4 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -116,7 +116,7 @@ export default function ElectronNotificationBridge() { }; const openReplyFromPayload = (payload) => { - const message = openMessageFromPayload(payload); + const message = getPayloadMessage(payload); if (!message) return; const replyTo = normalizeAddressList(message.reply_to); From d8299f6c15ff47d1100eed15e2312b781ddba0a9 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Sat, 30 May 2026 02:24:11 -0300 Subject: [PATCH 87/90] implement notification quick actions for windows and macos --- frontend/packages/electron/main.cjs | 81 ++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 219efeb6..21affcc7 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -1,6 +1,7 @@ -const { app, BrowserWindow, Menu, Tray, nativeImage, ipcMain, shell, dialog, Notification } = require('electron'); +const { app, BrowserWindow, Menu, Tray, nativeImage, ipcMain, shell, dialog, Notification, session } = require('electron'); const { execFileSync, spawn } = require('child_process'); const fs = require('fs'); +const http = require('http'); const https = require('https'); const path = require('path'); @@ -548,6 +549,56 @@ function cleanNotificationText(value, fallback = '') { return `${text.slice(0, NEW_MAIL_NOTIFICATION_MAX_LENGTH - 1)}…`; } +function requestMailFlowApi(url, { method, body } = {}) { + return session.defaultSession.cookies.get({ url: readHost() }) + .then((cookies) => new Promise((resolve, reject) => { + const parsedUrl = new URL(url); + const request = (parsedUrl.protocol === 'http:' ? http : https).request(parsedUrl, { + method, + headers: { + Accept: 'application/json', + Cookie: cookies.map((cookie) => `${cookie.name}=${cookie.value}`).join('; '), + ...(body ? { 'Content-Type': 'application/json' } : {}), + }, + }, (response) => { + response.resume(); + response.on('end', () => { + if (response.statusCode >= 200 && response.statusCode < 300) { + resolve(); + return; + } + + reject(new Error(`Mail action failed with status ${response.statusCode}`)); + }); + }); + + request.on('error', reject); + if (body) request.write(JSON.stringify(body)); + request.end(); + })); +} + +function runBackgroundMailAction(action, messageId) { + const host = readHost(); + if (!host || !messageId) return Promise.resolve(); + + const encodedMessageId = encodeURIComponent(messageId); + if (action === 'delete-message') { + return requestMailFlowApi(`${host}/api/mail/messages/${encodedMessageId}`, { + method: 'DELETE', + }); + } + + if (action === 'star-message') { + return requestMailFlowApi(`${host}/api/mail/messages/${encodedMessageId}/star`, { + method: 'PATCH', + body: { starred: true }, + }); + } + + return Promise.resolve(); +} + function showNewMailNotification({ title, body, count, messageId, accountId, folder, message } = {}) { if (!Notification.isSupported()) { return { shown: false, reason: 'unsupported' }; @@ -560,6 +611,13 @@ function showNewMailNotification({ title, body, count, messageId, accountId, fol body: count > 1 ? `${normalizedBody}\n${count} new messages` : normalizedBody, icon: getIconPath(), silent: true, + ...(process.platform !== 'linux' ? { + actions: [ + { type: 'button', text: 'Reply' }, + { type: 'button', text: 'Delete' }, + { type: 'button', text: 'Star' }, + ], + } : {}), }); notification.on('click', () => { @@ -575,6 +633,27 @@ function showNewMailNotification({ title, body, count, messageId, accountId, fol showMainWindow(); }); + notification.on('action', (event, index) => { + const actionIndex = Number.isInteger(index) ? index : event.actionIndex; + if (!messageId) return; + + if (actionIndex === 0) { + sendNativeAction('reply-message', { + messageId, + accountId, + folder, + message, + }); + return; + } + + const action = actionIndex === 1 ? 'delete-message' : actionIndex === 2 ? 'star-message' : null; + if (!action) return; + + notification.close(); + runBackgroundMailAction(action, messageId) + .catch((error) => console.error(`Could not ${action} from desktop notification:`, error)); + }); notification.show(); return { shown: true }; From e72da4999ebbd8c5b5de76679eb504edee4bbb3f Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Sat, 30 May 2026 02:41:14 -0300 Subject: [PATCH 88/90] fix desktop notification reply to bridge --- .../src/components/ElectronNotificationBridge.jsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/ElectronNotificationBridge.jsx b/frontend/src/components/ElectronNotificationBridge.jsx index b75959d4..bae683c5 100644 --- a/frontend/src/components/ElectronNotificationBridge.jsx +++ b/frontend/src/components/ElectronNotificationBridge.jsx @@ -119,22 +119,27 @@ export default function ElectronNotificationBridge() { const message = getPayloadMessage(payload); if (!message) return; - const replyTo = normalizeAddressList(message.reply_to); + const replyTo = normalizeAddressList(message.reply_to ?? message.replyTo); const replyTarget = replyTo[0]?.email ? replyTo[0] - : { name: message.from_name || '', email: message.from_email || '' }; + : { + name: message.from_name || message.fromName || '', + email: message.from_email || message.fromEmail || '', + }; const sender = replyTarget.email ? [replyTarget] : []; const rawSubject = (message.subject || '').trim(); const subject = rawSubject.startsWith('Re:') ? rawSubject : rawSubject ? `Re: ${rawSubject}` : 'Re:'; + const originalMessageId = message.message_id || message.messageId; + const priorInReplyTo = message.in_reply_to || message.inReplyTo; openCompose({ to: sender, cc: [], subject, body: '', - inReplyTo: message.message_id, - references: [message.in_reply_to, message.message_id].filter(Boolean).join(' ').trim() || null, - accountId: message.account_id || payload.accountId, + inReplyTo: originalMessageId, + references: [priorInReplyTo, originalMessageId].filter(Boolean).join(' ').trim() || null, + accountId: message.account_id || message.accountId || payload.accountId, isReply: true, originalFrom: sender, allRecipients: [], From 16265e110eb930962d93ec48e85b244e9b90b70d Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Sat, 30 May 2026 03:04:55 -0300 Subject: [PATCH 89/90] pre pull request cleanup --- .../app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java | 2 +- frontend/packages/electron/main.cjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java index ca75c255..0cfa1031 100644 --- a/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java +++ b/frontend/packages/android/app/src/main/java/sh/mailflow/app/MailFlowNativePlugin.java @@ -71,7 +71,7 @@ public class MailFlowNativePlugin extends Plugin { private static final String PREF_UPDATE_VERSION = "update_version"; private static final String PREF_UPDATE_RELEASE_NAME = "update_release_name"; private static final String SETUP_URL = "file:///android_asset/public/index.html"; - private static final String UPDATE_RELEASE_URL = "https://api.github.com/repos/dcoffin88/mailflow/releases/latest"; + private static final String UPDATE_RELEASE_URL = "https://api.github.com/repos/maathimself/mailflow/releases/latest"; private static final String UPDATE_ERROR_MESSAGE = "Could not check for MailFlow updates. Please visit the website instead."; private static final Pattern VERSION_PATTERN = Pattern.compile("\\d+(?:\\.\\d+){0,2}"); diff --git a/frontend/packages/electron/main.cjs b/frontend/packages/electron/main.cjs index 21affcc7..1def507a 100644 --- a/frontend/packages/electron/main.cjs +++ b/frontend/packages/electron/main.cjs @@ -7,7 +7,7 @@ const path = require('path'); const CONFIG_FILE = 'mailflow-host.json'; const UPDATE_STATUS_CHANNEL = 'mailflow:updates:status'; -const UPDATE_RELEASE_URL = 'https://api.github.com/repos/dcoffin88/mailflow/releases/latest'; +const UPDATE_RELEASE_URL = 'https://api.github.com/repos/maathimself/mailflow/releases/latest'; const UPDATE_ERROR_MESSAGE = 'Could not check for MailFlow updates. Please visit the website instead.'; const NATIVE_ACTION_CHANNEL = 'mailflow:native-action'; const NATIVE_ACTION_ARG = '--mailflow-action='; From 4bdc2b7a46fe474e765ee2280d7837cc7b2b0cd6 Mon Sep 17 00:00:00 2001 From: Doug Coffin Date: Sat, 30 May 2026 03:55:22 -0300 Subject: [PATCH 90/90] cherrypick node_modules/tmp to 0.2.7 --- frontend/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index fab0bd7d..50c3f70f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -7469,9 +7469,9 @@ } }, "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", "dev": true, "license": "MIT", "engines": {