diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index a8ddc61..8488a98 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -11,18 +11,18 @@ body:
-
-
+
+
@@ -68,8 +68,8 @@ body:
Before creating a new bug report, please keep the following in mind:
- - **Do not submit a duplicate bug report**: Search for existing bug reports [here](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/issues?q=label%3A%22Bug+report%22).
- - **Review the contribution guidelines**: Make sure your bug report adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/blob/main/CONTRIBUTING.md).
+ - **Do not submit a duplicate bug report**: Search for existing bug reports [here](https://github.com/ReVanced/revanced-manager-downloaders/issues?q=label%3A%22Bug+report%22).
+ - **Review the contribution guidelines**: Make sure your bug report adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-manager-downloaders/blob/main/CONTRIBUTING.md).
- **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app).
- type: textarea
attributes:
@@ -79,7 +79,7 @@ body:
- Add steps to reproduce the bug if possible (Step 1. ... Step 2. ...)
- Add images and videos if possible
validations:
- required: true
+ required: true
- type: textarea
attributes:
label: Error logs
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index 7afbdc6..f6baf8b 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -11,18 +11,18 @@ body:
-
-
+
+
@@ -68,8 +68,8 @@ body:
Before creating a new feature request, please keep the following in mind:
- - **Do not submit a duplicate feature request**: Search for existing feature requests [here](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/issues?q=label%3A%22Feature+request%22).
- - **Review the contribution guidelines**: Make sure your feature request adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-manager-apkmirror-downloader/blob/main/CONTRIBUTING.md).
+ - **Do not submit a duplicate feature request**: Search for existing feature requests [here](https://github.com/ReVanced/revanced-manager-downloaders/issues?q=label%3A%22Feature+request%22).
+ - **Review the contribution guidelines**: Make sure your feature request adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-manager-downloaders/blob/main/CONTRIBUTING.md).
- **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app).
- type: textarea
attributes:
diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml
index 536b661..87bd4c2 100644
--- a/.github/workflows/build_pull_request.yml
+++ b/.github/workflows/build_pull_request.yml
@@ -14,7 +14,7 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
with:
- fetch-depth: 0
+ submodules: true
- name: Setup Java
uses: actions/setup-java@v4
@@ -23,9 +23,15 @@ jobs:
java-version: "17"
- name: Cache Gradle
- uses: burrunan/gradle-cache-action@v2
+ uses: burrunan/gradle-cache-action@v3
- name: Build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew build --no-daemon
+
+ - name: Upload artifacts
+ uses: actions/upload-artifact@v4
+ with:
+ name: revanced-manager-downloaders
+ path: downloaders/*/build/outputs/apk/release/*.apk
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 8ec52ab..40af410 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -12,6 +12,8 @@ jobs:
name: Release
permissions:
contents: write
+ id-token: write
+ attestations: write
runs-on: ubuntu-latest
steps:
- name: Checkout
@@ -20,7 +22,7 @@ jobs:
# Make sure the release step uses its own credentials:
# https://github.com/cycjimmy/semantic-release-action#private-packages
persist-credentials: false
- fetch-depth: 0
+ submodules: true
- name: Setup Java
uses: actions/setup-java@v4
@@ -29,12 +31,12 @@ jobs:
java-version: "17"
- name: Cache Gradle
- uses: burrunan/gradle-cache-action@v2
+ uses: burrunan/gradle-cache-action@v3
- name: Build
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: ./gradlew build --no-daemon
+ run: ./gradlew assembleRelease --no-daemon
- name: Setup Node.js
uses: actions/setup-node@v4
@@ -64,3 +66,10 @@ jobs:
KEYSTORE_ENTRY_PASSWORD: ${{ secrets.KEYSTORE_ENTRY_PASSWORD }}
run: |
npx semantic-release
+
+ - name: Attest
+ if: steps.release.outputs.new_release_published == 'true'
+ uses: actions/attest-build-provenance@v2
+ with:
+ subject-name: 'ReVanced Downloader ${{ steps.release.outputs.new_release_git_tag }}'
+ subject-path: downloaders/*/build/outputs/apk/release/*.apk
diff --git a/.gitignore b/.gitignore
index 390ce08..9b6d2bb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,130 +1,16 @@
-### Java template
-# Compiled class file
-*.class
-
-# Log file
-*.log
-
-# BlueJ files
-*.ctxt
-
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
-
-# Package Files #
-*.jar
-*.war
-*.nar
-*.ear
-*.zip
-*.tar.gz
-*.rar
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
-
-### JetBrains template
-# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
-# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
-
-# User-specific stuff
-.idea/**/workspace.xml
-.idea/**/tasks.xml
-.idea/**/usage.statistics.xml
-.idea/**/dictionaries
-.idea/**/shelf
-
-# Generated files
-.idea/**/contentModel.xml
-
-# Sensitive or high-churn files
-.idea/**/dataSources/
-.idea/**/dataSources.ids
-.idea/**/dataSources.local.xml
-.idea/**/sqlDataSources.xml
-.idea/**/dynamic.xml
-.idea/**/uiDesigner.xml
-.idea/**/dbnavigator.xml
-
-# Gradle
-.idea/**/gradle.xml
-.idea/**/libraries
-
-# Gradle and Maven with auto-import
-# When using Gradle or Maven with auto-import, you should exclude module files,
-# since they will be recreated, and may cause churn. Uncomment if using
-# auto-import.
-.idea/artifacts
-.idea/compiler.xml
-.idea/jarRepositories.xml
-.idea/modules.xml
-.idea/*.iml
-.idea/modules
*.iml
-*.ipr
-
-# CMake
-cmake-build-*/
-
-# Mongo Explorer plugin
-.idea/**/mongoSettings.xml
-
-# File-based project format
-*.iws
-
-# IntelliJ
-out/
-
-# mpeltonen/sbt-idea plugin
-.idea_modules/
-
-# JIRA plugin
-atlassian-ide-plugin.xml
-
-# Cursive Clojure plugin
-.idea/replstate.xml
-
-# Crashlytics plugin (for Android Studio and IntelliJ)
-com_crashlytics_export_strings.xml
-crashlytics.properties
-crashlytics-build.properties
-fabric.properties
-
-# Editor-based Rest Client
-.idea/httpRequests
-
-# Android studio 3.1+ serialized cache file
-.idea/caches/build_file_checksums.ser
-
-### Gradle template
.gradle
-**/build/
-!src/**/build/
-
-# Ignore Gradle GUI config
-gradle-app.setting
-
-# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
-!gradle-wrapper.jar
-
-# Cache of project
-.gradletasknamecache
-
-# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
-# gradle/wrapper/gradle-wrapper.properties
-
-# Potentially copyrighted test APK
-*.apk
-
-# Ignore vscode config
-.vscode/
-
-# Dependency directories
-node_modules/
-
-# Ignore IDEA files
-.idea/
-
-.kotlin/
-
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+**/build
+/captures
+.externalNativeBuild
+.cxx
local.properties
+.idea/
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..2b32932
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "arsclib"]
+ path = arsclib
+ url = https://github.com/REAndroid/ARSCLib
diff --git a/.releaserc b/.releaserc
index 6ad60d9..b539863 100644
--- a/.releaserc
+++ b/.releaserc
@@ -32,7 +32,10 @@
{
"assets": [
{
- "path": "build/outputs/apk/release/*.apk?(.asc)",
+ "path": "play-store-downloader/build/outputs/apk/release/play-store-downloader-*.apk?(.asc)",
+ },
+ {
+ "path": "apkmirror-downloader/build/outputs/apk/release/apkmirror-downloader-*.apk?(.asc)",
}
],
successComment: false
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8a7f8a8..7cb60c6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -60,38 +60,38 @@
# 👋 Contribution guidelines
-This document describes how to contribute to ReVanced Manager downloader template.
+This document describes how to contribute to ReVanced Manager Downloaders.
## 📖 Resources to help you get started
* [Our backlog](https://github.com/orgs/ReVanced/projects/12) is where we keep track of what we're working on
-* [Issues](https://github.com/ReVanced/revanced-manager-downloader-template/issues) are where we keep track of bugs and feature requests
+* [Issues](https://github.com/ReVanced/revanced-manager-downloaders/issues) are where we keep track of bugs and feature requests
## 🙏 Submitting a feature request
Features can be requested by opening an issue using the
-[Feature request issue template](https://github.com/ReVanced/revanced-manager-downloader-template/issues/new?assignees=&labels=Feature+request&projects=&template=feature_request.yml&title=feat%3A+).
+[Feature request issue template](https://github.com/ReVanced/revanced-manager-downloaders/issues/new?assignees=&labels=Feature+request&projects=&template=feature_request.yml&title=feat%3A+).
> **Note**
-> Requests can be accepted or rejected at the discretion of maintainers of ReVanced Manager downloader template.
+> Requests can be accepted or rejected at the discretion of maintainers of ReVanced Manager Downloaders.
> Good motivation has to be provided for a request to be accepted.
## 🐞 Submitting a bug report
-If you encounter a bug while using ReVanced Manager downloader template, open an issue using the
-[Bug report issue template](https://github.com/ReVanced/revanced-manager-downloader-template/issues/new?assignees=&labels=Bug+report&projects=&template=bug_report.yml&title=bug%3A+).
+If you encounter a bug while using ReVanced Manager Downloaders, open an issue using the
+[Bug report issue template](https://github.com/ReVanced/revanced-manager-downloaders/issues/new?assignees=&labels=Bug+report&projects=&template=bug_report.yml&title=bug%3A+).
## 📝 How to contribute
1. Before contributing, it is recommended to open an issue to discuss your change
-with the maintainers of ReVanced Manager downloader template. This will help you determine whether your change is acceptable
+with the maintainers of ReVanced Manager Downloaders. This will help you determine whether your change is acceptable
and whether it is worth your time to implement it
2. Development happens on the `dev` branch. Fork the repository and create your branch from `dev`
3. Commit your changes
4. Submit a pull request to the `dev` branch of the repository and reference issues
that your pull request closes in the description of your pull request
5. Our team will review your pull request and provide feedback. Once your pull request is approved,
-it will be merged into the `dev` branch and will be included in the next release of ReVanced Manager downloader template
+it will be merged into the `dev` branch and will be included in the next release of ReVanced Manager Downloaders
-❤️ Thank you for considering contributing to ReVanced Manager downloader template,
+❤️ Thank you for considering contributing to ReVanced Manager Downloaders,
ReVanced
diff --git a/README.md b/README.md
index 0cfbf43..6910822 100644
--- a/README.md
+++ b/README.md
@@ -58,34 +58,43 @@
Continuing the legacy of Vanced
-# 👋🔌 ReVanced Manager APKMirror downloader
+# 👋🔌 ReVanced Manager Downloaders
-
+

-An [APKMirror](https://www.apkmirror.com/) plugin for ReVanced Manager.
+The collection of ReVanced downloaders.
## 🧑💻 Usage
-- Plugins are managed as Android apps. Download and install the APK file from the releases page.
-- After installing, restart ReVanced Manager and enable the plugin in the settings.
-- The plugin will now be usable.
+- A downloader is managed as Android apps. Download and install the APK file from the releases page.
+- After installing, restart ReVanced Manager and enable the downloader in the settings.
+- The downloader will now be usable.
-The plugin works by opening the APKMirror website in an embedded browser. If the search string contains a version, you must select that version. Selecting another version in that situation will cause patching to fail.
+
+### APMMirror Downloader
+This downloader will open an [APKMirror](https://www.apkmirror.com/) page where you can download the apk as you would normally do.
+If the chosen file is a bundle (.apkm file), the downloader will automatically merge it into a .apk file.
+
+### Play Store Downloader
+When you get prompted, log in to Google with your account. After that, you will be able to download apps from the Play Store.
+
+> [!WARNING]
+> Due to technical limitations, it is only possible to download the latest version of the app. If the ReVanced suggested version differs from the latest, the installation will fail.
## 📚 Everything else
### 📙 Contributing
-Thank you for considering contributing to ReVanced Manager APKMirror downloader.
+Thank you for considering contributing to ReVanced Manager Downloaders.
You can find the contribution guidelines [here](CONTRIBUTING.md).
### 🛠️ Building
-To build ReVanced Manager downloader template, a Java Development Kit (JDK) and Git must be installed.
-Follow the steps below to build ReVanced Manager downloader template:
+To build ReVanced Manager Downloaders, a Java Development Kit (JDK) and Git must be installed.
+Follow the steps below to build ReVanced Manager Downloaders:
-1. Run `git clone git@github.com:ReVanced/revanced-manager-apkmirror-downloader.git` to clone the repository
+1. Run `git clone git@github.com:ReVanced/revanced-manager-downloaders.git` to clone the repository
2. Run `gradlew assembleRelease` to build the project
> [!NOTE]
diff --git a/arsclib b/arsclib
new file mode 160000
index 0000000..a44577e
--- /dev/null
+++ b/arsclib
@@ -0,0 +1 @@
+Subproject commit a44577e73f1a9ce150833e96d98cfa299ddae23c
diff --git a/build.gradle.kts b/build.gradle.kts
index 8012b04..f26d53b 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,88 +1,110 @@
+import com.android.build.gradle.AppExtension
+import com.android.build.gradle.internal.api.ApkVariantOutputImpl
+import org.gradle.plugins.signing.SigningExtension
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
plugins {
- alias(libs.plugins.android.application)
- alias(libs.plugins.kotlin.android)
- publishing
- signing
+ alias(libs.plugins.android.application) apply false
+ alias(libs.plugins.kotlin.parcelize) apply false
+ alias(libs.plugins.kotlin.android) apply false
+ alias(libs.plugins.compose.compiler) apply false
}
-dependencies {
- compileOnly(libs.plugin.api)
-}
-
-android {
- val packageName = "app.revanced.manager.plugin.downloader.apkmirror"
-
- namespace = packageName
- compileSdk = 35
-
- defaultConfig {
- applicationId = packageName
- minSdk = 26
- targetSdk = 35
- versionName = version.toString()
- versionCode = versionName!!.filter { it.isDigit() }.toInt()
- }
-
- buildTypes {
- release {
- proguardFiles(
- getDefaultProguardFile("proguard-android-optimize.txt"),
- "proguard-rules.pro",
- )
-
- val keystoreFile = file("keystore.jks")
- signingConfig =
- if (keystoreFile.exists()) {
- signingConfigs.create("release") {
- storeFile = keystoreFile
- storePassword = System.getenv("KEYSTORE_PASSWORD")
- keyAlias = System.getenv("KEYSTORE_ENTRY_ALIAS")
- keyPassword = System.getenv("KEYSTORE_ENTRY_PASSWORD")
- }
- } else {
- signingConfigs["debug"]
- }
- }
- }
-
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
- }
-
- kotlinOptions {
- jvmTarget = "17"
- }
-
- applicationVariants.all {
- outputs.all {
- this as com.android.build.gradle.internal.api.ApkVariantOutputImpl
-
- outputFileName = "${rootProject.name}-$version.apk"
- }
- }
-}
-
-tasks {
- val assembleReleaseSignApk by registering {
- dependsOn("assembleRelease")
-
- val apk = layout.buildDirectory.file("outputs/apk/release/${rootProject.name}-$version.apk")
-
- inputs.file(apk).withPropertyName("input")
- outputs.file(apk.map { it.asFile.resolveSibling("${it.asFile.name}.asc") })
-
- doLast {
- signing {
- useGpgCmd()
- sign(*inputs.files.files.toTypedArray())
+subprojects {
+ repositories {
+ google()
+ mavenCentral()
+ maven {
+ name = "GitHubPackages"
+ url = uri("https://maven.pkg.github.com/revanced/registry")
+ credentials {
+ username = providers.gradleProperty("gpr.user")
+ .getOrElse(System.getenv("GITHUB_ACTOR"))
+ password =
+ providers.gradleProperty("gpr.key").getOrElse(System.getenv("GITHUB_TOKEN"))
}
}
}
- // Used by gradle-semantic-release-plugin.
- // Tracking: https://github.com/KengoTODA/gradle-semantic-release-plugin/issues/435.
- publish {
- dependsOn(assembleReleaseSignApk)
+ if (project.path.endsWith("-downloader")) {
+ apply(plugin = "com.android.application")
+ apply(plugin = "org.jetbrains.kotlin.android")
+ apply(plugin = "maven-publish")
+ apply(plugin = "signing")
+
+ dependencies {
+ "compileOnly"(rootProject.libs.plugin.api)
+ }
+
+ configure {
+ compileSdkVersion(35)
+
+ defaultConfig {
+ minSdk = 26
+ targetSdk = 35
+ versionName = version.toString()
+ versionCode = versionName!!.filter { it.isDigit() }.toInt()
+ }
+
+ buildTypes {
+ getByName("release") {
+ proguardFiles(
+ getDefaultProguardFile("proguard-android-optimize.txt"),
+ "proguard-rules.pro"
+ )
+
+ val keystoreFile = file("${rootDir}/keystore.jks")
+ signingConfig =
+ if (keystoreFile.exists()) {
+ signingConfigs.create("release") {
+ storeFile = keystoreFile
+ storePassword = System.getenv("KEYSTORE_PASSWORD")
+ keyAlias = System.getenv("KEYSTORE_ENTRY_ALIAS")
+ keyPassword = System.getenv("KEYSTORE_ENTRY_PASSWORD")
+ }
+ } else {
+ signingConfigs.getByName("debug")
+ }
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
+ }
+
+ applicationVariants.all {
+ outputs.all {
+ this as ApkVariantOutputImpl
+ outputFileName = "${project.name}-$version.apk"
+ }
+ }
+ }
+
+ tasks.withType().configureEach {
+ kotlinOptions {
+ jvmTarget = "17"
+ }
+ }
+
+ tasks.register("assembleReleaseSignApk") {
+ dependsOn("assembleRelease")
+
+ val apk = layout.buildDirectory.file("outputs/apk/release/${project.name}-$version.apk")
+
+ inputs.file(apk).withPropertyName("input")
+ outputs.file(apk.map { it.asFile.resolveSibling("${it.asFile.name}.asc") })
+
+ doLast {
+ project.configure {
+ useGpgCmd()
+ sign(*inputs.files.files.toTypedArray())
+ }
+ }
+ }
+
+ tasks.named("publish") {
+ dependsOn("assembleReleaseSignApk")
+ }
}
-}
+}
\ No newline at end of file
diff --git a/downloaders/apkmirror-downloader/build.gradle.kts b/downloaders/apkmirror-downloader/build.gradle.kts
new file mode 100644
index 0000000..74a9201
--- /dev/null
+++ b/downloaders/apkmirror-downloader/build.gradle.kts
@@ -0,0 +1,16 @@
+plugins {
+ alias(libs.plugins.kotlin.parcelize)
+}
+
+android {
+ val packageName = "app.revanced.manager.plugin.downloader.apkmirror"
+ namespace = packageName
+ defaultConfig {
+ applicationId = packageName
+ }
+
+ dependencies {
+ implementation(project(":arsclib"))
+ implementation(project(":shared"))
+ }
+}
\ No newline at end of file
diff --git a/downloaders/apkmirror-downloader/src/main/AndroidManifest.xml b/downloaders/apkmirror-downloader/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..149dc26
--- /dev/null
+++ b/downloaders/apkmirror-downloader/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/downloaders/apkmirror-downloader/src/main/kotlin/app/revanced/manager/plugin/downloader/apkmirror/APKMirrorDownloader.kt b/downloaders/apkmirror-downloader/src/main/kotlin/app/revanced/manager/plugin/downloader/apkmirror/APKMirrorDownloader.kt
new file mode 100644
index 0000000..270c580
--- /dev/null
+++ b/downloaders/apkmirror-downloader/src/main/kotlin/app/revanced/manager/plugin/downloader/apkmirror/APKMirrorDownloader.kt
@@ -0,0 +1,110 @@
+@file:Suppress("Unused")
+
+package app.revanced.manager.plugin.downloader.apkmirror
+
+import android.net.Uri
+import android.os.Parcelable
+import android.util.Log
+import app.revanced.manager.plugin.downloader.DownloadUrl
+import app.revanced.manager.plugin.downloader.Downloader
+import app.revanced.manager.plugin.downloader.download
+import app.revanced.manager.plugin.downloader.webview.runWebView
+import app.revanced.manager.plugin.utils.Merger
+import com.reandroid.apk.APKLogger
+import kotlinx.parcelize.Parcelize
+import java.io.File
+import java.net.URI
+import java.nio.file.Files
+import java.util.zip.ZipFile
+import kotlin.io.path.ExperimentalPathApi
+import kotlin.io.path.deleteRecursively
+import kotlin.io.path.outputStream
+
+@Parcelize
+class ApkMirrorApp(
+ val downloadUrl: DownloadUrl,
+ val packageName: String
+) : Parcelable
+
+private object ArscLogger : APKLogger {
+ const val TAG = "ARSCLib"
+
+ override fun logMessage(msg: String) {
+ Log.i(TAG, msg)
+ }
+
+ override fun logError(msg: String, tr: Throwable?) {
+ Log.e(TAG, msg, tr)
+ }
+
+ override fun logVerbose(msg: String) {
+ Log.v(TAG, msg)
+ }
+}
+
+@OptIn(ExperimentalPathApi::class)
+val ApkMirrorDownloader = Downloader {
+ get { packageName, version ->
+ ApkMirrorApp(
+ downloadUrl = runWebView("APKMirror") {
+ download { url, _, userAgent ->
+ finish(
+ DownloadUrl(
+ url,
+ mapOf("User-Agent" to userAgent)
+ )
+ )
+ }
+
+ with(Uri.Builder()) {
+ scheme("https")
+ authority("www.apkmirror.com")
+ mapOf(
+ "post_type" to "app_release",
+ "searchtype" to "apk",
+ "s" to (version?.let { "$packageName $it" } ?: packageName),
+ "bundles%5B%5D" to "apk_files" // bundles[]
+ ).forEach { (key, value) ->
+ appendQueryParameter(key, value)
+ }
+
+ build().toString()
+ }
+ },
+ packageName = packageName
+ ) to version
+ }
+
+ download { app, outputStream ->
+ val workingDir = Files.createTempDirectory("apkmirror_dl")
+ val downloadedFile = workingDir.resolve("${app.packageName}.apk").also {
+ it.outputStream().use { output ->
+ app.downloadUrl.toDownloadResult().first.copyTo(output)
+ }
+ }
+
+ try {
+ if (URI(app.downloadUrl.url).path.substringAfterLast('/').endsWith(".apk")) {
+ Files.copy(downloadedFile, outputStream)
+ } else {
+ val xapkWorkingDir = workingDir.resolve("xapk").also { it.toFile().mkdirs() }
+
+ ZipFile(downloadedFile.toString()).use { zip ->
+ zip.entries().asSequence().forEach { entry ->
+ xapkWorkingDir.resolve(entry.name).also { it.parent.toFile().mkdirs() }.also { outputFile ->
+ zip.getInputStream(entry).use { input ->
+ File(outputFile.toString()).outputStream().use { output ->
+ input.copyTo(output)
+ }
+ }
+ }
+ }
+ }
+
+ Merger.merge(xapkWorkingDir, ArscLogger).writeApk(outputStream)
+ }
+ } finally {
+ workingDir.deleteRecursively()
+ }
+ }
+}
\ No newline at end of file
diff --git a/downloaders/apkmirror-downloader/src/main/res/drawable/ic_launcher_background.xml b/downloaders/apkmirror-downloader/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/downloaders/apkmirror-downloader/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/downloaders/apkmirror-downloader/src/main/res/drawable/ic_launcher_foreground.xml b/downloaders/apkmirror-downloader/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/downloaders/apkmirror-downloader/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/downloaders/apkmirror-downloader/src/main/res/mipmap-anydpi/ic_launcher.xml b/downloaders/apkmirror-downloader/src/main/res/mipmap-anydpi/ic_launcher.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/downloaders/apkmirror-downloader/src/main/res/mipmap-anydpi/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/downloaders/apkmirror-downloader/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/downloaders/apkmirror-downloader/src/main/res/mipmap-anydpi/ic_launcher_round.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/downloaders/apkmirror-downloader/src/main/res/mipmap-anydpi/ic_launcher_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/downloaders/apkmirror-downloader/src/main/res/values/strings.xml b/downloaders/apkmirror-downloader/src/main/res/values/strings.xml
new file mode 100644
index 0000000..6dae166
--- /dev/null
+++ b/downloaders/apkmirror-downloader/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ ReVanced Manager: APKMirror downloader
+
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/build.gradle.kts b/downloaders/play-store-downloader/build.gradle.kts
new file mode 100644
index 0000000..b375148
--- /dev/null
+++ b/downloaders/play-store-downloader/build.gradle.kts
@@ -0,0 +1,34 @@
+plugins {
+ alias(libs.plugins.kotlin.parcelize)
+ alias(libs.plugins.compose.compiler)
+}
+
+android {
+ val packageName = "app.revanced.manager.plugin.downloader.play.store"
+ namespace = packageName
+ defaultConfig {
+ applicationId = packageName
+ }
+
+ dependencies {
+ implementation(libs.gplayapi)
+ implementation(project(":arsclib"))
+ implementation(project(":shared"))
+
+ implementation(libs.ktor.core)
+ implementation(libs.ktor.logging)
+ implementation(libs.ktor.okhttp)
+
+ implementation(libs.compose.activity)
+ implementation(platform(libs.compose.bom))
+ implementation(libs.compose.ui)
+ implementation(libs.compose.ui.tooling)
+ implementation(libs.compose.material3)
+ implementation(libs.compose.webview)
+ }
+
+ buildFeatures {
+ compose = true
+ aidl = true
+ }
+}
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/AndroidManifest.xml b/downloaders/play-store-downloader/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..63ca7d8
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/AndroidManifest.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/aidl/app/revanced/manager/plugin/downloader/play/store/ICredentialProvider.aidl b/downloaders/play-store-downloader/src/main/aidl/app/revanced/manager/plugin/downloader/play/store/ICredentialProvider.aidl
new file mode 100644
index 0000000..10fdcec
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/aidl/app/revanced/manager/plugin/downloader/play/store/ICredentialProvider.aidl
@@ -0,0 +1,10 @@
+// ICredentialProvider.aidl
+package app.revanced.manager.plugin.downloader.play.store;
+
+import app.revanced.manager.plugin.downloader.play.store.data.Credentials;
+import app.revanced.manager.plugin.downloader.play.store.data.ParcelProperties;
+
+interface ICredentialProvider {
+ @nullable Credentials retrieveCredentials();
+ ParcelProperties getProperties();
+}
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/aidl/app/revanced/manager/plugin/downloader/play/store/data/Credentials.aidl b/downloaders/play-store-downloader/src/main/aidl/app/revanced/manager/plugin/downloader/play/store/data/Credentials.aidl
new file mode 100644
index 0000000..59dd539
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/aidl/app/revanced/manager/plugin/downloader/play/store/data/Credentials.aidl
@@ -0,0 +1,4 @@
+// Credentials.aidl
+package app.revanced.manager.plugin.downloader.play.store.data;
+
+parcelable Credentials;
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/aidl/app/revanced/manager/plugin/downloader/play/store/data/ParcelProperties.aidl b/downloaders/play-store-downloader/src/main/aidl/app/revanced/manager/plugin/downloader/play/store/data/ParcelProperties.aidl
new file mode 100644
index 0000000..fef9f80
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/aidl/app/revanced/manager/plugin/downloader/play/store/data/ParcelProperties.aidl
@@ -0,0 +1,4 @@
+// ParcelProperties.aidl
+package app.revanced.manager.plugin.downloader.play.store.data;
+
+parcelable ParcelProperties;
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/PlayStorePlugin.kt b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/PlayStorePlugin.kt
new file mode 100644
index 0000000..f37c1b7
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/PlayStorePlugin.kt
@@ -0,0 +1,118 @@
+package app.revanced.manager.plugin.downloader.play.store
+
+import android.os.Parcelable
+import android.util.Log
+import app.revanced.manager.plugin.downloader.*
+import app.revanced.manager.plugin.downloader.play.store.data.Credentials
+import app.revanced.manager.plugin.downloader.play.store.data.Http
+import app.revanced.manager.plugin.downloader.play.store.service.CredentialProviderService
+import app.revanced.manager.plugin.downloader.play.store.ui.AuthActivity
+import app.revanced.manager.plugin.utils.Merger
+import com.aurora.gplayapi.data.models.File as GPlayFile
+import com.aurora.gplayapi.helpers.AppDetailsHelper
+import com.aurora.gplayapi.helpers.PurchaseHelper
+import com.reandroid.apk.APKLogger
+import io.ktor.client.request.url
+import kotlinx.parcelize.Parcelize
+import java.nio.file.Files
+import java.nio.file.StandardOpenOption
+import java.util.Properties
+import kotlin.io.path.ExperimentalPathApi
+import kotlin.io.path.deleteRecursively
+import kotlin.io.path.listDirectoryEntries
+import kotlin.io.path.outputStream
+
+private val allowedFileTypes = arrayOf(GPlayFile.FileType.BASE, GPlayFile.FileType.SPLIT)
+const val LOG_TAG = "PlayStorePlugin"
+
+private object ArscLogger : APKLogger {
+ const val TAG = "ARSCLib"
+
+ override fun logMessage(msg: String) {
+ Log.i(TAG, msg)
+ }
+
+ override fun logError(msg: String, tr: Throwable?) {
+ Log.e(TAG, msg, tr)
+ }
+
+ override fun logVerbose(msg: String) {
+ Log.v(TAG, msg)
+ }
+}
+
+@Parcelize
+class GPlayApp(
+ val files: List
+) : Parcelable
+
+@Suppress("Unused")
+@OptIn(ExperimentalPathApi::class)
+val playStoreDownloader = Downloader {
+ get { packageName, version ->
+ val (credentials, deviceProps) = useService> { binder ->
+ val credentialProvider = ICredentialProvider.Stub.asInterface(binder)
+ val props = credentialProvider.properties.value
+ credentialProvider.retrieveCredentials()?.let { return@useService it to props }
+
+ try {
+ requestStartActivity()
+ } catch (e: UserInteractionException.Activity.NotCompleted) {
+ if (e.resultCode == AuthActivity.RESULT_FAILED) throw Exception(
+ "Login failed: ${
+ e.intent?.getStringExtra(
+ AuthActivity.FAILURE_MESSAGE_KEY
+ )
+ }"
+ )
+ throw e
+ }
+
+ credentialProvider.retrieveCredentials()?.let { it to props } ?: throw Exception("Could not get credentials")
+ }
+ val authData = credentials.toAuthData(deviceProps)
+
+ val app = try {
+ AppDetailsHelper(authData).using(Http).getAppByPackageName(packageName)
+ } catch (e: Exception) {
+ Log.e(LOG_TAG, "Got exception while trying to get app", e)
+ null
+ }?.takeUnless { version != null && it.versionName != version } ?: return@get null
+ if (!app.isFree) return@get null
+
+ GPlayApp(
+ app.fileList.filterNot { it.url.isBlank() }.ifEmpty {
+ PurchaseHelper(authData).using(Http).purchase(
+ app.packageName,
+ app.versionCode,
+ app.offerType
+ )
+ }
+ ) to app.versionName
+ }
+
+ download { app, outputStream ->
+ val apkDir = Files.createTempDirectory("play_dl")
+ try {
+ if (app.files.isEmpty()) error("No valid files to download")
+ app.files.forEach { file ->
+ if (file.type !in allowedFileTypes) error("${file.name} could not be downloaded because it has an unsupported type: ${file.type.name}")
+ apkDir.resolve(file.name).outputStream(StandardOpenOption.CREATE_NEW)
+ .use { stream ->
+ Http.download(stream) {
+ url(file.url)
+ }
+ }
+ }
+
+ val apkFiles = apkDir.listDirectoryEntries()
+ if (apkFiles.size == 1)
+ Files.copy(apkFiles.first(), outputStream)
+ else
+ Merger.merge(apkDir, ArscLogger).writeApk(outputStream)
+
+ } finally {
+ apkDir.deleteRecursively()
+ }
+ }
+}
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/data/Credentials.kt b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/data/Credentials.kt
new file mode 100644
index 0000000..c254c17
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/data/Credentials.kt
@@ -0,0 +1,35 @@
+package app.revanced.manager.plugin.downloader.play.store.data
+
+import android.content.Context
+import android.os.Parcelable
+import com.aurora.gplayapi.helpers.AuthHelper
+import kotlinx.parcelize.Parcelize
+import java.util.Properties
+
+@Parcelize
+data class Credentials(val email: String, val aasToken: String) : Parcelable {
+ fun toAuthData(deviceProperties: Properties) =
+ AuthHelper.using(Http)
+ .build(email, aasToken, AuthHelper.Token.AAS, properties = deviceProperties)
+}
+
+private fun Context.credentialsSharedPrefs() =
+ getSharedPreferences("credentials", Context.MODE_PRIVATE)
+
+fun Context.saveCredentials(credentials: Credentials) {
+ with(credentialsSharedPrefs().edit()) {
+ putString(EMAIL_KEY, credentials.email)
+ putString(AAS_TOKEN_KEY, credentials.aasToken)
+ apply()
+ }
+}
+
+fun Context.readSavedCredentials() = with(credentialsSharedPrefs()) {
+ val email = getString(EMAIL_KEY, null) ?: return@with null
+ val aasToken = getString(AAS_TOKEN_KEY, null) ?: return@with null
+
+ Credentials(email, aasToken)
+}
+
+private const val EMAIL_KEY = "email"
+private const val AAS_TOKEN_KEY = "aas_token"
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/data/Http.kt b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/data/Http.kt
new file mode 100644
index 0000000..0deaf39
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/data/Http.kt
@@ -0,0 +1,110 @@
+package app.revanced.manager.plugin.downloader.play.store.data
+
+import com.aurora.gplayapi.data.models.PlayResponse
+import com.aurora.gplayapi.network.IHttpClient
+import io.ktor.client.HttpClient
+import io.ktor.client.call.body
+import io.ktor.client.engine.okhttp.OkHttp
+import io.ktor.client.plugins.HttpTimeout
+import io.ktor.client.request.HttpRequestBuilder
+import io.ktor.client.request.headers
+import io.ktor.client.request.parameter
+import io.ktor.client.request.prepareGet
+import io.ktor.client.request.request
+import io.ktor.client.request.setBody
+import io.ktor.client.statement.bodyAsChannel
+import io.ktor.http.HttpMethod
+import io.ktor.utils.io.jvm.javaio.copyTo
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.runBlocking
+import java.io.OutputStream
+
+object Http : IHttpClient {
+ val client = HttpClient(OkHttp) {
+ install(HttpTimeout) {
+ socketTimeoutMillis = 10000
+ }
+ }
+
+ private val _responseCode = MutableStateFlow(100)
+ override val responseCode = _responseCode.asStateFlow()
+
+ suspend inline fun download(
+ outputStream: OutputStream,
+ block: HttpRequestBuilder.() -> Unit
+ ) = client.prepareGet(block).execute {
+ it.bodyAsChannel().copyTo(outputStream)
+ }
+
+ private fun playRequest(
+ method: HttpMethod,
+ url: String,
+ headers: Map,
+ builder: suspend HttpRequestBuilder.() -> Unit = {}
+ ) = runBlocking {
+ val response = client.request(url) {
+ this.method = method
+ this.headers {
+ headers.forEach { (name, value) ->
+ append(name, value)
+ }
+ }
+ builder()
+ }
+
+ _responseCode.apply {
+ // State flows will not emit the same value twice
+ value = 0
+ value = response.status.value
+ }
+
+ val success = response.status.value in 200..299
+ PlayResponse(
+ code = response.status.value,
+ isSuccessful = success,
+ responseBytes = response.body(),
+ errorString = if (!success) response.status.description else ""
+ )
+ }
+
+ override fun get(url: String, headers: Map) =
+ playRequest(HttpMethod.Get, url, headers)
+
+ override fun get(
+ url: String,
+ headers: Map,
+ params: Map
+ ) = playRequest(HttpMethod.Get, url, headers) {
+ params.forEach { (name, value) ->
+ parameter(name, value)
+ }
+ }
+
+ override fun get(url: String, headers: Map, paramString: String) = playRequest(
+ HttpMethod.Get, url + paramString, headers
+ )
+
+ override fun getAuth(url: String) = PlayResponse(
+ isSuccessful = false,
+ code = 444
+ )
+
+ override fun post(url: String, headers: Map, body: ByteArray) = playRequest(
+ HttpMethod.Post, url, headers
+ ) {
+ setBody(body)
+ }
+
+ override fun post(
+ url: String,
+ headers: Map,
+ params: Map
+ ) = playRequest(HttpMethod.Post, url, headers) {
+ params.forEach { (name, value) ->
+ parameter(name, value)
+ }
+ }
+
+ override fun postAuth(url: String, body: ByteArray) = getAuth(url)
+}
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/data/PropertiesProvider.kt b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/data/PropertiesProvider.kt
new file mode 100644
index 0000000..13777d9
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/data/PropertiesProvider.kt
@@ -0,0 +1,197 @@
+package app.revanced.manager.plugin.downloader.play.store.data
+
+import android.app.ActivityManager
+import android.content.Context
+import android.content.res.Configuration
+import android.opengl.EGL14
+import android.opengl.GLES10
+import javax.microedition.khronos.egl.EGL10
+import javax.microedition.khronos.egl.EGLConfig
+import javax.microedition.khronos.egl.EGLContext
+import android.os.Build
+import android.os.Parcelable
+import androidx.core.content.getSystemService
+import kotlinx.parcelize.Parcelize
+import java.util.Properties
+import javax.microedition.khronos.egl.EGLDisplay
+
+@Parcelize
+data class ParcelProperties(val value: Properties) : Parcelable
+
+object PropertiesProvider {
+ fun createDeviceProperties(context: Context) = with(context) {
+ Properties().apply {
+ //Build Props
+ setProperty("UserReadableName", "${Build.DEVICE}-default")
+ setProperty("Build.HARDWARE", Build.HARDWARE)
+ setProperty("Build.RADIO", Build.getRadioVersion() ?: "unknown")
+ setProperty("Build.FINGERPRINT", Build.FINGERPRINT)
+ setProperty("Build.BRAND", Build.BRAND)
+ setProperty("Build.DEVICE", Build.DEVICE)
+ setProperty("Build.VERSION.SDK_INT", "${Build.VERSION.SDK_INT}")
+ setProperty("Build.VERSION.RELEASE", Build.VERSION.RELEASE)
+ setProperty("Build.MODEL", Build.MODEL)
+ setProperty("Build.MANUFACTURER", Build.MANUFACTURER)
+ setProperty("Build.PRODUCT", Build.PRODUCT)
+ setProperty("Build.ID", Build.ID)
+ setProperty("Build.BOOTLOADER", Build.BOOTLOADER)
+
+ val config = resources.configuration
+ setProperty("TouchScreen", "${config.touchscreen}")
+ setProperty("Keyboard", "${config.keyboard}")
+ setProperty("Navigation", "${config.navigation}")
+ setProperty("ScreenLayout", "${config.screenLayout and 15}")
+ setProperty("HasHardKeyboard", "${config.keyboard == Configuration.KEYBOARD_QWERTY}")
+ setProperty(
+ "HasFiveWayNavigation",
+ "${config.navigation == Configuration.NAVIGATIONHIDDEN_YES}"
+ )
+
+ //Display Metrics
+ val metrics = resources.displayMetrics
+ setProperty("Screen.Density", "${metrics.densityDpi}")
+ setProperty("Screen.Width", "${metrics.widthPixels}")
+ setProperty("Screen.Height", "${metrics.heightPixels}")
+
+
+ //Supported Platforms
+ setProperty("Platforms", Build.SUPPORTED_ABIS.commaSeparated())
+ //Supported Features
+ setProperty("Features", features.commaSeparated())
+ //Shared Locales
+ setProperty("Locales", locales.commaSeparated())
+ //Shared Libraries
+ setProperty("SharedLibraries", sharedLibraries.commaSeparated())
+ //GL Extensions
+ setProperty(
+ "GL.Version",
+ getSystemService()!!.deviceConfigurationInfo.reqGlEsVersion.toString()
+ )
+ setProperty(
+ "GL.Extensions",
+ getEglExtensions().commaSeparated()
+ )
+
+ //Google Related Props
+ setProperty("Client", "android-google")
+ setProperty("GSF.version", "203615037")
+ setProperty("Vending.version", "82201710")
+ setProperty("Vending.versionString", "22.0.17-21 [0] [PR] 332555730")
+
+ //MISC
+ setProperty("Roaming", "mobile-notroaming")
+ setProperty("TimeZone", "UTC-10")
+
+ //Telephony (USA 3650 AT&T)
+ setProperty("CellOperator", "310")
+ setProperty("SimOperator", "38")
+ }
+ }
+
+ private fun Array.commaSeparated() = joinToString(separator = ",")
+ private fun Iterable.commaSeparated() = joinToString(separator = ",")
+
+ private val Context.features
+ get() = packageManager.systemAvailableFeatures.map { it.name }
+ .filterNot(String::isNullOrEmpty)
+ private val Context.locales
+ get() = assets.locales.filter(String::isNullOrEmpty).map { it.replace("-", "_") }
+ private val Context.sharedLibraries
+ get() = packageManager.systemSharedLibraryNames.orEmpty().filterNotNull()
+
+ private fun getEglExtensions() = buildSet {
+ val egl = EGLContext.getEGL() as EGL10
+ val display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY)
+ egl.eglInitialize(display, IntArray(2))
+ try {
+ val numConfigsContainer = IntArray(1)
+ if (!egl.eglGetConfigs(display, null, 0, numConfigsContainer)) return@buildSet
+ val numConfigs = numConfigsContainer[0]
+ val configs = arrayOfNulls(numConfigs).apply {
+ if (!egl.eglGetConfigs(
+ display,
+ this,
+ numConfigs,
+ numConfigsContainer
+ )
+ ) return@buildSet
+ }.requireNoNulls()
+
+ configs.forEach {
+ val resultContainer = IntArray(1)
+ egl.eglGetConfigAttrib(display, it, EGL10.EGL_CONFIG_CAVEAT, resultContainer)
+ if (resultContainer[0] == EGL10.EGL_SLOW_CONFIG) return@forEach
+
+ egl.eglGetConfigAttrib(display, it, EGL10.EGL_SURFACE_TYPE, resultContainer)
+ if (EGL10.EGL_PBUFFER_BIT and resultContainer[0] == 0) return@forEach
+
+ egl.eglGetConfigAttrib(display, it, EGL10.EGL_RENDERABLE_TYPE, resultContainer)
+ if (EGL14.EGL_OPENGL_ES_BIT and resultContainer[0] != 0) addEglExtensions(
+ egl,
+ display,
+ it,
+ null,
+ this
+ )
+ if (EGL14.EGL_OPENGL_ES2_BIT and resultContainer[0] != 0) addEglExtensions(
+ egl,
+ display,
+ it,
+ openGlEs2AttribList,
+ this
+ )
+ }
+ } finally {
+ egl.eglTerminate(display)
+ }
+ }
+
+ private fun addEglExtensions(
+ egl: EGL10,
+ eglDisplay: EGLDisplay,
+ eglConfig: EGLConfig,
+ eglContextAttribList: IntArray?,
+ target: MutableSet
+ ) {
+ val eglContext =
+ egl.eglCreateContext(eglDisplay, eglConfig, EGL10.EGL_NO_CONTEXT, eglContextAttribList)
+ if (eglContext === EGL10.EGL_NO_CONTEXT) return
+
+ val eglSurface = egl.eglCreatePbufferSurface(eglDisplay, eglConfig, eglSurfaceAttribList)
+ if (eglSurface === EGL10.EGL_NO_SURFACE) {
+ egl.eglDestroyContext(eglDisplay, eglContext)
+ return
+ }
+
+ egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)
+ val extensionsString = GLES10.glGetString(GLES10.GL_EXTENSIONS)
+ if (!extensionsString.isNullOrEmpty()) {
+ val extensions = extensionsString.split(" ".toRegex())
+ target.addAll(extensions)
+ }
+ egl.eglMakeCurrent(
+ eglDisplay,
+ EGL10.EGL_NO_SURFACE,
+ EGL10.EGL_NO_SURFACE,
+ EGL10.EGL_NO_CONTEXT
+ )
+ egl.eglDestroySurface(eglDisplay, eglSurface)
+ egl.eglDestroyContext(eglDisplay, eglContext)
+ }
+
+ private val eglSurfaceAttribList
+ get() = intArrayOf(
+ EGL10.EGL_WIDTH,
+ EGL10.EGL_PBUFFER_BIT,
+ EGL10.EGL_HEIGHT,
+ EGL10.EGL_PBUFFER_BIT,
+ EGL10.EGL_NONE
+ )
+
+ private val openGlEs2AttribList
+ get() = intArrayOf(
+ EGL14.EGL_CONTEXT_CLIENT_VERSION,
+ EGL10.EGL_PIXMAP_BIT,
+ EGL10.EGL_NONE
+ )
+}
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/service/CredentialProviderService.kt b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/service/CredentialProviderService.kt
new file mode 100644
index 0000000..59730f5
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/service/CredentialProviderService.kt
@@ -0,0 +1,26 @@
+package app.revanced.manager.plugin.downloader.play.store.service
+
+import android.app.Service
+import android.content.Intent
+import android.os.IBinder
+import android.util.Log
+import app.revanced.manager.plugin.downloader.play.store.ICredentialProvider
+import app.revanced.manager.plugin.downloader.play.store.data.ParcelProperties
+import app.revanced.manager.plugin.downloader.play.store.data.PropertiesProvider
+import app.revanced.manager.plugin.downloader.play.store.data.readSavedCredentials
+
+class CredentialProviderService : Service() {
+ private val binder = object : ICredentialProvider.Stub() {
+ override fun retrieveCredentials() = try {
+ readSavedCredentials()
+ } catch (e: Exception) {
+ Log.e("CredentialService", "Got exception while retrieving credentials", e)
+ throw IllegalStateException("An exception was raised when reading credentials")
+ }
+
+ override fun getProperties() =
+ ParcelProperties(PropertiesProvider.createDeviceProperties(this@CredentialProviderService))
+ }
+
+ override fun onBind(intent: Intent): IBinder = binder.asBinder()
+}
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/ui/AuthActivity.kt b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/ui/AuthActivity.kt
new file mode 100644
index 0000000..a830b2d
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/ui/AuthActivity.kt
@@ -0,0 +1,63 @@
+package app.revanced.manager.plugin.downloader.play.store.ui
+
+import android.os.Bundle
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.activity.viewModels
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Scaffold
+import androidx.compose.material3.darkColorScheme
+import androidx.compose.material3.lightColorScheme
+import androidx.compose.ui.Modifier
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.lifecycleScope
+import androidx.lifecycle.repeatOnLifecycle
+import com.kevinnzou.web.WebView
+import com.kevinnzou.web.rememberWebViewState
+import kotlinx.coroutines.launch
+
+class AuthActivity : ComponentActivity() {
+ private val vm: AuthActivityViewModel by viewModels()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ lifecycleScope.launch {
+ repeatOnLifecycle(Lifecycle.State.STARTED) {
+ val (code, intent) = vm.awaitActivityResultCode()
+ setResult(code, intent)
+ finish()
+ }
+ }
+
+ setContent {
+ val colorScheme = if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme()
+
+ MaterialTheme(colorScheme) {
+ Scaffold { paddingValues ->
+ Column(modifier = Modifier.padding(paddingValues)) {
+ val state =
+ rememberWebViewState(url = AuthActivityViewModel.EMBEDDED_SETUP_URL)
+
+ WebView(
+ modifier = Modifier.fillMaxSize(),
+ state = state,
+ onCreated = vm::setupWebView,
+ client = vm.webViewClient
+ )
+ }
+ }
+ }
+
+ }
+ }
+
+ companion object {
+ const val RESULT_FAILED = RESULT_FIRST_USER + 1
+ const val FAILURE_MESSAGE_KEY = "FAIL_MESSAGE"
+ }
+}
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/ui/AuthActivityViewModel.kt b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/ui/AuthActivityViewModel.kt
new file mode 100644
index 0000000..c45ffe9
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/java/app/revanced/manager/plugin/downloader/play/store/ui/AuthActivityViewModel.kt
@@ -0,0 +1,161 @@
+package app.revanced.manager.plugin.downloader.play.store.ui
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.app.Application
+import android.content.Intent
+import android.util.Log
+import android.webkit.CookieManager
+import android.webkit.WebSettings
+import android.webkit.WebView
+import androidx.lifecycle.AndroidViewModel
+import androidx.lifecycle.viewModelScope
+import app.revanced.manager.plugin.downloader.play.store.LOG_TAG
+import app.revanced.manager.plugin.downloader.play.store.data.Credentials
+import app.revanced.manager.plugin.downloader.play.store.data.Http
+import app.revanced.manager.plugin.downloader.play.store.data.PropertiesProvider
+import app.revanced.manager.plugin.downloader.play.store.data.saveCredentials
+import com.aurora.gplayapi.helpers.AuthValidator
+import com.kevinnzou.web.AccompanistWebViewClient
+import io.ktor.client.request.headers
+import io.ktor.client.request.post
+import io.ktor.client.request.setBody
+import io.ktor.client.statement.bodyAsText
+import io.ktor.http.ContentType
+import io.ktor.http.HttpHeaders
+import io.ktor.http.append
+import kotlinx.coroutines.CancellationException
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.job
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import java.util.Locale
+import java.util.StringTokenizer
+
+class AuthActivityViewModel(app: Application) : AndroidViewModel(app) {
+ private val cookieManager = CookieManager.getInstance()!!
+ private val activityResultCode =
+ CompletableDeferred>(parent = viewModelScope.coroutineContext.job)
+
+ val webViewClient = object : AccompanistWebViewClient() {
+ override fun onPageFinished(view: WebView, url: String?) {
+ super.onPageFinished(view, url)
+
+ val cookieString = cookieManager.getCookie(url) ?: return
+ val cookies = buildMap {
+ putAll(cookiePattern.findAll(cookieString).map {
+ val (key, value) = it.destructured
+ key to value
+ })
+ }
+ cookies[OAUTH_COOKIE]?.let { token ->
+ view.evaluateJavascript(EXTRACT_EMAIL_JS) {
+ val email = it.replace("\"".toRegex(), "")
+ getAndSaveAasToken(email, token)
+ }
+ }
+ }
+ }
+
+ init {
+ cookieManager.removeAllCookies(null)
+ }
+
+ suspend fun awaitActivityResultCode() = activityResultCode.await()
+ private fun finishActivity(code: Int, intent: Intent? = null) =
+ activityResultCode.complete(code to intent)
+
+ private fun getAndSaveAasToken(email: String, oauthToken: String) = viewModelScope.launch {
+ try {
+ val response = getAC2DMResponse(email, oauthToken)
+ val aasToken = response["Token"] ?: throw Exception("AC2DM did not return a token")
+ val credentials = Credentials(email, aasToken)
+ val context = getApplication()
+ val deviceProps = PropertiesProvider.createDeviceProperties(context)
+
+ withContext(Dispatchers.IO) {
+ val authData = credentials.toAuthData(deviceProps)
+ val validator = AuthValidator(authData).using(Http)
+
+ if (!validator.isValid()) throw Exception("Credential validation failed")
+ context.saveCredentials(credentials)
+ }
+
+ finishActivity(Activity.RESULT_OK)
+ } catch (e: CancellationException) {
+ throw e
+ } catch (e: Exception) {
+ Log.e(LOG_TAG, "Could not get and save token", e)
+ finishActivity(AuthActivity.RESULT_FAILED, Intent().apply {
+ putExtra(AuthActivity.FAILURE_MESSAGE_KEY, e.message)
+ })
+ }
+ }
+
+ private suspend fun getAC2DMResponse(email: String, oauthToken: String): Map {
+ val locale = Locale.getDefault()
+ val formData = mapOf(
+ "lang" to locale.toString().replace("_", "-"),
+ "google_play_services_version" to PLAY_SERVICES_VERSION_CODE,
+ "sdk_version" to BUILD_VERSION_SDK,
+ "device_country" to locale.country.lowercase(Locale.US),
+ "Email" to email,
+ "service" to "ac2dm",
+ "get_accountid" to 1,
+ "ACCESS_TOKEN" to 1,
+ "callerPkg" to GMS_PACKAGE_NAME,
+ "add_account" to 1,
+ "Token" to oauthToken,
+ "callerSig" to CALLER_SIGNATURE
+ ).entries.joinToString(separator = "&") { (key, value) -> "$key=$value" }
+
+ val response = Http.client.post(TOKEN_AUTH_URL) {
+ headers {
+ set("app", GMS_PACKAGE_NAME)
+ set(HttpHeaders.UserAgent, "")
+ append(HttpHeaders.ContentType, ContentType.Application.FormUrlEncoded)
+ }
+
+ setBody(formData)
+ }
+
+ val body = response.bodyAsText()
+ return buildMap {
+ val st = StringTokenizer(body, "\n\r")
+ while (st.hasMoreTokens()) {
+ val (key, value) = st.nextToken().split("=", limit = 2)
+ put(key, value)
+ }
+ }
+ }
+
+ @SuppressLint("SetJavaScriptEnabled")
+ fun setupWebView(webView: WebView) = webView.apply {
+ cookieManager.acceptThirdPartyCookies(this)
+ cookieManager.setAcceptThirdPartyCookies(this, true)
+
+ settings.apply {
+ safeBrowsingEnabled = false
+ allowContentAccess = true
+ databaseEnabled = true
+ domStorageEnabled = true
+ javaScriptEnabled = true
+ cacheMode = WebSettings.LOAD_DEFAULT
+ }
+ }
+
+
+ companion object Constants {
+ private const val OAUTH_COOKIE = "oauth_token"
+ private const val EXTRACT_EMAIL_JS =
+ "(function() { return document.querySelector('[data-profile-identifier]').innerText; })();"
+ const val EMBEDDED_SETUP_URL = "https://accounts.google.com/EmbeddedSetup"
+ private const val TOKEN_AUTH_URL = "https://android.clients.google.com/auth"
+ private const val BUILD_VERSION_SDK = 28
+ private const val PLAY_SERVICES_VERSION_CODE = 19629032
+ private const val GMS_PACKAGE_NAME = "com.google.android.gms"
+ private const val CALLER_SIGNATURE = "38918a453d07199354f8b19af05ec6562ced5788"
+ private val cookiePattern = "([^=]+)=([^;]*);?\\s?".toRegex()
+ }
+}
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/res/drawable/ic_launcher_background.xml b/downloaders/play-store-downloader/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/downloaders/play-store-downloader/src/main/res/drawable/ic_launcher_foreground.xml b/downloaders/play-store-downloader/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/res/mipmap-anydpi/ic_launcher.xml b/downloaders/play-store-downloader/src/main/res/mipmap-anydpi/ic_launcher.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/res/mipmap-anydpi/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/res/mipmap-anydpi/ic_launcher_round.xml b/downloaders/play-store-downloader/src/main/res/mipmap-anydpi/ic_launcher_round.xml
new file mode 100644
index 0000000..6f3b755
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/res/mipmap-anydpi/ic_launcher_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/res/values/strings.xml b/downloaders/play-store-downloader/src/main/res/values/strings.xml
new file mode 100644
index 0000000..22872d6
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ ReVanced Manager: Play Store downloader
+
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/res/xml/backup_rules.xml b/downloaders/play-store-downloader/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..fa0f996
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/downloaders/play-store-downloader/src/main/res/xml/data_extraction_rules.xml b/downloaders/play-store-downloader/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/downloaders/play-store-downloader/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index c36a1e2..a29e533 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,7 +1,24 @@
+# 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 = -Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. For more details, visit
+# https://developer.android.com/r/tools/gradle-multi-project-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
-android.nonTransitiveRClass = true
-android.nonFinalResIds = false
+# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style = official
-org.gradle.parallel = true
-org.gradle.caching = true
-version = 1.0.0
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass = true
+version = 1.0.0-dev.1
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index fefb0d6..d0dc4be 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,11 +1,36 @@
[versions]
+agp = "8.7.3"
+kotlin = "2.1.10"
+gplayapi = "3.4.4"
+arsclib = "1.3.5"
+kotlinx-coroutines-core = "1.9.0"
+ktor = "2.3.9"
+
+compose-activity = "1.10.1"
+ui-tooling = "1.8.2"
+compose-bom = "2025.06.00"
+material3 = "1.3.2"
+compose-webview = "0.33.6"
+
plugin-api = "1.0.0"
-android-gradle-plugin = "8.7.3"
-kotlin = "2.1.0"
[libraries]
+kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines-core" }
plugin-api = { group = "app.revanced", name = "revanced-manager-downloader-api", version.ref = "plugin-api" }
+gplayapi = { group = "com.auroraoss", name = "gplayapi", version.ref = "gplayapi" }
+arsclib = { group = "io.github.reandroid", name = "ARSCLib", version.ref = "arsclib" }
+compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
+compose-ui = { group = "androidx.compose.ui", name = "ui" }
+compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "ui-tooling" }
+compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "material3" }
+compose-activity = { group = "androidx.activity", name = "activity-compose", version.ref = "compose-activity" }
+compose-webview = { group = "io.github.kevinnzou", name = "compose-webview", version.ref = "compose-webview" }
+ktor-core = { group = "io.ktor", name = "ktor-client-core", version.ref = "ktor" }
+ktor-logging = { group = "io.ktor", name = "ktor-client-logging", version.ref = "ktor" }
+ktor-okhttp = { group = "io.ktor", name = "ktor-client-okhttp", version.ref = "ktor" }
[plugins]
-android-application = { id = "com.android.application", version.ref = "android-gradle-plugin" }
+android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
+kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
+compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 2c35211..e708b1c 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 68e8816..197f2c5 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,8 +1,6 @@
+#Tue Jul 23 17:28:58 CEST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
-networkTimeout=10000
-validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index f5feea6..4f906e0 100755
--- a/gradlew
+++ b/gradlew
@@ -1,7 +1,7 @@
-#!/bin/sh
+#!/usr/bin/env sh
#
-# Copyright © 2015-2021 the original authors.
+# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -15,104 +15,69 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-# SPDX-License-Identifier: Apache-2.0
-#
##############################################################################
-#
-# Gradle start up script for POSIX generated by Gradle.
-#
-# Important for running:
-#
-# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
-# noncompliant, but you have some other compliant shell such as ksh or
-# bash, then to run this script, type that shell name before the whole
-# command line, like:
-#
-# ksh Gradle
-#
-# Busybox and similar reduced shells will NOT work, because this script
-# requires all of these POSIX shell features:
-# * functions;
-# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
-# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
-# * compound commands having a testable exit status, especially «case»;
-# * various built-in commands including «command», «set», and «ulimit».
-#
-# Important for patching:
-#
-# (2) This script targets any POSIX shell, so it avoids extensions provided
-# by Bash, Ksh, etc; in particular arrays are avoided.
-#
-# The "traditional" practice of packing multiple parameters into a
-# space-separated string is a well documented source of bugs and security
-# problems, so this is (mostly) avoided, by progressively accumulating
-# options in "$@", and eventually passing that to Java.
-#
-# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
-# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
-# see the in-line comments for details.
-#
-# There are tweaks for specific operating systems such as AIX, CygWin,
-# Darwin, MinGW, and NonStop.
-#
-# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
-# within the Gradle project.
-#
-# You can find Gradle at https://github.com/gradle/gradle/.
-#
+##
+## Gradle start up script for UN*X
+##
##############################################################################
# Attempt to set APP_HOME
-
# Resolve links: $0 may be a link
-app_path=$0
-
-# Need this for daisy-chained symlinks.
-while
- APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
- [ -h "$app_path" ]
-do
- ls=$( ls -ld "$app_path" )
- link=${ls#*' -> '}
- case $link in #(
- /*) app_path=$link ;; #(
- *) app_path=$APP_HOME$link ;;
- esac
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
-# 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
-' "$PWD" ) || exit
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# 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"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD=maximum
+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 ;;
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -122,9 +87,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
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
+ JAVACMD="$JAVA_HOME/jre/sh/java"
else
- JAVACMD=$JAVA_HOME/bin/java
+ JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -133,120 +98,88 @@ 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.
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || 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
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
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 Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
# 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" )
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=$( cygpath --unix "$JAVACMD" )
+ 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
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
fi
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
-# 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, 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" \
- org.gradle.wrapper.GradleWrapperMain \
- "$@"
-
-# 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' ' '
- )" '"$@"'
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 9d21a21..107acd3 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -13,10 +13,8 @@
@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
+@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -27,8 +25,7 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
-if "%DIRNAME%"=="" set DIRNAME=.
-@rem This is normally unused
+if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@@ -43,13 +40,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
-if %ERRORLEVEL% equ 0 goto execute
+if "%ERRORLEVEL%" == "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
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
goto fail
@@ -59,11 +56,11 @@ 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
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
goto fail
@@ -78,15 +75,13 @@ set CLASSPATH=%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
+if "%ERRORLEVEL%"=="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%
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
diff --git a/package-lock.json b/package-lock.json
index 86564ca..83e816a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"gradle-semantic-release-plugin": "^1.10.1",
- "semantic-release": "^24.1.2"
+ "semantic-release": "^24.2.6"
}
},
"node_modules/@babel/code-frame": {
@@ -1485,11 +1485,10 @@
}
},
"node_modules/@semantic-release/npm": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.1.tgz",
- "integrity": "sha512-/6nntGSUGK2aTOI0rHPwY3ZjgY9FkXmEHbW9Kr+62NVOsyqpKKeP0lrCH+tphv+EsNdJNmqqwijTEnVWUMQ2Nw==",
+ "version": "12.0.2",
+ "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.2.tgz",
+ "integrity": "sha512-+M9/Lb35IgnlUO6OSJ40Ie+hUsZLuph2fqXC/qrKn0fMvUU/jiCjpoL6zEm69vzcmaZJ8yNKtMBEKHWN49WBbQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@semantic-release/error": "^4.0.0",
"aggregate-error": "^5.0.0",
@@ -1498,7 +1497,7 @@
"lodash-es": "^4.17.21",
"nerf-dart": "^1.0.0",
"normalize-url": "^8.0.0",
- "npm": "^10.5.0",
+ "npm": "^10.9.3",
"rc": "^1.2.8",
"read-pkg": "^9.0.0",
"registry-auth-token": "^5.0.0",
@@ -1517,7 +1516,6 @@
"resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz",
"integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=18"
}
@@ -1527,7 +1525,6 @@
"resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
"integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=18"
},
@@ -1540,7 +1537,6 @@
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz",
"integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"clean-stack": "^5.2.0",
"indent-string": "^5.0.0"
@@ -1557,7 +1553,6 @@
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.2.0.tgz",
"integrity": "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==",
"dev": true,
- "license": "MIT",
"dependencies": {
"escape-string-regexp": "5.0.0"
},
@@ -1573,7 +1568,6 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
"integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -1582,24 +1576,23 @@
}
},
"node_modules/@semantic-release/npm/node_modules/execa": {
- "version": "9.4.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-9.4.0.tgz",
- "integrity": "sha512-yKHlle2YGxZE842MERVIplWwNH5VYmqqcPFgtnlU//K8gxuFFXu0pwd/CrfXTumFpeEiufsP7+opT/bPJa1yVw==",
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz",
+ "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@sindresorhus/merge-streams": "^4.0.0",
- "cross-spawn": "^7.0.3",
+ "cross-spawn": "^7.0.6",
"figures": "^6.1.0",
"get-stream": "^9.0.0",
- "human-signals": "^8.0.0",
+ "human-signals": "^8.0.1",
"is-plain-obj": "^4.1.0",
"is-stream": "^4.0.1",
"npm-run-path": "^6.0.0",
- "pretty-ms": "^9.0.0",
+ "pretty-ms": "^9.2.0",
"signal-exit": "^4.1.0",
"strip-final-newline": "^4.0.0",
- "yoctocolors": "^2.0.0"
+ "yoctocolors": "^2.1.1"
},
"engines": {
"node": "^18.19.0 || >=20.5.0"
@@ -1613,7 +1606,6 @@
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz",
"integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@sec-ant/readable-stream": "^0.4.1",
"is-stream": "^4.0.1"
@@ -1626,11 +1618,10 @@
}
},
"node_modules/@semantic-release/npm/node_modules/human-signals": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz",
- "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==",
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz",
+ "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==",
"dev": true,
- "license": "Apache-2.0",
"engines": {
"node": ">=18.18.0"
}
@@ -1640,7 +1631,6 @@
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
"integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -1653,7 +1643,6 @@
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
"integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=18"
},
@@ -1666,7 +1655,6 @@
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz",
"integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"path-key": "^4.0.0",
"unicorn-magic": "^0.3.0"
@@ -1683,7 +1671,6 @@
"resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
"integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -1696,7 +1683,6 @@
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"dev": true,
- "license": "ISC",
"engines": {
"node": ">=14"
},
@@ -1709,7 +1695,6 @@
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
"integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=18"
},
@@ -1722,7 +1707,6 @@
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
"integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=18"
},
@@ -1840,7 +1824,6 @@
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
"integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"environment": "^1.0.0"
},
@@ -1888,8 +1871,7 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/argparse": {
"version": "2.0.1",
@@ -1964,11 +1946,10 @@
}
},
"node_modules/chalk": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
- "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
"dev": true,
- "license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
@@ -2001,7 +1982,6 @@
"resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz",
"integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==",
"dev": true,
- "license": "ISC",
"dependencies": {
"chalk": "^4.0.0",
"highlight.js": "^10.7.1",
@@ -2023,7 +2003,6 @@
"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"
@@ -2040,7 +2019,6 @@
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"dev": true,
- "license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
@@ -2052,7 +2030,6 @@
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
@@ -2071,7 +2048,6 @@
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
"dev": true,
- "license": "ISC",
"engines": {
"node": ">=10"
}
@@ -2256,11 +2232,10 @@
}
},
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "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",
@@ -2557,7 +2532,6 @@
"resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
"integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=18"
},
@@ -2933,7 +2907,6 @@
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
"integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
"dev": true,
- "license": "BSD-3-Clause",
"engines": {
"node": "*"
}
@@ -3460,11 +3433,10 @@
"license": "ISC"
},
"node_modules/marked": {
- "version": "12.0.2",
- "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz",
- "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==",
+ "version": "15.0.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz",
+ "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==",
"dev": true,
- "license": "MIT",
"bin": {
"marked": "bin/marked.js"
},
@@ -3473,24 +3445,36 @@
}
},
"node_modules/marked-terminal": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.1.0.tgz",
- "integrity": "sha512-+pvwa14KZL74MVXjYdPR3nSInhGhNvPce/3mqLVZT2oUvt654sL1XImFuLZ1pkA866IYZ3ikDTOFUIC7XzpZZg==",
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz",
+ "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"ansi-escapes": "^7.0.0",
- "chalk": "^5.3.0",
+ "ansi-regex": "^6.1.0",
+ "chalk": "^5.4.1",
"cli-highlight": "^2.1.11",
"cli-table3": "^0.6.5",
- "node-emoji": "^2.1.3",
- "supports-hyperlinks": "^3.0.0"
+ "node-emoji": "^2.2.0",
+ "supports-hyperlinks": "^3.1.0"
},
"engines": {
"node": ">=16.0.0"
},
"peerDependencies": {
- "marked": ">=1 <14"
+ "marked": ">=1 <16"
+ }
+ },
+ "node_modules/marked-terminal/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/meow": {
@@ -3585,7 +3569,6 @@
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
"any-promise": "^1.0.0",
"object-assign": "^4.0.1",
@@ -3607,11 +3590,10 @@
"license": "MIT"
},
"node_modules/node-emoji": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz",
- "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz",
+ "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@sindresorhus/is": "^4.6.0",
"char-regex": "^1.0.2",
@@ -3664,9 +3646,9 @@
}
},
"node_modules/npm": {
- "version": "10.8.3",
- "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.3.tgz",
- "integrity": "sha512-0IQlyAYvVtQ7uOhDFYZCGK8kkut2nh8cpAdA9E6FvRSJaTgtZRZgNjlC5ZCct//L73ygrpY93CxXpRJDtNqPVg==",
+ "version": "10.9.3",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-10.9.3.tgz",
+ "integrity": "sha512-6Eh1u5Q+kIVXeA8e7l2c/HpnFFcwrkt37xDMujD5be1gloWa9p6j3Fsv3mByXXmqJHy+2cElRMML8opNT7xIJQ==",
"bundleDependencies": [
"@isaacs/string-locale-compare",
"@npmcli/arborist",
@@ -3738,83 +3720,75 @@
"write-file-atomic"
],
"dev": true,
- "license": "Artistic-2.0",
- "workspaces": [
- "docs",
- "smoke-tests",
- "mock-globals",
- "mock-registry",
- "workspaces/*"
- ],
"dependencies": {
"@isaacs/string-locale-compare": "^1.1.0",
- "@npmcli/arborist": "^7.5.4",
- "@npmcli/config": "^8.3.4",
- "@npmcli/fs": "^3.1.1",
- "@npmcli/map-workspaces": "^3.0.6",
- "@npmcli/package-json": "^5.2.0",
- "@npmcli/promise-spawn": "^7.0.2",
- "@npmcli/redact": "^2.0.1",
- "@npmcli/run-script": "^8.1.0",
- "@sigstore/tuf": "^2.3.4",
- "abbrev": "^2.0.0",
+ "@npmcli/arborist": "^8.0.1",
+ "@npmcli/config": "^9.0.0",
+ "@npmcli/fs": "^4.0.0",
+ "@npmcli/map-workspaces": "^4.0.2",
+ "@npmcli/package-json": "^6.2.0",
+ "@npmcli/promise-spawn": "^8.0.2",
+ "@npmcli/redact": "^3.2.2",
+ "@npmcli/run-script": "^9.1.0",
+ "@sigstore/tuf": "^3.1.1",
+ "abbrev": "^3.0.1",
"archy": "~1.0.0",
- "cacache": "^18.0.4",
- "chalk": "^5.3.0",
- "ci-info": "^4.0.0",
+ "cacache": "^19.0.1",
+ "chalk": "^5.4.1",
+ "ci-info": "^4.2.0",
"cli-columns": "^4.0.0",
"fastest-levenshtein": "^1.0.16",
"fs-minipass": "^3.0.3",
"glob": "^10.4.5",
"graceful-fs": "^4.2.11",
- "hosted-git-info": "^7.0.2",
- "ini": "^4.1.3",
- "init-package-json": "^6.0.3",
- "is-cidr": "^5.1.0",
- "json-parse-even-better-errors": "^3.0.2",
- "libnpmaccess": "^8.0.6",
- "libnpmdiff": "^6.1.4",
- "libnpmexec": "^8.1.4",
- "libnpmfund": "^5.0.12",
- "libnpmhook": "^10.0.5",
- "libnpmorg": "^6.0.6",
- "libnpmpack": "^7.0.4",
- "libnpmpublish": "^9.0.9",
- "libnpmsearch": "^7.0.6",
- "libnpmteam": "^6.0.5",
- "libnpmversion": "^6.0.3",
- "make-fetch-happen": "^13.0.1",
+ "hosted-git-info": "^8.1.0",
+ "ini": "^5.0.0",
+ "init-package-json": "^7.0.2",
+ "is-cidr": "^5.1.1",
+ "json-parse-even-better-errors": "^4.0.0",
+ "libnpmaccess": "^9.0.0",
+ "libnpmdiff": "^7.0.1",
+ "libnpmexec": "^9.0.1",
+ "libnpmfund": "^6.0.1",
+ "libnpmhook": "^11.0.0",
+ "libnpmorg": "^7.0.0",
+ "libnpmpack": "^8.0.1",
+ "libnpmpublish": "^10.0.1",
+ "libnpmsearch": "^8.0.0",
+ "libnpmteam": "^7.0.0",
+ "libnpmversion": "^7.0.0",
+ "make-fetch-happen": "^14.0.3",
"minimatch": "^9.0.5",
"minipass": "^7.1.1",
"minipass-pipeline": "^1.2.4",
"ms": "^2.1.2",
- "node-gyp": "^10.2.0",
- "nopt": "^7.2.1",
- "normalize-package-data": "^6.0.2",
- "npm-audit-report": "^5.0.0",
- "npm-install-checks": "^6.3.0",
- "npm-package-arg": "^11.0.3",
- "npm-pick-manifest": "^9.1.0",
- "npm-profile": "^10.0.0",
- "npm-registry-fetch": "^17.1.0",
- "npm-user-validate": "^2.0.1",
- "p-map": "^4.0.0",
- "pacote": "^18.0.6",
- "parse-conflict-json": "^3.0.1",
- "proc-log": "^4.2.0",
+ "node-gyp": "^11.2.0",
+ "nopt": "^8.1.0",
+ "normalize-package-data": "^7.0.0",
+ "npm-audit-report": "^6.0.0",
+ "npm-install-checks": "^7.1.1",
+ "npm-package-arg": "^12.0.2",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-profile": "^11.0.1",
+ "npm-registry-fetch": "^18.0.2",
+ "npm-user-validate": "^3.0.0",
+ "p-map": "^7.0.3",
+ "pacote": "^19.0.1",
+ "parse-conflict-json": "^4.0.0",
+ "proc-log": "^5.0.0",
"qrcode-terminal": "^0.12.0",
- "read": "^3.0.1",
- "semver": "^7.6.3",
+ "read": "^4.1.0",
+ "semver": "^7.7.2",
"spdx-expression-parse": "^4.0.0",
- "ssri": "^10.0.6",
+ "ssri": "^12.0.0",
"supports-color": "^9.4.0",
"tar": "^6.2.1",
"text-table": "~0.2.0",
"tiny-relative-date": "^1.3.0",
"treeverse": "^3.0.0",
- "validate-npm-package-name": "^5.0.1",
- "which": "^4.0.0",
- "write-file-atomic": "^5.0.1"
+ "validate-npm-package-name": "^6.0.1",
+ "which": "^5.0.0",
+ "write-file-atomic": "^6.0.0"
},
"bin": {
"npm": "bin/npm-cli.js",
@@ -3855,7 +3829,7 @@
}
},
"node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": {
- "version": "6.0.1",
+ "version": "6.1.0",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -3904,6 +3878,18 @@
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
+ "node_modules/npm/node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
"node_modules/npm/node_modules/@isaacs/string-locale-compare": {
"version": "1.1.0",
"dev": true,
@@ -3911,7 +3897,7 @@
"license": "ISC"
},
"node_modules/npm/node_modules/@npmcli/agent": {
- "version": "2.2.2",
+ "version": "3.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -3923,48 +3909,48 @@
"socks-proxy-agent": "^8.0.3"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/arborist": {
- "version": "7.5.4",
+ "version": "8.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"@isaacs/string-locale-compare": "^1.1.0",
- "@npmcli/fs": "^3.1.1",
- "@npmcli/installed-package-contents": "^2.1.0",
- "@npmcli/map-workspaces": "^3.0.2",
- "@npmcli/metavuln-calculator": "^7.1.1",
- "@npmcli/name-from-folder": "^2.0.0",
- "@npmcli/node-gyp": "^3.0.0",
- "@npmcli/package-json": "^5.1.0",
- "@npmcli/query": "^3.1.0",
- "@npmcli/redact": "^2.0.0",
- "@npmcli/run-script": "^8.1.0",
- "bin-links": "^4.0.4",
- "cacache": "^18.0.3",
+ "@npmcli/fs": "^4.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/map-workspaces": "^4.0.1",
+ "@npmcli/metavuln-calculator": "^8.0.0",
+ "@npmcli/name-from-folder": "^3.0.0",
+ "@npmcli/node-gyp": "^4.0.0",
+ "@npmcli/package-json": "^6.0.1",
+ "@npmcli/query": "^4.0.0",
+ "@npmcli/redact": "^3.0.0",
+ "@npmcli/run-script": "^9.0.1",
+ "bin-links": "^5.0.0",
+ "cacache": "^19.0.1",
"common-ancestor-path": "^1.0.1",
- "hosted-git-info": "^7.0.2",
- "json-parse-even-better-errors": "^3.0.2",
+ "hosted-git-info": "^8.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
"json-stringify-nice": "^1.1.4",
"lru-cache": "^10.2.2",
"minimatch": "^9.0.4",
- "nopt": "^7.2.1",
- "npm-install-checks": "^6.2.0",
- "npm-package-arg": "^11.0.2",
- "npm-pick-manifest": "^9.0.1",
- "npm-registry-fetch": "^17.0.1",
- "pacote": "^18.0.6",
- "parse-conflict-json": "^3.0.0",
- "proc-log": "^4.2.0",
- "proggy": "^2.0.0",
+ "nopt": "^8.0.0",
+ "npm-install-checks": "^7.1.0",
+ "npm-package-arg": "^12.0.0",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-registry-fetch": "^18.0.1",
+ "pacote": "^19.0.0",
+ "parse-conflict-json": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "proggy": "^3.0.0",
"promise-all-reject-late": "^1.0.0",
"promise-call-limit": "^3.0.1",
- "read-package-json-fast": "^3.0.2",
+ "read-package-json-fast": "^4.0.0",
"semver": "^7.3.7",
- "ssri": "^10.0.6",
+ "ssri": "^12.0.0",
"treeverse": "^3.0.0",
"walk-up-path": "^3.0.1"
},
@@ -3972,30 +3958,30 @@
"arborist": "bin/index.js"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/config": {
- "version": "8.3.4",
+ "version": "9.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/map-workspaces": "^3.0.2",
- "@npmcli/package-json": "^5.1.1",
+ "@npmcli/map-workspaces": "^4.0.1",
+ "@npmcli/package-json": "^6.0.1",
"ci-info": "^4.0.0",
- "ini": "^4.1.2",
- "nopt": "^7.2.1",
- "proc-log": "^4.2.0",
+ "ini": "^5.0.0",
+ "nopt": "^8.0.0",
+ "proc-log": "^5.0.0",
"semver": "^7.3.5",
"walk-up-path": "^3.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/fs": {
- "version": "3.1.1",
+ "version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -4003,160 +3989,190 @@
"semver": "^7.3.5"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/git": {
- "version": "5.0.8",
+ "version": "6.0.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/promise-spawn": "^7.0.0",
- "ini": "^4.1.3",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "ini": "^5.0.0",
"lru-cache": "^10.0.1",
- "npm-pick-manifest": "^9.0.0",
- "proc-log": "^4.0.0",
- "promise-inflight": "^1.0.1",
+ "npm-pick-manifest": "^10.0.0",
+ "proc-log": "^5.0.0",
"promise-retry": "^2.0.1",
"semver": "^7.3.5",
- "which": "^4.0.0"
+ "which": "^5.0.0"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/installed-package-contents": {
- "version": "2.1.0",
+ "version": "3.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "npm-bundled": "^3.0.0",
- "npm-normalize-package-bin": "^3.0.0"
+ "npm-bundled": "^4.0.0",
+ "npm-normalize-package-bin": "^4.0.0"
},
"bin": {
"installed-package-contents": "bin/index.js"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/map-workspaces": {
- "version": "3.0.6",
+ "version": "4.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/name-from-folder": "^2.0.0",
+ "@npmcli/name-from-folder": "^3.0.0",
+ "@npmcli/package-json": "^6.0.0",
"glob": "^10.2.2",
- "minimatch": "^9.0.0",
- "read-package-json-fast": "^3.0.0"
+ "minimatch": "^9.0.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
- "version": "7.1.1",
+ "version": "8.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "cacache": "^18.0.0",
- "json-parse-even-better-errors": "^3.0.0",
- "pacote": "^18.0.0",
- "proc-log": "^4.1.0",
+ "cacache": "^19.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "pacote": "^20.0.0",
+ "proc-log": "^5.0.0",
"semver": "^7.3.5"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/npm/node_modules/@npmcli/name-from-folder": {
- "version": "2.0.0",
+ "node_modules/npm/node_modules/@npmcli/metavuln-calculator/node_modules/pacote": {
+ "version": "20.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^6.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "@npmcli/run-script": "^9.0.0",
+ "cacache": "^19.0.0",
+ "fs-minipass": "^3.0.0",
+ "minipass": "^7.0.2",
+ "npm-package-arg": "^12.0.0",
+ "npm-packlist": "^9.0.0",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-registry-fetch": "^18.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "sigstore": "^3.0.0",
+ "ssri": "^12.0.0",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "pacote": "bin/index.js"
+ },
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/npm/node_modules/@npmcli/node-gyp": {
+ "node_modules/npm/node_modules/@npmcli/name-from-folder": {
"version": "3.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/node-gyp": {
+ "version": "4.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/package-json": {
- "version": "5.2.0",
+ "version": "6.2.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/git": "^5.0.0",
+ "@npmcli/git": "^6.0.0",
"glob": "^10.2.2",
- "hosted-git-info": "^7.0.0",
- "json-parse-even-better-errors": "^3.0.0",
- "normalize-package-data": "^6.0.0",
- "proc-log": "^4.0.0",
- "semver": "^7.5.3"
+ "hosted-git-info": "^8.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.5.3",
+ "validate-npm-package-license": "^3.0.4"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/promise-spawn": {
- "version": "7.0.2",
+ "version": "8.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "which": "^4.0.0"
+ "which": "^5.0.0"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/query": {
- "version": "3.1.0",
+ "version": "4.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "postcss-selector-parser": "^6.0.10"
+ "postcss-selector-parser": "^7.0.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/redact": {
- "version": "2.0.1",
+ "version": "3.2.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@npmcli/run-script": {
- "version": "8.1.0",
+ "version": "9.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/node-gyp": "^3.0.0",
- "@npmcli/package-json": "^5.0.0",
- "@npmcli/promise-spawn": "^7.0.0",
- "node-gyp": "^10.0.0",
- "proc-log": "^4.0.0",
- "which": "^4.0.0"
+ "@npmcli/node-gyp": "^4.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "node-gyp": "^11.0.0",
+ "proc-log": "^5.0.0",
+ "which": "^5.0.0"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@pkgjs/parseargs": {
@@ -4169,78 +4185,26 @@
"node": ">=14"
}
},
- "node_modules/npm/node_modules/@sigstore/bundle": {
- "version": "2.3.2",
- "dev": true,
- "inBundle": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@sigstore/protobuf-specs": "^0.3.2"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/npm/node_modules/@sigstore/core": {
- "version": "1.1.0",
- "dev": true,
- "inBundle": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
"node_modules/npm/node_modules/@sigstore/protobuf-specs": {
- "version": "0.3.2",
+ "version": "0.4.3",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/npm/node_modules/@sigstore/sign": {
- "version": "2.3.2",
- "dev": true,
- "inBundle": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@sigstore/bundle": "^2.3.2",
- "@sigstore/core": "^1.0.0",
- "@sigstore/protobuf-specs": "^0.3.2",
- "make-fetch-happen": "^13.0.1",
- "proc-log": "^4.2.0",
- "promise-retry": "^2.0.1"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@sigstore/tuf": {
- "version": "2.3.4",
+ "version": "3.1.1",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
- "@sigstore/protobuf-specs": "^0.3.2",
- "tuf-js": "^2.2.1"
+ "@sigstore/protobuf-specs": "^0.4.1",
+ "tuf-js": "^3.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/npm/node_modules/@sigstore/verify": {
- "version": "1.2.1",
- "dev": true,
- "inBundle": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@sigstore/bundle": "^2.3.2",
- "@sigstore/core": "^1.1.0",
- "@sigstore/protobuf-specs": "^0.3.2"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/@tufjs/canonical-json": {
@@ -4252,53 +4216,24 @@
"node": "^16.14.0 || >=18.0.0"
}
},
- "node_modules/npm/node_modules/@tufjs/models": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "@tufjs/canonical-json": "2.0.0",
- "minimatch": "^9.0.4"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
"node_modules/npm/node_modules/abbrev": {
- "version": "2.0.0",
+ "version": "3.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/agent-base": {
- "version": "7.1.1",
+ "version": "7.1.3",
"dev": true,
"inBundle": true,
"license": "MIT",
- "dependencies": {
- "debug": "^4.3.4"
- },
"engines": {
"node": ">= 14"
}
},
- "node_modules/npm/node_modules/aggregate-error": {
- "version": "3.1.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/npm/node_modules/ansi-regex": {
"version": "5.0.1",
"dev": true,
@@ -4339,18 +4274,19 @@
"license": "MIT"
},
"node_modules/npm/node_modules/bin-links": {
- "version": "4.0.4",
+ "version": "5.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "cmd-shim": "^6.0.0",
- "npm-normalize-package-bin": "^3.0.0",
- "read-cmd-shim": "^4.0.0",
- "write-file-atomic": "^5.0.0"
+ "cmd-shim": "^7.0.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "read-cmd-shim": "^5.0.0",
+ "write-file-atomic": "^6.0.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/binary-extensions": {
@@ -4366,7 +4302,7 @@
}
},
"node_modules/npm/node_modules/brace-expansion": {
- "version": "2.0.1",
+ "version": "2.0.2",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -4375,12 +4311,12 @@
}
},
"node_modules/npm/node_modules/cacache": {
- "version": "18.0.4",
+ "version": "19.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/fs": "^3.1.0",
+ "@npmcli/fs": "^4.0.0",
"fs-minipass": "^3.0.0",
"glob": "^10.2.2",
"lru-cache": "^10.0.1",
@@ -4388,17 +4324,67 @@
"minipass-collect": "^2.0.1",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
- "p-map": "^4.0.0",
- "ssri": "^10.0.0",
- "tar": "^6.1.11",
- "unique-filename": "^3.0.0"
+ "p-map": "^7.0.2",
+ "ssri": "^12.0.0",
+ "tar": "^7.4.3",
+ "unique-filename": "^4.0.0"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/chownr": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/mkdirp": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/tar": {
+ "version": "7.4.3",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/yallist": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/npm/node_modules/chalk": {
- "version": "5.3.0",
+ "version": "5.4.1",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -4419,7 +4405,7 @@
}
},
"node_modules/npm/node_modules/ci-info": {
- "version": "4.0.0",
+ "version": "4.2.0",
"dev": true,
"funding": [
{
@@ -4434,7 +4420,7 @@
}
},
"node_modules/npm/node_modules/cidr-regex": {
- "version": "4.1.1",
+ "version": "4.1.3",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause",
@@ -4445,15 +4431,6 @@
"node": ">=14"
}
},
- "node_modules/npm/node_modules/clean-stack": {
- "version": "2.2.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/npm/node_modules/cli-columns": {
"version": "4.0.0",
"dev": true,
@@ -4468,12 +4445,12 @@
}
},
"node_modules/npm/node_modules/cmd-shim": {
- "version": "6.0.3",
+ "version": "7.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/color-convert": {
@@ -4501,7 +4478,7 @@
"license": "ISC"
},
"node_modules/npm/node_modules/cross-spawn": {
- "version": "7.0.3",
+ "version": "7.0.6",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -4542,12 +4519,12 @@
}
},
"node_modules/npm/node_modules/debug": {
- "version": "4.3.6",
+ "version": "4.4.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -4558,12 +4535,6 @@
}
}
},
- "node_modules/npm/node_modules/debug/node_modules/ms": {
- "version": "2.1.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT"
- },
"node_modules/npm/node_modules/diff": {
"version": "5.2.0",
"dev": true,
@@ -4611,7 +4582,7 @@
"license": "MIT"
},
"node_modules/npm/node_modules/exponential-backoff": {
- "version": "3.1.1",
+ "version": "3.1.2",
"dev": true,
"inBundle": true,
"license": "Apache-2.0"
@@ -4626,12 +4597,12 @@
}
},
"node_modules/npm/node_modules/foreground-child": {
- "version": "3.3.0",
+ "version": "3.3.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "cross-spawn": "^7.0.0",
+ "cross-spawn": "^7.0.6",
"signal-exit": "^4.0.1"
},
"engines": {
@@ -4680,7 +4651,7 @@
"license": "ISC"
},
"node_modules/npm/node_modules/hosted-git-info": {
- "version": "7.0.2",
+ "version": "8.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -4688,11 +4659,11 @@
"lru-cache": "^10.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/http-cache-semantics": {
- "version": "4.1.1",
+ "version": "4.2.0",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause"
@@ -4711,12 +4682,12 @@
}
},
"node_modules/npm/node_modules/https-proxy-agent": {
- "version": "7.0.5",
+ "version": "7.0.6",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
- "agent-base": "^7.0.2",
+ "agent-base": "^7.1.2",
"debug": "4"
},
"engines": {
@@ -4737,7 +4708,7 @@
}
},
"node_modules/npm/node_modules/ignore-walk": {
- "version": "6.0.5",
+ "version": "7.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -4745,7 +4716,7 @@
"minimatch": "^9.0.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/imurmurhash": {
@@ -4757,40 +4728,31 @@
"node": ">=0.8.19"
}
},
- "node_modules/npm/node_modules/indent-string": {
- "version": "4.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/npm/node_modules/ini": {
- "version": "4.1.3",
+ "version": "5.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/init-package-json": {
- "version": "6.0.3",
+ "version": "7.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/package-json": "^5.0.0",
- "npm-package-arg": "^11.0.0",
- "promzard": "^1.0.0",
- "read": "^3.0.1",
+ "@npmcli/package-json": "^6.0.0",
+ "npm-package-arg": "^12.0.0",
+ "promzard": "^2.0.0",
+ "read": "^4.0.0",
"semver": "^7.3.5",
"validate-npm-package-license": "^3.0.4",
- "validate-npm-package-name": "^5.0.0"
+ "validate-npm-package-name": "^6.0.0"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/ip-address": {
@@ -4819,7 +4781,7 @@
}
},
"node_modules/npm/node_modules/is-cidr": {
- "version": "5.1.0",
+ "version": "5.1.1",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause",
@@ -4839,12 +4801,6 @@
"node": ">=8"
}
},
- "node_modules/npm/node_modules/is-lambda": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT"
- },
"node_modules/npm/node_modules/isexe": {
"version": "2.0.0",
"dev": true,
@@ -4873,12 +4829,12 @@
"license": "MIT"
},
"node_modules/npm/node_modules/json-parse-even-better-errors": {
- "version": "3.0.2",
+ "version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/json-stringify-nice": {
@@ -4912,169 +4868,169 @@
"license": "MIT"
},
"node_modules/npm/node_modules/libnpmaccess": {
- "version": "8.0.6",
+ "version": "9.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "npm-package-arg": "^11.0.2",
- "npm-registry-fetch": "^17.0.1"
+ "npm-package-arg": "^12.0.0",
+ "npm-registry-fetch": "^18.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/libnpmdiff": {
- "version": "6.1.4",
+ "version": "7.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^7.5.4",
- "@npmcli/installed-package-contents": "^2.1.0",
+ "@npmcli/arborist": "^8.0.1",
+ "@npmcli/installed-package-contents": "^3.0.0",
"binary-extensions": "^2.3.0",
"diff": "^5.1.0",
"minimatch": "^9.0.4",
- "npm-package-arg": "^11.0.2",
- "pacote": "^18.0.6",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^19.0.0",
"tar": "^6.2.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/libnpmexec": {
- "version": "8.1.4",
+ "version": "9.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^7.5.4",
- "@npmcli/run-script": "^8.1.0",
+ "@npmcli/arborist": "^8.0.1",
+ "@npmcli/run-script": "^9.0.1",
"ci-info": "^4.0.0",
- "npm-package-arg": "^11.0.2",
- "pacote": "^18.0.6",
- "proc-log": "^4.2.0",
- "read": "^3.0.1",
- "read-package-json-fast": "^3.0.2",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^19.0.0",
+ "proc-log": "^5.0.0",
+ "read": "^4.0.0",
+ "read-package-json-fast": "^4.0.0",
"semver": "^7.3.7",
"walk-up-path": "^3.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/libnpmfund": {
- "version": "5.0.12",
+ "version": "6.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^7.5.4"
+ "@npmcli/arborist": "^8.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/libnpmhook": {
- "version": "10.0.5",
+ "version": "11.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"aproba": "^2.0.0",
- "npm-registry-fetch": "^17.0.1"
+ "npm-registry-fetch": "^18.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/libnpmorg": {
- "version": "6.0.6",
+ "version": "7.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"aproba": "^2.0.0",
- "npm-registry-fetch": "^17.0.1"
+ "npm-registry-fetch": "^18.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/libnpmpack": {
- "version": "7.0.4",
+ "version": "8.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/arborist": "^7.5.4",
- "@npmcli/run-script": "^8.1.0",
- "npm-package-arg": "^11.0.2",
- "pacote": "^18.0.6"
+ "@npmcli/arborist": "^8.0.1",
+ "@npmcli/run-script": "^9.0.1",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^19.0.0"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/libnpmpublish": {
- "version": "9.0.9",
+ "version": "10.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"ci-info": "^4.0.0",
- "normalize-package-data": "^6.0.1",
- "npm-package-arg": "^11.0.2",
- "npm-registry-fetch": "^17.0.1",
- "proc-log": "^4.2.0",
+ "normalize-package-data": "^7.0.0",
+ "npm-package-arg": "^12.0.0",
+ "npm-registry-fetch": "^18.0.1",
+ "proc-log": "^5.0.0",
"semver": "^7.3.7",
- "sigstore": "^2.2.0",
- "ssri": "^10.0.6"
+ "sigstore": "^3.0.0",
+ "ssri": "^12.0.0"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/libnpmsearch": {
- "version": "7.0.6",
+ "version": "8.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "npm-registry-fetch": "^17.0.1"
+ "npm-registry-fetch": "^18.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/libnpmteam": {
- "version": "6.0.5",
+ "version": "7.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
"aproba": "^2.0.0",
- "npm-registry-fetch": "^17.0.1"
+ "npm-registry-fetch": "^18.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/libnpmversion": {
- "version": "6.0.3",
+ "version": "7.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/git": "^5.0.7",
- "@npmcli/run-script": "^8.1.0",
- "json-parse-even-better-errors": "^3.0.2",
- "proc-log": "^4.2.0",
+ "@npmcli/git": "^6.0.1",
+ "@npmcli/run-script": "^9.0.1",
+ "json-parse-even-better-errors": "^4.0.0",
+ "proc-log": "^5.0.0",
"semver": "^7.3.7"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/lru-cache": {
@@ -5084,26 +5040,34 @@
"license": "ISC"
},
"node_modules/npm/node_modules/make-fetch-happen": {
- "version": "13.0.1",
+ "version": "14.0.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/agent": "^2.0.0",
- "cacache": "^18.0.0",
+ "@npmcli/agent": "^3.0.0",
+ "cacache": "^19.0.1",
"http-cache-semantics": "^4.1.1",
- "is-lambda": "^1.0.1",
"minipass": "^7.0.2",
- "minipass-fetch": "^3.0.0",
+ "minipass-fetch": "^4.0.0",
"minipass-flush": "^1.0.5",
"minipass-pipeline": "^1.2.4",
- "negotiator": "^0.6.3",
- "proc-log": "^4.2.0",
+ "negotiator": "^1.0.0",
+ "proc-log": "^5.0.0",
"promise-retry": "^2.0.1",
- "ssri": "^10.0.0"
+ "ssri": "^12.0.0"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator": {
+ "version": "1.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
}
},
"node_modules/npm/node_modules/minimatch": {
@@ -5143,17 +5107,17 @@
}
},
"node_modules/npm/node_modules/minipass-fetch": {
- "version": "3.0.5",
+ "version": "4.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"minipass": "^7.0.3",
"minipass-sized": "^1.0.3",
- "minizlib": "^2.1.2"
+ "minizlib": "^3.0.1"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
},
"optionalDependencies": {
"encoding": "^0.1.13"
@@ -5232,28 +5196,15 @@
}
},
"node_modules/npm/node_modules/minizlib": {
- "version": "2.1.2",
+ "version": "3.0.2",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
+ "minipass": "^7.1.2"
},
"engines": {
- "node": ">= 8"
- }
- },
- "node_modules/npm/node_modules/minizlib/node_modules/minipass": {
- "version": "3.3.6",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
+ "node": ">= 18"
}
},
"node_modules/npm/node_modules/mkdirp": {
@@ -5275,99 +5226,140 @@
"license": "MIT"
},
"node_modules/npm/node_modules/mute-stream": {
- "version": "1.0.0",
+ "version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/npm/node_modules/negotiator": {
- "version": "0.6.3",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/node-gyp": {
- "version": "10.2.0",
+ "version": "11.2.0",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
"env-paths": "^2.2.0",
"exponential-backoff": "^3.1.1",
- "glob": "^10.3.10",
"graceful-fs": "^4.2.6",
- "make-fetch-happen": "^13.0.0",
- "nopt": "^7.0.0",
- "proc-log": "^4.1.0",
+ "make-fetch-happen": "^14.0.3",
+ "nopt": "^8.0.0",
+ "proc-log": "^5.0.0",
"semver": "^7.3.5",
- "tar": "^6.2.1",
- "which": "^4.0.0"
+ "tar": "^7.4.3",
+ "tinyglobby": "^0.2.12",
+ "which": "^5.0.0"
},
"bin": {
"node-gyp": "bin/node-gyp.js"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/npm/node_modules/nopt": {
- "version": "7.2.1",
+ "node_modules/npm/node_modules/node-gyp/node_modules/chownr": {
+ "version": "3.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/mkdirp": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/tar": {
+ "version": "7.4.3",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "abbrev": "^2.0.0"
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/yallist": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/nopt": {
+ "version": "8.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^3.0.0"
},
"bin": {
"nopt": "bin/nopt.js"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/normalize-package-data": {
- "version": "6.0.2",
+ "version": "7.0.0",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause",
"dependencies": {
- "hosted-git-info": "^7.0.0",
+ "hosted-git-info": "^8.0.0",
"semver": "^7.3.5",
"validate-npm-package-license": "^3.0.4"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/npm-audit-report": {
- "version": "5.0.0",
+ "version": "6.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/npm-bundled": {
- "version": "3.0.1",
+ "version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "npm-normalize-package-bin": "^3.0.0"
+ "npm-normalize-package-bin": "^4.0.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/npm-install-checks": {
- "version": "6.3.0",
+ "version": "7.1.1",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause",
@@ -5375,165 +5367,162 @@
"semver": "^7.1.1"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/npm-normalize-package-bin": {
- "version": "3.0.1",
+ "version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/npm-package-arg": {
- "version": "11.0.3",
+ "version": "12.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "hosted-git-info": "^7.0.0",
- "proc-log": "^4.0.0",
+ "hosted-git-info": "^8.0.0",
+ "proc-log": "^5.0.0",
"semver": "^7.3.5",
- "validate-npm-package-name": "^5.0.0"
+ "validate-npm-package-name": "^6.0.0"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/npm-packlist": {
- "version": "8.0.2",
+ "version": "9.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "ignore-walk": "^6.0.4"
+ "ignore-walk": "^7.0.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/npm-pick-manifest": {
- "version": "9.1.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "dependencies": {
- "npm-install-checks": "^6.0.0",
- "npm-normalize-package-bin": "^3.0.0",
- "npm-package-arg": "^11.0.0",
- "semver": "^7.3.5"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/npm/node_modules/npm-profile": {
"version": "10.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "npm-registry-fetch": "^17.0.1",
- "proc-log": "^4.0.0"
+ "npm-install-checks": "^7.1.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "npm-package-arg": "^12.0.0",
+ "semver": "^7.3.5"
},
"engines": {
- "node": ">=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/npm/node_modules/npm-registry-fetch": {
- "version": "17.1.0",
+ "node_modules/npm/node_modules/npm-profile": {
+ "version": "11.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/redact": "^2.0.0",
- "jsonparse": "^1.3.1",
- "make-fetch-happen": "^13.0.0",
- "minipass": "^7.0.2",
- "minipass-fetch": "^3.0.0",
- "minizlib": "^2.1.2",
- "npm-package-arg": "^11.0.0",
- "proc-log": "^4.0.0"
+ "npm-registry-fetch": "^18.0.0",
+ "proc-log": "^5.0.0"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-registry-fetch": {
+ "version": "18.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/redact": "^3.0.0",
+ "jsonparse": "^1.3.1",
+ "make-fetch-happen": "^14.0.0",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minizlib": "^3.0.1",
+ "npm-package-arg": "^12.0.0",
+ "proc-log": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/npm-user-validate": {
- "version": "2.0.1",
+ "version": "3.0.0",
"dev": true,
"inBundle": true,
"license": "BSD-2-Clause",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/p-map": {
- "version": "4.0.0",
+ "version": "7.0.3",
"dev": true,
"inBundle": true,
"license": "MIT",
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
"engines": {
- "node": ">=10"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/npm/node_modules/package-json-from-dist": {
- "version": "1.0.0",
+ "version": "1.0.1",
"dev": true,
"inBundle": true,
"license": "BlueOak-1.0.0"
},
"node_modules/npm/node_modules/pacote": {
- "version": "18.0.6",
+ "version": "19.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "@npmcli/git": "^5.0.0",
- "@npmcli/installed-package-contents": "^2.0.1",
- "@npmcli/package-json": "^5.1.0",
- "@npmcli/promise-spawn": "^7.0.0",
- "@npmcli/run-script": "^8.0.0",
- "cacache": "^18.0.0",
+ "@npmcli/git": "^6.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "@npmcli/run-script": "^9.0.0",
+ "cacache": "^19.0.0",
"fs-minipass": "^3.0.0",
"minipass": "^7.0.2",
- "npm-package-arg": "^11.0.0",
- "npm-packlist": "^8.0.0",
- "npm-pick-manifest": "^9.0.0",
- "npm-registry-fetch": "^17.0.0",
- "proc-log": "^4.0.0",
+ "npm-package-arg": "^12.0.0",
+ "npm-packlist": "^9.0.0",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-registry-fetch": "^18.0.0",
+ "proc-log": "^5.0.0",
"promise-retry": "^2.0.1",
- "sigstore": "^2.2.0",
- "ssri": "^10.0.0",
+ "sigstore": "^3.0.0",
+ "ssri": "^12.0.0",
"tar": "^6.1.11"
},
"bin": {
"pacote": "bin/index.js"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/parse-conflict-json": {
- "version": "3.0.1",
+ "version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "json-parse-even-better-errors": "^3.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
"just-diff": "^6.0.0",
"just-diff-apply": "^5.2.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/path-key": {
@@ -5562,7 +5551,7 @@
}
},
"node_modules/npm/node_modules/postcss-selector-parser": {
- "version": "6.1.2",
+ "version": "7.1.0",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -5575,21 +5564,21 @@
}
},
"node_modules/npm/node_modules/proc-log": {
- "version": "4.2.0",
+ "version": "5.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/proggy": {
- "version": "2.0.0",
+ "version": "3.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/promise-all-reject-late": {
@@ -5602,7 +5591,7 @@
}
},
"node_modules/npm/node_modules/promise-call-limit": {
- "version": "3.0.1",
+ "version": "3.0.2",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -5610,12 +5599,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/npm/node_modules/promise-inflight": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC"
- },
"node_modules/npm/node_modules/promise-retry": {
"version": "2.0.1",
"dev": true,
@@ -5630,15 +5613,15 @@
}
},
"node_modules/npm/node_modules/promzard": {
- "version": "1.0.2",
+ "version": "2.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "read": "^3.0.1"
+ "read": "^4.0.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/qrcode-terminal": {
@@ -5650,37 +5633,37 @@
}
},
"node_modules/npm/node_modules/read": {
- "version": "3.0.1",
+ "version": "4.1.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "mute-stream": "^1.0.0"
+ "mute-stream": "^2.0.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/read-cmd-shim": {
+ "version": "5.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/read-package-json-fast": {
"version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/npm/node_modules/read-package-json-fast": {
- "version": "3.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
"dependencies": {
- "json-parse-even-better-errors": "^3.0.0",
- "npm-normalize-package-bin": "^3.0.0"
+ "json-parse-even-better-errors": "^4.0.0",
+ "npm-normalize-package-bin": "^4.0.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/retry": {
@@ -5700,7 +5683,7 @@
"optional": true
},
"node_modules/npm/node_modules/semver": {
- "version": "7.6.3",
+ "version": "7.7.2",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -5745,20 +5728,72 @@
}
},
"node_modules/npm/node_modules/sigstore": {
- "version": "2.3.1",
+ "version": "3.1.0",
"dev": true,
"inBundle": true,
"license": "Apache-2.0",
"dependencies": {
- "@sigstore/bundle": "^2.3.2",
- "@sigstore/core": "^1.0.0",
- "@sigstore/protobuf-specs": "^0.3.2",
- "@sigstore/sign": "^2.3.2",
- "@sigstore/tuf": "^2.3.4",
- "@sigstore/verify": "^1.2.1"
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.0",
+ "@sigstore/sign": "^3.1.0",
+ "@sigstore/tuf": "^3.1.0",
+ "@sigstore/verify": "^2.1.0"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/bundle": {
+ "version": "3.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.4.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/core": {
+ "version": "2.0.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/sign": {
+ "version": "3.1.0",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.0",
+ "make-fetch-happen": "^14.0.2",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/sigstore/node_modules/@sigstore/verify": {
+ "version": "2.1.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/smart-buffer": {
@@ -5772,7 +5807,7 @@
}
},
"node_modules/npm/node_modules/socks": {
- "version": "2.8.3",
+ "version": "2.8.5",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -5786,12 +5821,12 @@
}
},
"node_modules/npm/node_modules/socks-proxy-agent": {
- "version": "8.0.4",
+ "version": "8.0.5",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
- "agent-base": "^7.1.1",
+ "agent-base": "^7.1.2",
"debug": "^4.3.4",
"socks": "^2.8.3"
},
@@ -5836,7 +5871,7 @@
}
},
"node_modules/npm/node_modules/spdx-license-ids": {
- "version": "3.0.18",
+ "version": "3.0.21",
"dev": true,
"inBundle": true,
"license": "CC0-1.0"
@@ -5848,7 +5883,7 @@
"license": "BSD-3-Clause"
},
"node_modules/npm/node_modules/ssri": {
- "version": "10.0.6",
+ "version": "12.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -5856,7 +5891,7 @@
"minipass": "^7.0.3"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/string-width": {
@@ -5975,6 +6010,31 @@
"node": ">=8"
}
},
+ "node_modules/npm/node_modules/tar/node_modules/minizlib": {
+ "version": "2.1.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/tar/node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/npm/node_modules/text-table": {
"version": "0.2.0",
"dev": true,
@@ -5987,6 +6047,48 @@
"inBundle": true,
"license": "MIT"
},
+ "node_modules/npm/node_modules/tinyglobby": {
+ "version": "0.2.14",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.4.6",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.2",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/npm/node_modules/treeverse": {
"version": "3.0.0",
"dev": true,
@@ -5997,33 +6099,46 @@
}
},
"node_modules/npm/node_modules/tuf-js": {
- "version": "2.2.1",
+ "version": "3.0.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"dependencies": {
- "@tufjs/models": "2.0.1",
- "debug": "^4.3.4",
- "make-fetch-happen": "^13.0.1"
+ "@tufjs/models": "3.0.1",
+ "debug": "^4.3.6",
+ "make-fetch-happen": "^14.0.1"
},
"engines": {
- "node": "^16.14.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js/node_modules/@tufjs/models": {
+ "version": "3.0.1",
+ "dev": true,
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tufjs/canonical-json": "2.0.0",
+ "minimatch": "^9.0.5"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/unique-filename": {
- "version": "3.0.0",
+ "version": "4.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
"dependencies": {
- "unique-slug": "^4.0.0"
+ "unique-slug": "^5.0.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/unique-slug": {
- "version": "4.0.0",
+ "version": "5.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -6031,7 +6146,7 @@
"imurmurhash": "^0.1.4"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/util-deprecate": {
@@ -6061,12 +6176,12 @@
}
},
"node_modules/npm/node_modules/validate-npm-package-name": {
- "version": "5.0.1",
+ "version": "6.0.1",
"dev": true,
"inBundle": true,
"license": "ISC",
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/walk-up-path": {
@@ -6076,7 +6191,7 @@
"license": "ISC"
},
"node_modules/npm/node_modules/which": {
- "version": "4.0.0",
+ "version": "5.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -6087,7 +6202,7 @@
"node-which": "bin/which.js"
},
"engines": {
- "node": "^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/which/node_modules/isexe": {
@@ -6150,7 +6265,7 @@
}
},
"node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": {
- "version": "6.0.1",
+ "version": "6.1.0",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -6200,7 +6315,7 @@
}
},
"node_modules/npm/node_modules/write-file-atomic": {
- "version": "5.0.1",
+ "version": "6.0.0",
"dev": true,
"inBundle": true,
"license": "ISC",
@@ -6209,7 +6324,7 @@
"signal-exit": "^4.0.1"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/npm/node_modules/yallist": {
@@ -6223,7 +6338,6 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -6401,15 +6515,13 @@
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
"integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/parse5-htmlparser2-tree-adapter": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
"integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"parse5": "^6.0.1"
}
@@ -6418,8 +6530,7 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
"integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/parsimmon": {
"version": "1.18.1",
@@ -6503,11 +6614,10 @@
}
},
"node_modules/pretty-ms": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz",
- "integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==",
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz",
+ "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==",
"dev": true,
- "license": "MIT",
"dependencies": {
"parse-ms": "^4.0.0"
},
@@ -6760,16 +6870,15 @@
"license": "MIT"
},
"node_modules/semantic-release": {
- "version": "24.1.2",
- "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.2.tgz",
- "integrity": "sha512-hvEJ7yI97pzJuLsDZCYzJgmRxF8kiEJvNZhf0oiZQcexw+Ycjy4wbdsn/sVMURgNCu8rwbAXJdBRyIxM4pe32g==",
+ "version": "24.2.6",
+ "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.6.tgz",
+ "integrity": "sha512-D0cwjlO5RZzHHxAcsoF1HxiRLfC3ehw+ay+zntzFs6PNX6aV0JzKNG15mpxPipBYa/l4fHly88dHvgDyqwb1Ww==",
"dev": true,
- "license": "MIT",
"dependencies": {
"@semantic-release/commit-analyzer": "^13.0.0-beta.1",
"@semantic-release/error": "^4.0.0",
"@semantic-release/github": "^11.0.0",
- "@semantic-release/npm": "^12.0.0",
+ "@semantic-release/npm": "^12.0.2",
"@semantic-release/release-notes-generator": "^14.0.0-beta.1",
"aggregate-error": "^5.0.0",
"cosmiconfig": "^9.0.0",
@@ -6782,10 +6891,10 @@
"git-log-parser": "^1.2.0",
"hook-std": "^3.0.0",
"hosted-git-info": "^8.0.0",
- "import-from-esm": "^1.3.1",
+ "import-from-esm": "^2.0.0",
"lodash-es": "^4.17.21",
- "marked": "^12.0.0",
- "marked-terminal": "^7.0.0",
+ "marked": "^15.0.0",
+ "marked-terminal": "^7.3.0",
"micromatch": "^4.0.2",
"p-each-series": "^3.0.0",
"p-reduce": "^3.0.0",
@@ -6926,6 +7035,19 @@
"node": ">=18.18.0"
}
},
+ "node_modules/semantic-release/node_modules/import-from-esm": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-2.0.0.tgz",
+ "integrity": "sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "import-meta-resolve": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18.20"
+ }
+ },
"node_modules/semantic-release/node_modules/indent-string": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
@@ -7490,7 +7612,6 @@
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"any-promise": "^1.0.0"
}
@@ -7500,7 +7621,6 @@
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
"dev": true,
- "license": "MIT",
"dependencies": {
"thenify": ">= 3.1.0 < 4"
},
diff --git a/package.json b/package.json
index 105a5ca..51374af 100644
--- a/package.json
+++ b/package.json
@@ -4,6 +4,6 @@
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"gradle-semantic-release-plugin": "^1.10.1",
- "semantic-release": "^24.1.2"
+ "semantic-release": "^24.2.6"
}
}
diff --git a/proguard-rules.pro b/proguard-rules.pro
index 575abe7..481bb43 100644
--- a/proguard-rules.pro
+++ b/proguard-rules.pro
@@ -1 +1,21 @@
--keep public class app.revanced.manager.plugin.downloader.apkmirror.*
+# 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
\ No newline at end of file
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 3c9c5d3..d8cda47 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,19 +1,24 @@
-rootProject.name = "revanced-manager-apkmirror-downloader"
+rootProject.name = "revanced-manager-downloaders"
-pluginManagement.repositories {
- gradlePluginPortal()
- google()
-}
-
-dependencyResolutionManagement.repositories {
- mavenCentral()
- google()
- maven {
- name = "GitHubPackages"
- url = uri("https://maven.pkg.github.com/revanced/registry")
- credentials {
- username = providers.gradleProperty("gpr.user").orNull ?: System.getenv("GITHUB_ACTOR")
- password = providers.gradleProperty("gpr.key").orNull ?: System.getenv("GITHUB_TOKEN")
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ google()
+ maven {
+ name = "GitHubPackages"
+ url = uri("https://maven.pkg.github.com/revanced/registry")
+ credentials {
+ username = providers.gradleProperty("gpr.user").getOrElse(System.getenv("GITHUB_ACTOR"))
+ password = providers.gradleProperty("gpr.key").getOrElse(System.getenv("GITHUB_TOKEN"))
+ }
}
}
}
+
+include(":shared")
+include(":arsclib")
+file("downloaders").listFiles()
+ ?.forEach {
+ include(":${it.name}")
+ project(":${it.name}").projectDir = file("downloaders/${it.name}")
+ }
diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts
new file mode 100644
index 0000000..cab4d05
--- /dev/null
+++ b/shared/build.gradle.kts
@@ -0,0 +1,8 @@
+plugins {
+ kotlin("jvm")
+}
+
+dependencies {
+ implementation(libs.kotlinx.coroutines.core)
+ implementation(project(":arsclib"))
+}
diff --git a/shared/src/main/kotlin/app/revanced/manager/plugin/utils/Merger.kt b/shared/src/main/kotlin/app/revanced/manager/plugin/utils/Merger.kt
new file mode 100644
index 0000000..82ec7a0
--- /dev/null
+++ b/shared/src/main/kotlin/app/revanced/manager/plugin/utils/Merger.kt
@@ -0,0 +1,59 @@
+package app.revanced.manager.plugin.utils
+
+import com.reandroid.apk.APKLogger
+import com.reandroid.apk.ApkBundle
+import com.reandroid.apk.ApkModule
+import com.reandroid.app.AndroidManifest
+import java.io.Closeable
+import java.nio.file.Path
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
+
+class Merger {
+ companion object Factory {
+ suspend fun merge(apkDir: Path, arscLogger: APKLogger): ApkModule {
+ val closeables = mutableSetOf()
+ try {
+ // Merge splits
+ val merged = withContext(Dispatchers.Default) {
+ with(ApkBundle()) {
+ setAPKLogger(arscLogger)
+ loadApkDirectory(apkDir.toFile())
+ closeables.addAll(modules)
+ mergeModules().also(closeables::add)
+ }
+ }
+ merged.androidManifest.apply {
+ arrayOf(
+ AndroidManifest.ID_isSplitRequired,
+ AndroidManifest.ID_extractNativeLibs
+ ).forEach {
+ applicationElement.removeAttributesWithId(it)
+ manifestElement.removeAttributesWithId(it)
+ }
+
+ arrayOf(
+ AndroidManifest.NAME_requiredSplitTypes,
+ AndroidManifest.NAME_splitTypes
+ ).forEach(manifestElement::removeAttributesWithName)
+
+ val pattern = "^com\\.android\\.(stamp|vending)\\.".toRegex()
+ applicationElement.removeElementsIf { element ->
+ if (element.name != AndroidManifest.TAG_meta_data) return@removeElementsIf false
+ val nameAttr =
+ element.getAttributes { it.nameId == AndroidManifest.ID_name }
+ .asSequence().single()
+
+ pattern.containsMatchIn(nameAttr.valueString)
+ }
+
+ refresh()
+ }
+
+ return merged
+ } finally {
+ closeables.forEach(Closeable::close)
+ }
+ }
+ }
+}
\ No newline at end of file