From bdb9a7ff56b992ea83e3fd7b0cdc7025b8e006fc Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 29 Nov 2023 14:01:17 +0100 Subject: [PATCH] #1 --- .../gradle/targets/js/nodejs/NodeJsEnv.kt | 2 +- .../targets/js/nodejs/NodeJsRootExtension.kt | 10 +- .../js/npm/KotlinNpmResolutionManager.kt | 15 +- .../kotlin/gradle/targets/js/npm/Npm.kt | 142 ++++++++++++++++++ .../kotlin/gradle/targets/js/npm/NpmApi.kt | 36 ++--- .../kotlin/gradle/targets/js/npm/NpmEnv.kt | 12 ++ .../gradle/targets/js/npm/NpmEnvironment.kt | 21 +++ .../gradle/targets/js/npm/NpmExtension.kt | 86 +++++++++++ .../NpmImportedPackagesVersionResolver.kt} | 9 +- .../gradle/targets/js/npm/NpmOverride.kt | 27 ++++ .../npm/resolved/KotlinRootNpmResolution.kt | 17 +-- .../js/npm/tasks/KotlinNpmInstallTask.kt | 6 +- .../js/npm/tasks/RootPackageJsonTask.kt | 3 +- .../kotlin/gradle/targets/js/yarn/Yarn.kt | 14 +- .../gradle/targets/js/yarn/YarnBasics.kt | 7 +- .../gradle/targets/js/yarn/YarnEnvironment.kt | 23 +++ .../gradle/targets/js/yarn/YarnWorkspaces.kt | 15 +- 17 files changed, 364 insertions(+), 81 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/Npm.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmEnv.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmEnvironment.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmExtension.kt rename libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/{yarn/YarnImportedPackagesVersionResolver.kt => npm/NpmImportedPackagesVersionResolver.kt} (83%) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmOverride.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnEnvironment.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsEnv.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsEnv.kt index dde42b7ec3f97..c5f48fa9f4ecf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsEnv.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsEnv.kt @@ -16,7 +16,7 @@ data class NodeJsEnv( val ivyDependency: String, val downloadBaseUrl: String, - val packageManager: NpmApi, + val packageManager: NpmApi<*>, ) { val isWindows: Boolean get() = platformName == "win" diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt index 285b3150e72fe..7756fd864b5c1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt @@ -67,7 +67,7 @@ open class NodeJsRootExtension( var nodeCommand by Property("node") - var packageManager: NpmApi by Property(Yarn()) + var packageManager: NpmApi<*> by Property(Yarn()) val taskRequirements: TasksRequirements get() = resolver.tasksRequirements @@ -90,7 +90,7 @@ open class NodeJsRootExtension( val name = platform.get().name val architecture = platform.get().arch - val nodeDirName = "node-v$nodeVersion-$name-$architecture" + val nodeDirName = "node-v$version-$name-$architecture" val cleanableStore = CleanableStore[installationDir.absolutePath] val nodeDir = cleanableStore[nodeDirName].use() val isWindows = platform.get().isWindows() @@ -103,7 +103,7 @@ open class NodeJsRootExtension( fun getIvyDependency(): String { val type = if (isWindows) "zip" else "tar.gz" - return "org.nodejs:node:$nodeVersion:$name-$architecture@$type" + return "org.nodejs:node:$version:$name-$architecture@$type" } return NodeJsEnv( @@ -111,11 +111,11 @@ open class NodeJsRootExtension( rootPackageDir = rootPackageDir, nodeDir = nodeDir, nodeBinDir = nodeBinDir, - nodeExecutable = getExecutable("node", nodeCommand, "exe"), + nodeExecutable = getExecutable("node", command, "exe"), platformName = name, architectureName = architecture, ivyDependency = getIvyDependency(), - downloadBaseUrl = nodeDownloadBaseUrl, + downloadBaseUrl = downloadBaseUrl, packageManager = packageManager ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt index a765ebd328d88..64e61b4ac10ad 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResoluti import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinProjectNpmResolver import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinRootNpmResolver +import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnEnvironment internal interface UsesKotlinNpmResolutionManager : Task { @get:Internal @@ -71,15 +72,15 @@ abstract class KotlinNpmResolutionManager : BuildService = emptyList(), services: ServiceRegistry, logger: Logger, - npmEnvironment: NpmEnvironment, + nodeJsEnvironment: NodeJsEnvironment, yarnEnvironment: YarnEnvironment, ): Unit? { synchronized(this) { @@ -92,8 +93,8 @@ abstract class KotlinNpmResolutionManager : BuildService { state1.resolution.prepareInstallation( logger, - npmEnvironment, + nodeJsEnvironment, yarnEnvironment, this ).also { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/Npm.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/Npm.kt new file mode 100644 index 0000000000000..fc62ec345082f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/Npm.kt @@ -0,0 +1,142 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.targets.js.npm + +import org.gradle.api.logging.Logger +import org.gradle.internal.service.ServiceRegistry +import org.jetbrains.kotlin.gradle.internal.execWithProgress +import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsEnv +import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.PreparedKotlinCompilationNpmResolution +import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnEnvironment +import java.io.File + +class Npm : NpmApi { + override fun preparedFiles(nodeJs: NodeJsEnvironment): Collection { + return listOf( + nodeJs + .rootPackageDir + .resolve(NpmProject.PACKAGE_JSON) + ) + } + + override fun prepareRootProject( + nodeJs: NodeJsEnvironment, + rootProjectName: String, + rootProjectVersion: String, + subProjects: Collection, + resolutions: Map, + ) { + return prepareRootPackageJson( + nodeJs, + rootProjectName, + rootProjectVersion, + subProjects, + resolutions + ) + } + + private fun prepareRootPackageJson( + nodeJs: NodeJsEnvironment, + rootProjectName: String, + rootProjectVersion: String, + npmProjects: Collection, + resolutions: Map + ) { + val rootPackageJsonFile = preparedFiles(nodeJs).single() + + saveRootProjectWorkspacesPackageJson( + rootProjectName, + rootProjectVersion, + npmProjects, + resolutions, + rootPackageJsonFile + ) + } + + override fun resolveRootProject( + services: ServiceRegistry, + logger: Logger, + nodeJs: NodeJsEnvironment, + environment: NpmEnvironment, + npmProjects: Collection, + cliArgs: List + ) { + val nodeJsWorldDir = nodeJs.rootPackageDir + + npmExec( + services, + logger, + nodeJs, + environment, + nodeJsWorldDir, + NpmApi.resolveOperationDescription("yarn"), + cliArgs + ) + } + + fun npmExec( + services: ServiceRegistry, + logger: Logger, + nodeJs: NodeJsEnvironment, + environment: NpmEnvironment, + dir: File, + description: String, + args: List + ) { + services.execWithProgress(description) { exec -> + val arguments = args + .plus( + if (logger.isDebugEnabled) "--verbose" else "" + ) + .plus( + if (environment.ignoreScripts) "--ignore-scripts" else "" + ).filter { it.isNotEmpty() } + + val nodeExecutable = nodeJs.nodeExecutable + if (!environment.ignoreScripts) { + val nodePath = if (nodeJs.isWindows) { + File(nodeExecutable).parent + } else { + nodeExecutable + } + exec.environment( + "PATH", + "$nodePath${File.pathSeparator}${System.getenv("PATH")}" + ) + } + + val command = environment.executable + + exec.executable = command + exec.args = arguments + + exec.workingDir = dir + } + + } + + private fun saveRootProjectWorkspacesPackageJson( + rootProjectName: String, + rootProjectVersion: String, + npmProjects: Collection, + resolutions: Map, + rootPackageJsonFile: File + ) { + val nodeJsWorldDir = rootPackageJsonFile.parentFile + val rootPackageJson = PackageJson(rootProjectName, rootProjectVersion) + rootPackageJson.private = true + + val npmProjectWorkspaces = npmProjects.map { it.npmProjectDir.relativeTo(nodeJsWorldDir).path } + val importedProjectWorkspaces = + NpmImportedPackagesVersionResolver(npmProjects, nodeJsWorldDir).resolveAndUpdatePackages() + + rootPackageJson.workspaces = npmProjectWorkspaces + importedProjectWorkspaces + rootPackageJson.resolutions = resolutions + rootPackageJson.saveTo( + rootPackageJsonFile + ) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt index 30362c1cd09be..6ab42cd56c71b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt @@ -9,22 +9,19 @@ import org.gradle.api.logging.Logger import org.gradle.internal.service.ServiceRegistry import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsEnv import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.PreparedKotlinCompilationNpmResolution -import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnEnv -import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnResolution import java.io.File import java.io.Serializable /** * NodeJS package manager API */ -interface NpmApi : Serializable { - fun preparedFiles(nodeJs: NpmEnvironment): Collection +interface NpmApi : Serializable { + fun preparedFiles(nodeJs: NodeJsEnvironment): Collection fun prepareRootProject( - nodeJs: NpmEnvironment, + nodeJs: NodeJsEnvironment, rootProjectName: String, rootProjectVersion: String, - logger: Logger, subProjects: Collection, resolutions: Map, ) @@ -32,8 +29,8 @@ interface NpmApi : Serializable { fun resolveRootProject( services: ServiceRegistry, logger: Logger, - nodeJs: NpmEnvironment, - yarn: YarnEnvironment, + nodeJs: NodeJsEnvironment, + packageManagerEnvironment: T, npmProjects: Collection, cliArgs: List ) @@ -44,32 +41,17 @@ interface NpmApi : Serializable { } } -data class NpmEnvironment( +data class NodeJsEnvironment( val rootPackageDir: File, val nodeExecutable: String, val isWindows: Boolean, - val packageManager: NpmApi + val packageManager: NpmApi<*> ) : Serializable -internal val NodeJsEnv.asNpmEnvironment - get() = NpmEnvironment( +internal val NodeJsEnv.asNodeJsEnvironment + get() = NodeJsEnvironment( rootPackageDir, nodeExecutable, isWindows, packageManager - ) - -data class YarnEnvironment( - val executable: String, - val standalone: Boolean, - val ignoreScripts: Boolean, - val yarnResolutions: List -) : Serializable - -internal val YarnEnv.asYarnEnvironment - get() = YarnEnvironment( - executable, - standalone, - ignoreScripts, - yarnResolutions ) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmEnv.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmEnv.kt new file mode 100644 index 0000000000000..cc8d7e2e2796b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmEnv.kt @@ -0,0 +1,12 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.targets.js.npm + +data class NpmEnv( + val executable: String, + val ignoreScripts: Boolean, + val overrides: List +) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmEnvironment.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmEnvironment.kt new file mode 100644 index 0000000000000..0e0c351cb5f7b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmEnvironment.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.targets.js.npm + +import java.io.Serializable + +data class NpmEnvironment( + val executable: String, + val ignoreScripts: Boolean, + val overrides: List +) : Serializable + +internal val NpmEnv.asNpmEnvironment + get() = NpmEnvironment( + executable, + ignoreScripts, + overrides + ) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmExtension.kt new file mode 100644 index 0000000000000..1455b32f8bb67 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmExtension.kt @@ -0,0 +1,86 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.targets.js.npm + +import org.gradle.api.Action +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.internal.ConfigurationPhaseAware +import org.jetbrains.kotlin.gradle.logging.kotlinInfo +import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsEnv +import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin +import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnLockMismatchReport +import java.io.File + +open class NpmExtension( + val project: Project, +) : ConfigurationPhaseAware() { + init { + check(project == project.rootProject) + } + + private val gradleHome = project.gradle.gradleUserHomeDir.also { + project.logger.kotlinInfo("Storing cached files in $it") + } + + var command by Property("npm") + + var lockFileName by Property("package-lock.json") + var lockFileDirectory: File by Property(project.rootDir.resolve("kotlin-js-store")) + + var ignoreScripts by Property(true) + + var packageLockMismatchReport: YarnLockMismatchReport by Property(YarnLockMismatchReport.FAIL) + + var reportNewPackageLock: Boolean by Property(false) + + var packageLockAutoReplace: Boolean by Property(false) + + var overrides: MutableList by Property(mutableListOf()) + + fun override(path: String, configure: Action) { + overrides.add( + NpmOverride(path) + .apply { configure.execute(this) } + ) + } + + fun override(path: String, version: String) { + override(path, Action { + it.include(version) + }) + } + + internal val nodeJsEnvironment: org.gradle.api.provider.Property = project.objects.property(NodeJsEnv::class.java) + + override fun finalizeConfiguration(): NpmEnv { + val nodeJsEnvironmentValue = nodeJsEnvironment.get() + val isWindows = nodeJsEnvironmentValue.isWindows + + fun getExecutable(command: String, customCommand: String, windowsExtension: String): String { + val finalCommand = if (isWindows && customCommand == command) "$command.$windowsExtension" else customCommand + return if (nodeJsEnvironmentValue.download) + nodeJsEnvironmentValue.nodeBinDir + .resolve(finalCommand).absolutePath + else + finalCommand + } + return NpmEnv( + executable = getExecutable("npm", command, "exe"), + ignoreScripts = ignoreScripts, + overrides = overrides + ) + } + + companion object { + const val YARN: String = "kotlinNpm" + + operator fun get(project: Project): NpmExtension { + val rootProject = project.rootProject + rootProject.plugins.apply(NodeJsRootPlugin::class.java) + return rootProject.extensions.getByName(YARN) as NpmExtension + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnImportedPackagesVersionResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmImportedPackagesVersionResolver.kt similarity index 83% rename from libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnImportedPackagesVersionResolver.kt rename to libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmImportedPackagesVersionResolver.kt index da2cd29983d9f..a90dbb6a7279b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnImportedPackagesVersionResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmImportedPackagesVersionResolver.kt @@ -1,17 +1,14 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.gradle.targets.js.yarn +package org.jetbrains.kotlin.gradle.targets.js.npm -import org.gradle.api.logging.Logger -import org.jetbrains.kotlin.gradle.targets.js.npm.GradleNodeModule import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.PreparedKotlinCompilationNpmResolution import java.io.File -class YarnImportedPackagesVersionResolver( - private val logger: Logger, +class NpmImportedPackagesVersionResolver( npmProjects: Collection, private val nodeJsWorldDir: File ) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmOverride.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmOverride.kt new file mode 100644 index 0000000000000..d6a7995e8fc56 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmOverride.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.targets.js.npm + +import java.io.Serializable + +class NpmOverride( + val path: String +) : Serializable { + var includedVersions = mutableListOf() + var excludedVersions = mutableListOf() + + fun include(vararg include: String) { + includedVersions.addAll(include) + } + + fun exclude(vararg exclude: String) { + excludedVersions.addAll(exclude) + } +} + +fun NpmOverride.toVersionString(): String { + return buildNpmVersion(includedVersions, excludedVersions) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt index 8f7ade1fa08ab..d288722972354 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt @@ -8,8 +8,8 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.resolved import org.gradle.api.logging.Logger import org.gradle.internal.service.ServiceRegistry import org.jetbrains.kotlin.gradle.targets.js.npm.KotlinNpmResolutionManager -import org.jetbrains.kotlin.gradle.targets.js.npm.NpmEnvironment -import org.jetbrains.kotlin.gradle.targets.js.npm.YarnEnvironment +import org.jetbrains.kotlin.gradle.targets.js.npm.NodeJsEnvironment +import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnEnvironment import org.jetbrains.kotlin.gradle.targets.js.yarn.toVersionString import java.io.Serializable @@ -25,7 +25,7 @@ class KotlinRootNpmResolution( */ internal fun prepareInstallation( logger: Logger, - npmEnvironment: NpmEnvironment, + nodeJsEnvironment: NodeJsEnvironment, yarnEnvironment: YarnEnvironment, npmResolutionManager: KotlinNpmResolutionManager, ): Installation { @@ -41,11 +41,10 @@ class KotlinRootNpmResolution( ) } - npmEnvironment.packageManager.prepareRootProject( - npmEnvironment, + nodeJsEnvironment.packageManager.prepareRootProject( + nodeJsEnvironment, rootProjectName, rootProjectVersion, - logger, projectResolutions, yarnEnvironment.yarnResolutions .associate { it.path to it.toVersionString() }, @@ -63,14 +62,14 @@ class Installation(val compilationResolutions: Collection, services: ServiceRegistry, logger: Logger, - npmEnvironment: NpmEnvironment, + nodeJsEnvironment: NodeJsEnvironment, yarnEnvironment: YarnEnvironment, ) { synchronized(compilationResolutions) { - npmEnvironment.packageManager.resolveRootProject( + nodeJsEnvironment.packageManager.resolveRootProject( services, logger, - npmEnvironment, + nodeJsEnvironment, yarnEnvironment, compilationResolutions, args diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt index bc9013b51e35d..2bdb33ddf15de 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinNpmInstallTask.kt @@ -13,8 +13,8 @@ import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.kotlinNodeJsExtension import org.jetbrains.kotlin.gradle.targets.js.npm.KotlinNpmResolutionManager import org.jetbrains.kotlin.gradle.targets.js.npm.UsesKotlinNpmResolutionManager -import org.jetbrains.kotlin.gradle.targets.js.npm.asNpmEnvironment -import org.jetbrains.kotlin.gradle.targets.js.npm.asYarnEnvironment +import org.jetbrains.kotlin.gradle.targets.js.npm.asNodeJsEnvironment +import org.jetbrains.kotlin.gradle.targets.js.yarn.asYarnEnvironment import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinRootNpmResolver import org.jetbrains.kotlin.gradle.targets.js.yarn.yarn import java.io.File @@ -42,7 +42,7 @@ abstract class KotlinNpmInstallTask : // ----- private val npmEnvironment by lazy { - nodeJs.requireConfigured().asNpmEnvironment + nodeJs.requireConfigured().asNodeJsEnvironment } private val yarnEnv by lazy { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt index 658d86c4dcd7f..906a3980b4f4d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/RootPackageJsonTask.kt @@ -12,6 +12,7 @@ import org.gradle.work.NormalizeLineEndings import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.kotlinNodeJsExtension import org.jetbrains.kotlin.gradle.targets.js.npm.* import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinRootNpmResolver +import org.jetbrains.kotlin.gradle.targets.js.yarn.asYarnEnvironment import org.jetbrains.kotlin.gradle.targets.js.yarn.yarn import java.io.File @@ -38,7 +39,7 @@ abstract class RootPackageJsonTask : // ----- private val npmEnvironment by lazy { - nodeJs.requireConfigured().asNpmEnvironment + nodeJs.requireConfigured().asNodeJsEnvironment } private val yarnEnv by lazy { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt index 8d2470bf0906f..94afff01284cc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt @@ -8,22 +8,21 @@ package org.jetbrains.kotlin.gradle.targets.js.yarn import org.gradle.api.logging.Logger import org.gradle.internal.service.ServiceRegistry import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi -import org.jetbrains.kotlin.gradle.targets.js.npm.NpmEnvironment -import org.jetbrains.kotlin.gradle.targets.js.npm.YarnEnvironment +import org.jetbrains.kotlin.gradle.targets.js.npm.NodeJsEnvironment import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.PreparedKotlinCompilationNpmResolution import java.io.File +import java.io.Serializable -class Yarn : NpmApi { +class Yarn : NpmApi { private val yarnWorkspaces = YarnWorkspaces() - override fun preparedFiles(nodeJs: NpmEnvironment): Collection = + override fun preparedFiles(nodeJs: NodeJsEnvironment): Collection = yarnWorkspaces.preparedFiles(nodeJs) override fun prepareRootProject( - nodeJs: NpmEnvironment, + nodeJs: NodeJsEnvironment, rootProjectName: String, rootProjectVersion: String, - logger: Logger, subProjects: Collection, resolutions: Map, ) = yarnWorkspaces @@ -31,7 +30,6 @@ class Yarn : NpmApi { nodeJs, rootProjectName, rootProjectVersion, - logger, subProjects, resolutions, ) @@ -39,7 +37,7 @@ class Yarn : NpmApi { override fun resolveRootProject( services: ServiceRegistry, logger: Logger, - nodeJs: NpmEnvironment, + nodeJs: NodeJsEnvironment, yarn: YarnEnvironment, npmProjects: Collection, cliArgs: List diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnBasics.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnBasics.kt index 1a75abeceaad0..1107315df3646 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnBasics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnBasics.kt @@ -9,16 +9,15 @@ import org.gradle.api.logging.Logger import org.gradle.internal.service.ServiceRegistry import org.jetbrains.kotlin.gradle.internal.execWithProgress import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi -import org.jetbrains.kotlin.gradle.targets.js.npm.NpmEnvironment -import org.jetbrains.kotlin.gradle.targets.js.npm.YarnEnvironment +import org.jetbrains.kotlin.gradle.targets.js.npm.NodeJsEnvironment import java.io.File -abstract class YarnBasics : NpmApi { +abstract class YarnBasics : NpmApi { fun yarnExec( services: ServiceRegistry, logger: Logger, - nodeJs: NpmEnvironment, + nodeJs: NodeJsEnvironment, yarn: YarnEnvironment, dir: File, description: String, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnEnvironment.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnEnvironment.kt new file mode 100644 index 0000000000000..640728db985d4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnEnvironment.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.targets.js.yarn + +import java.io.Serializable + +data class YarnEnvironment( + val executable: String, + val standalone: Boolean, + val ignoreScripts: Boolean, + val yarnResolutions: List +) : Serializable + +internal val YarnEnv.asYarnEnvironment + get() = YarnEnvironment( + executable, + standalone, + ignoreScripts, + yarnResolutions + ) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt index 39cfbbe1653c6..0d487aa4cf603 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.PreparedKotlinCompila import java.io.File class YarnWorkspaces : YarnBasics() { - override fun preparedFiles(nodeJs: NpmEnvironment): Collection { + override fun preparedFiles(nodeJs: NodeJsEnvironment): Collection { return listOf( nodeJs .rootPackageDir @@ -21,10 +21,9 @@ class YarnWorkspaces : YarnBasics() { } override fun prepareRootProject( - nodeJs: NpmEnvironment, + nodeJs: NodeJsEnvironment, rootProjectName: String, rootProjectVersion: String, - logger: Logger, subProjects: Collection, resolutions: Map, ) { @@ -32,17 +31,15 @@ class YarnWorkspaces : YarnBasics() { nodeJs, rootProjectName, rootProjectVersion, - logger, subProjects, resolutions ) } private fun prepareRootPackageJson( - nodeJs: NpmEnvironment, + nodeJs: NodeJsEnvironment, rootProjectName: String, rootProjectVersion: String, - logger: Logger, npmProjects: Collection, resolutions: Map ) { @@ -51,7 +48,6 @@ class YarnWorkspaces : YarnBasics() { saveRootProjectWorkspacesPackageJson( rootProjectName, rootProjectVersion, - logger, npmProjects, resolutions, rootPackageJsonFile @@ -61,7 +57,7 @@ class YarnWorkspaces : YarnBasics() { override fun resolveRootProject( services: ServiceRegistry, logger: Logger, - nodeJs: NpmEnvironment, + nodeJs: NodeJsEnvironment, yarn: YarnEnvironment, npmProjects: Collection, cliArgs: List @@ -82,7 +78,6 @@ class YarnWorkspaces : YarnBasics() { private fun saveRootProjectWorkspacesPackageJson( rootProjectName: String, rootProjectVersion: String, - logger: Logger, npmProjects: Collection, resolutions: Map, rootPackageJsonFile: File @@ -93,7 +88,7 @@ class YarnWorkspaces : YarnBasics() { val npmProjectWorkspaces = npmProjects.map { it.npmProjectDir.relativeTo(nodeJsWorldDir).path } val importedProjectWorkspaces = - YarnImportedPackagesVersionResolver(logger, npmProjects, nodeJsWorldDir).resolveAndUpdatePackages() + NpmImportedPackagesVersionResolver(npmProjects, nodeJsWorldDir).resolveAndUpdatePackages() rootPackageJson.workspaces = npmProjectWorkspaces + importedProjectWorkspaces rootPackageJson.resolutions = resolutions