From 4a392b86435370e5c83d23c7776b0b398480f140 Mon Sep 17 00:00:00 2001 From: WarningImHack3r <43064022+WarningImHack3r@users.noreply.github.com> Date: Tue, 3 Sep 2024 22:22:05 +0200 Subject: [PATCH] 3.0.1 - Fix `"deprecated": false` flagging deps as deprecated (fixes #122) - Fix empty computed registry throwing at fetch - Log improvements - Code improvements - Update Gradle version and dependencies --- CHANGELOG.md | 5 ++ gradle.properties | 4 +- gradle/libs.versions.toml | 4 +- gradle/wrapper/gradle-wrapper.jar | Bin 43504 -> 43583 bytes .../backend/engine/NPMJSClient.kt | 72 +++++++++++------- .../backend/engine/ShellRunner.kt | 2 +- .../backend/extensions/Extensions.kt | 11 ++- .../GitHubErrorReportSubmitter.kt | 8 +- 8 files changed, 66 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index facfd45..1bce574 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ ## [Unreleased] +### Fixed + +- Fix `false` deprecated field flagging dependencies as deprecated (#122) +- Fix registry affectation logic freezing the plugin + ## [3.0.0] - 2024-08-01 ### Removed diff --git a/gradle.properties b/gradle.properties index 6980d11..6db7804 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ pluginGroup = com.github.warningimhack3r.npmupdatedependencies pluginName = npm-update-dependencies pluginRepositoryUrl = https://github.com/WarningImHack3r/npm-update-dependencies # SemVer format -> https://semver.org -pluginVersion = 3.0.0 +pluginVersion = 3.0.1 # Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html pluginSinceBuild = 223 @@ -21,7 +21,7 @@ platformPlugins = platformBundledPlugins = # Gradle Releases -> https://github.com/gradle/gradle/releases -gradleVersion = 8.9 +gradleVersion = 8.10 # Opt-out flag for bundling Kotlin standard library -> https://jb.gg/intellij-platform-kotlin-stdlib kotlin.stdlib.default.dependency = false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6c2eac8..a2cc516 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,10 +6,10 @@ semver4j = "5.3.0" # plugins changelog = "2.2.1" intellijPlatform = "2.0.1" -kotlin = "2.0.10" +kotlin = "2.0.20" kover = "0.8.3" qodana = "2024.1.9" -serialization = "1.7.1" +serialization = "1.7.2" [libraries] junit = { group = "junit", name = "junit", version.ref = "junit" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2c3521197d7c4586c843d1d3e9090525f1898cde..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch delta 3990 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 diff --git a/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/engine/NPMJSClient.kt b/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/engine/NPMJSClient.kt index 117784e..cdbd3ff 100644 --- a/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/engine/NPMJSClient.kt +++ b/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/engine/NPMJSClient.kt @@ -1,8 +1,10 @@ package com.github.warningimhack3r.npmupdatedependencies.backend.engine +import com.github.warningimhack3r.npmupdatedependencies.backend.extensions.asBoolean import com.github.warningimhack3r.npmupdatedependencies.backend.extensions.asJsonArray import com.github.warningimhack3r.npmupdatedependencies.backend.extensions.asJsonObject import com.github.warningimhack3r.npmupdatedependencies.backend.extensions.asString +import com.github.warningimhack3r.npmupdatedependencies.backend.extensions.isBlankOrEmpty import com.intellij.openapi.components.Service import com.intellij.openapi.components.service import com.intellij.openapi.diagnostic.logger @@ -28,10 +30,8 @@ class NPMJSClient(private val project: Project) { log.info("Getting registry for package $packageName") val state = NUDState.getInstance(project) val shellRunner = ShellRunner.getInstance(project) - return state.packageRegistries[packageName].also { - if (it != null) { - log.debug("Registry for package $packageName found in cache: $it") - } + return state.packageRegistries[packageName]?.also { + log.debug("Registry for package $packageName found in cache: $it") } ?: shellRunner.execute( arrayOf("npm", "v", packageName, "dist.tarball") )?.trim()?.let { dist -> @@ -48,11 +48,13 @@ class NPMJSClient(private val project: Project) { return@let null.also { log.debug("No dist.tarball found for package $packageName in any registry") } + }.substringBefore("/$packageName").ifEmpty { + log.debug("No registry found for package $packageName") + return@let null } - val registry = computedRegistry.substringBefore("/$packageName") - log.info("Computed registry for package $packageName: $registry") - state.packageRegistries[packageName] = registry - registry + log.info("Computed registry for package $packageName: $computedRegistry") + state.packageRegistries[packageName] = computedRegistry + computedRegistry } ?: NPMJS_REGISTRY.also { log.info("Using default registry for package $packageName") } @@ -82,15 +84,13 @@ class NPMJSClient(private val project: Project) { log.info("Getting latest version for package $packageName") val registry = getRegistry(packageName) val json = getBodyAsJSON("${registry}/$packageName/latest") - return json?.get("version")?.asString.also { - if (it != null) { - log.info("Latest version for package $packageName found in cache: $it") - } + return json?.get("version")?.asString?.also { + log.info("Latest version for package $packageName found online: $it") } ?: ShellRunner.getInstance(project).execute( arrayOf("npm", "v", packageName, "version", "--registry=$registry") )?.trim()?.let { it.ifEmpty { null } }.also { if (it != null) { - log.info("Latest version for package $packageName found: $it") + log.info("Latest version for package $packageName found locally: $it") } else { log.warn("Latest version for package $packageName not found") } @@ -101,11 +101,9 @@ class NPMJSClient(private val project: Project) { log.info("Getting all versions for package $packageName") val registry = getRegistry(packageName) val json = getBodyAsJSON("${registry}/$packageName") - return json?.get("versions")?.asJsonObject?.keys?.toList().also { - if (it != null) { - log.info("All versions for package $packageName found in cache (${it.size} versions)") - log.debug("Versions in cache for $packageName: $it") - } + return json?.get("versions")?.asJsonObject?.keys?.toList()?.also { + log.info("All versions for package $packageName found in online (${it.size} versions)") + log.debug("Versions for $packageName: $it") } ?: ShellRunner.getInstance(project).execute( arrayOf("npm", "v", packageName, "versions", "--json", "--registry=$registry") )?.trim()?.let { versions -> @@ -122,11 +120,9 @@ class NPMJSClient(private val project: Project) { } else { listOf(versions.replace("\"", "")) } - }.also { versions -> - if (versions != null) { - log.info("All versions for package $packageName found (${versions.size} versions)") - log.debug("Versions for $packageName: $versions") - } + }?.also { versions -> + log.info("All versions for package $packageName found locally (${versions.size} versions)") + log.debug("Local versions for $packageName: $versions") } } @@ -134,15 +130,33 @@ class NPMJSClient(private val project: Project) { log.info("Getting deprecation status for package $packageName") val registry = getRegistry(packageName) val json = getBodyAsJSON("${registry}/$packageName/latest") - return json?.get("deprecated")?.asString.also { - if (it != null) { - log.info("Deprecation status for package $packageName found in cache: $it") + + fun deprecationStatus(deprecation: String, local: Boolean = false): String? { + log.debug("Deprecation status for package $packageName before transformation: $deprecation") + return with(deprecation) { + when { + local && isBlankOrEmpty() -> null + equals("true", ignoreCase = true) || (!local && isBlankOrEmpty()) -> "Deprecated" + equals("false", ignoreCase = true) -> null + else -> this + } + }.also { reason -> + log.debug("Deprecation status for package $packageName after transformation: $reason") } + } + + return json?.get("deprecated")?.let { deprecation -> + log.debug("Deprecation status for package $packageName found online: $deprecation") + if (deprecation.asBoolean == true) { + "Deprecated" + } else deprecation.asString?.let { deprecationStatus(it) } + }?.also { reason -> + log.info("Online deprecation after transformation: $reason") } ?: ShellRunner.getInstance(project).execute( arrayOf("npm", "v", packageName, "deprecated", "--registry=$registry") - )?.trim()?.let { it.ifEmpty { null } }.also { - if (it != null) { - log.info("Deprecation status for package $packageName found: $it") + )?.trim()?.let { deprecationStatus(it, local = true) }.also { reason -> + if (reason != null) { + log.info("Deprecation status for package $packageName found locally: $reason") } else { log.debug("No deprecation status found for package $packageName") } diff --git a/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/engine/ShellRunner.kt b/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/engine/ShellRunner.kt index 6c7bbc7..668068b 100644 --- a/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/engine/ShellRunner.kt +++ b/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/engine/ShellRunner.kt @@ -18,7 +18,7 @@ class ShellRunner(private val project: Project) { private val failedWindowsPrograms = mutableSetOf() - private fun isWindows() = System.getProperty("os.name").lowercase().contains("win") + private fun isWindows() = System.getProperty("os.name").contains("win", ignoreCase = true) fun execute(command: Array): String? { val program = command.firstOrNull() ?: return null.also { diff --git a/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/extensions/Extensions.kt b/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/extensions/Extensions.kt index dc0efdf..b4e19d0 100644 --- a/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/extensions/Extensions.kt +++ b/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/backend/extensions/Extensions.kt @@ -3,13 +3,15 @@ package com.github.warningimhack3r.npmupdatedependencies.backend.extensions import com.intellij.json.psi.JsonValue import kotlinx.coroutines.* import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.booleanOrNull +import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.jsonArray import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive fun safeConversion(block: () -> T): T? = try { block() -} catch (_: Exception) { +} catch (_: IllegalArgumentException) { null } @@ -20,7 +22,10 @@ val JsonElement.asJsonArray get() = safeConversion { jsonArray } val JsonElement.asString - get() = safeConversion { jsonPrimitive.content } + get() = jsonPrimitive.contentOrNull + +val JsonElement.asBoolean + get() = jsonPrimitive.booleanOrNull fun JsonValue.stringValue(): String = text.replace("\"", "") @@ -28,3 +33,5 @@ fun JsonValue.stringValue(): String = text.replace("\"", "") fun Iterable.parallelMap(mapper: suspend (T) -> R) = runBlocking(SupervisorJob() + Dispatchers.Default) { coroutineScope { map { async { mapper(it) } }.awaitAll() } } + +fun String.isBlankOrEmpty() = isBlank() || isEmpty() diff --git a/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/errorsubmitter/GitHubErrorReportSubmitter.kt b/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/errorsubmitter/GitHubErrorReportSubmitter.kt index 5f0b8f9..26a6b6a 100644 --- a/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/errorsubmitter/GitHubErrorReportSubmitter.kt +++ b/src/main/kotlin/com/github/warningimhack3r/npmupdatedependencies/errorsubmitter/GitHubErrorReportSubmitter.kt @@ -54,7 +54,7 @@ class GitHubErrorReportSubmitter : ErrorReportSubmitter() { var causedByLastIndex = -1 val splitStackTrace = stackTrace.split("\n") splitStackTrace.reversed().forEachIndexed { index, s -> - if (s.lowercase().startsWith("caused by")) { + if (s.startsWith("caused by", ignoreCase = true)) { causedByLastIndex = splitStackTrace.size - index return@forEachIndexed } @@ -77,10 +77,10 @@ class GitHubErrorReportSubmitter : ErrorReportSubmitter() { && !line.startsWith("at kotlinx.") && !line.startsWith("at com.intellij.") }.joinToString("\n"), - /*"device-os" to with(System.getProperty("os.name").lowercase()) { + /*"device-os" to with(System.getProperty("os.name")) { when { // Windows, macOS or Linux - startsWith("windows") -> "Windows" - startsWith("mac") -> "macOS" + startsWith("windows", ignoreCase = true) -> "Windows" + startsWith("mac", ignoreCase = true) -> "macOS" else -> "Linux" } },*/ // currently cannot be set (https://github.com/orgs/community/discussions/44983)