diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt index c0ff2ab9f02..5f448cec8b0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmApi.kt @@ -21,7 +21,8 @@ interface NpmApi { fun prepareRootProject( rootProject: Project, - subProjects: Collection + subProjects: Collection, + resolutions: Map ) fun resolveRootProject( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependencyConstraint.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependencyConstraint.kt new file mode 100644 index 00000000000..3188abb6916 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependencyConstraint.kt @@ -0,0 +1,77 @@ +/* + * 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.gradle.api.artifacts.* +import org.gradle.api.attributes.AttributeContainer +import org.gradle.api.internal.artifacts.DefaultModuleIdentifier +import org.gradle.api.internal.artifacts.dependencies.DefaultMutableVersionConstraint +import org.gradle.api.internal.artifacts.dependencies.DependencyConstraintInternal +import org.gradle.api.internal.attributes.ImmutableAttributes +import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin + +class NpmDependencyConstraint( + internal val project: Project, + private val name: String, + private val version: String, + val scope: NpmDependency.Scope = NpmDependency.Scope.NORMAL +) : DependencyConstraintInternal { + + private val moduleIdentifier = DefaultModuleIdentifier.newId(null, name); + private val versionConstraint = DefaultMutableVersionConstraint(version) + + override fun getGroup(): String? = moduleIdentifier.group + + override fun getName(): String = moduleIdentifier.name + + override fun getVersion(): String = versionConstraint.version + + override fun matchesStrictly(p0: ModuleVersionIdentifier): Boolean { + TODO("Not yet implemented") + } + + override fun getModule(): ModuleIdentifier { + return moduleIdentifier + } + + override fun getAttributes(): AttributeContainer { + return ImmutableAttributes.EMPTY + } + + override fun attributes(p0: Action): DependencyConstraint { + return this + } + + override fun version(p0: Action) { + TODO("Not yet implemented") + } + + override fun getReason(): String? { + return null + } + + override fun because(p0: String?) { + TODO("Not yet implemented") + } + + override fun getVersionConstraint(): VersionConstraint { + println("get version constraint") + val nodeJs = NodeJsRootPlugin.apply(project.rootProject) + nodeJs.npmResolutionManager.requireConfiguringState() + .resolutions[name] = version + return versionConstraint + } + + override fun setForce(p0: Boolean) { + + } + + override fun isForce(): Boolean { + return false + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt index c166f5fd2a1..e93f01dd55e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt @@ -31,6 +31,8 @@ class PackageJson( var workspaces: Collection? = null + var resolutions: Map? = null + @Suppress("USELESS_ELVIS") val devDependencies = mutableMapOf() get() = field ?: mutableMapOf() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt index b40640b7636..80739b88162 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt @@ -49,6 +49,7 @@ internal class KotlinRootNpmResolver internal constructor( val compositeNodeModules = CompositeNodeModulesCache(nodeJs) val packageJsonUmbrella = rootProject.registerTask(PACKAGE_JSON_UMBRELLA_TASK_NAME, Task::class.java) {} val projectResolvers = mutableMapOf() + val resolutions = mutableMapOf() fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved." @@ -110,7 +111,8 @@ internal class KotlinRootNpmResolver internal constructor( nodeJs.packageManager.prepareRootProject( rootProject, - allNpmPackages + allNpmPackages, + resolutions ) return Installation( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt index fa626ebbce6..7d86b8fc623 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt @@ -30,11 +30,13 @@ class Yarn : NpmApi { override fun prepareRootProject( rootProject: Project, - subProjects: Collection + subProjects: Collection, + resolutions: Map ) = getDelegate(rootProject.project) .prepareRootProject( rootProject, - subProjects + subProjects, + resolutions ) override fun resolveRootProject( @@ -44,7 +46,12 @@ class Yarn : NpmApi { cliArgs: List ) { getDelegate(rootProject.project) - .resolveRootProject(rootProject, npmProjects, skipExecution, cliArgs) + .resolveRootProject( + rootProject, + npmProjects, + skipExecution, + cliArgs + ) } override fun resolveDependency( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt index 5627407d3b2..5a2f15b0a6b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnSimple.kt @@ -33,7 +33,8 @@ class YarnSimple : YarnBasics() { override fun prepareRootProject( rootProject: Project, - subProjects: Collection + subProjects: Collection, + resolutions: Map ) = Unit override fun resolveRootProject( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt index 4942fd048cc..be7e7f7d81c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnWorkspaces.kt @@ -26,23 +26,31 @@ class YarnWorkspaces : YarnBasics() { override fun prepareRootProject( rootProject: Project, - subProjects: Collection + subProjects: Collection, + resolutions: Map ) { check(rootProject == rootProject.rootProject) setup(rootProject) return prepareRootPackageJson( rootProject, - subProjects + subProjects, + resolutions ) } private fun prepareRootPackageJson( rootProject: Project, - npmProjects: Collection + npmProjects: Collection, + resolutions: Map ) { val rootPackageJsonFile = preparedFiles(rootProject).single() - saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, rootPackageJsonFile) + saveRootProjectWorkspacesPackageJson( + rootProject, + npmProjects, + resolutions, + rootPackageJsonFile + ) } override fun resolveRootProject( @@ -68,6 +76,7 @@ class YarnWorkspaces : YarnBasics() { private fun saveRootProjectWorkspacesPackageJson( rootProject: Project, npmProjects: Collection, + resolutions: Map, rootPackageJsonFile: File ) { val nodeJsWorldDir = rootPackageJsonFile.parentFile @@ -79,6 +88,8 @@ class YarnWorkspaces : YarnBasics() { YarnImportedPackagesVersionResolver(rootProject, npmProjects, nodeJsWorldDir).resolveAndUpdatePackages() rootPackageJson.workspaces = npmProjectWorkspaces + importedProjectWorkspaces + println("resolutions $resolutions") + rootPackageJson.resolutions = resolutions rootPackageJson.saveTo( rootPackageJsonFile )