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 2c35211..a4b76b9 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ 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)