Gradle, JS: rework nodejs extensions and plugins

Get rid of Project.nodeJs
This commit is contained in:
Sergey Rostov
2019-07-03 16:43:50 +03:00
parent 24f08a614e
commit 2f90742809
23 changed files with 73 additions and 76 deletions
@@ -46,12 +46,11 @@ open class NodeJsExec : AbstractExecTask<NodeJsExec>(NodeJsExec::class.java), Re
fun create( fun create(
compilation: KotlinJsCompilation, compilation: KotlinJsCompilation,
name: String, name: String,
providedNodeJs: NodeJsRootExtension? = null,
configuration: NodeJsExec.() -> Unit = {} configuration: NodeJsExec.() -> Unit = {}
): TaskHolder<NodeJsExec> { ): TaskHolder<NodeJsExec> {
val target = compilation.target val target = compilation.target
val project = target.project val project = target.project
val nodeJs = providedNodeJs ?: NodeJsRootPlugin.apply(project).root val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
return project.createOrRegisterTask(name) { return project.createOrRegisterTask(name) {
it.nodeJs = nodeJs it.nodeJs = nodeJs
@@ -9,23 +9,11 @@ import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.NpmVersions import org.jetbrains.kotlin.gradle.targets.js.NpmVersions
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
open class NodeJsExtension(val project: Project, root: NodeJsRootExtension?) { open class NodeJsExtension(val project: Project) {
@Suppress("LeakingThis")
val root: NodeJsRootExtension = root ?: this as NodeJsRootExtension
internal val packageJsonHandlers = mutableListOf<PackageJson.() -> Unit>() internal val packageJsonHandlers = mutableListOf<PackageJson.() -> Unit>()
val versions = NpmVersions()
@Suppress("unused") @Suppress("unused")
fun packageJson(handler: PackageJson.() -> Unit) { fun packageJson(handler: PackageJson.() -> Unit) {
packageJsonHandlers.add(handler) packageJsonHandlers.add(handler)
} }
} }
val Project.nodeJs: NodeJsExtension
get() {
val project = this
project.plugins.apply(NodeJsPlugin::class.java)
return project.extensions.getByName(NodeJsRootExtension.EXTENSION_NAME) as NodeJsExtension
}
@@ -10,12 +10,19 @@ import org.gradle.api.Project
class NodeJsPlugin : Plugin<Project> { class NodeJsPlugin : Plugin<Project> {
override fun apply(target: Project) { override fun apply(target: Project) {
val root = NodeJsRootPlugin.apply(target.rootProject) as NodeJsRootExtension val root = NodeJsRootPlugin.apply(target.rootProject)
if (target != target.rootProject) { if (target != target.rootProject) {
target.extensions.create(NodeJsRootExtension.EXTENSION_NAME, NodeJsExtension::class.java, target, root) target.extensions.create(NodeJsRootExtension.EXTENSION_NAME, NodeJsExtension::class.java, target)
} }
root.requireResolver().addProject(target) root.requireResolver().addProject(target)
} }
companion object {
fun apply(project: Project): NodeJsExtension {
project.plugins.apply(NodeJsPlugin::class.java)
return project.extensions.getByName(NodeJsRootExtension.EXTENSION_NAME) as NodeJsExtension
}
}
} }
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.gradle.targets.js.nodejs
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.logging.kotlinInfo import org.jetbrains.kotlin.gradle.logging.kotlinInfo
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.NpmVersions
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution
@@ -12,7 +13,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
import org.jetbrains.kotlin.gradle.targets.js.yarn.Yarn import org.jetbrains.kotlin.gradle.targets.js.yarn.Yarn
import java.io.File import java.io.File
open class NodeJsRootExtension(project: Project) : NodeJsExtension(project, null) { open class NodeJsRootExtension(project: Project) : NodeJsExtension(project) {
init { init {
check(project.rootProject == project) check(project.rootProject == project)
} }
@@ -84,6 +85,8 @@ open class NodeJsRootExtension(project: Project) : NodeJsExtension(project, null
} }
} }
val versions = NpmVersions()
internal val resolutionState: ResolutionState internal val resolutionState: ResolutionState
get() = _resolutionState get() = _resolutionState
@@ -15,7 +15,7 @@ open class NodeJsRootPlugin : Plugin<Project> {
"NodeJsRootPlugin can be applied only to root project" "NodeJsRootPlugin can be applied only to root project"
} }
val root = this.extensions.create(EXTENSION_NAME, NodeJsRootExtension::class.java, this) this.extensions.create(EXTENSION_NAME, NodeJsRootExtension::class.java, this)
val setupTask = tasks.create(NodeJsSetupTask.NAME, NodeJsSetupTask::class.java) { val setupTask = tasks.create(NodeJsSetupTask.NAME, NodeJsSetupTask::class.java) {
it.group = TASKS_GROUP_NAME it.group = TASKS_GROUP_NAME
@@ -32,10 +32,10 @@ open class NodeJsRootPlugin : Plugin<Project> {
companion object { companion object {
const val TASKS_GROUP_NAME: String = "nodeJs" const val TASKS_GROUP_NAME: String = "nodeJs"
fun apply(project: Project): NodeJsExtension { fun apply(rootProject: Project): NodeJsRootExtension {
val rootProject = project.rootProject check(rootProject == rootProject.rootProject)
rootProject.plugins.apply(NodeJsRootPlugin::class.java) rootProject.plugins.apply(NodeJsRootPlugin::class.java)
return rootProject.extensions.getByName(EXTENSION_NAME) as NodeJsExtension return rootProject.extensions.getByName(EXTENSION_NAME) as NodeJsRootExtension
} }
} }
} }
@@ -11,7 +11,7 @@ import java.io.File
import java.net.URI import java.net.URI
open class NodeJsSetupTask : DefaultTask() { open class NodeJsSetupTask : DefaultTask() {
private val settings get() = project.nodeJs.root private val settings get() = NodeJsRootPlugin.apply(project.rootProject)
private val env by lazy { settings.environment } private val env by lazy { settings.environment }
val ivyDependency: String val ivyDependency: String
@@ -21,7 +21,7 @@ internal class GradleNodeModulesCache(val nodeJs: NodeJsRootExtension) : AutoClo
} }
val project: Project get() = nodeJs.project val project: Project get() = nodeJs.project
internal val dir = nodeJs.root.nodeModulesGradleCacheDir internal val dir = nodeJs.nodeModulesGradleCacheDir
private val cache = ProcessedFilesCache(project, dir, STATE_FILE_NAME, "9") private val cache = ProcessedFilesCache(project, dir, STATE_FILE_NAME, "9")
@Synchronized @Synchronized
@@ -16,10 +16,9 @@ import org.gradle.api.internal.artifacts.dependencies.SelfResolvingDependencyInt
import org.gradle.api.tasks.TaskDependency import org.gradle.api.tasks.TaskDependency
import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier
import org.jetbrains.kotlin.gradle.internal.isInIdeaSync import org.jetbrains.kotlin.gradle.internal.isInIdeaSync
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinRootNpmResolver import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import java.io.File import java.io.File
data class NpmDependency( data class NpmDependency(
@@ -85,7 +84,7 @@ data class NpmDependency(
} }
private fun resolveProject(): KotlinCompilationNpmResolution? { private fun resolveProject(): KotlinCompilationNpmResolution? {
val nodeJs = project.nodeJs.root val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
val resolvedProject = val resolvedProject =
if (isInIdeaSync) nodeJs.resolveIfNeeded(project) if (isInIdeaSync) nodeJs.resolveIfNeeded(project)
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask
import java.io.File import java.io.File
@@ -29,7 +29,7 @@ open class NpmProject(val compilation: KotlinJsCompilation) {
get() = buildNpmProjectName() get() = buildNpmProjectName()
val nodeJs val nodeJs
get() = project.nodeJs.root get() = NodeJsRootPlugin.apply(project.rootProject)
val dir: File val dir: File
get() = nodeJs.projectPackagesDir.resolve(name) get() = nodeJs.projectPackagesDir.resolve(name)
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle.targets.js.npm
import com.google.gson.stream.JsonWriter import com.google.gson.stream.JsonWriter
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import java.io.File import java.io.File
@@ -9,9 +9,8 @@ import org.gradle.api.DefaultTask
import org.gradle.api.tasks.InputFiles import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskAction
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinRootNpmResolver
import java.io.File import java.io.File
open class KotlinNpmInstallTask : DefaultTask() { open class KotlinNpmInstallTask : DefaultTask() {
@@ -19,18 +18,20 @@ open class KotlinNpmInstallTask : DefaultTask() {
check(project == project.rootProject) check(project == project.rootProject)
} }
private val nodeJs get() = NodeJsRootPlugin.apply(project.rootProject)
@Suppress("unused") @Suppress("unused")
@get:InputFiles @get:InputFiles
val packageJsonFiles: Collection<File> val packageJsonFiles: Collection<File>
get() = project.nodeJs.root.resolutionState.compilations.map { it.npmProject.packageJsonFile } get() = nodeJs.resolutionState.compilations.map { it.npmProject.packageJsonFile }
@get:OutputFile @get:OutputFile
val yarnLock: File val yarnLock: File
get() = project.nodeJs.root.rootPackageDir.resolve("yarn.lock") get() = nodeJs.rootPackageDir.resolve("yarn.lock")
@TaskAction @TaskAction
fun resolve() { fun resolve() {
project.nodeJs.root.resolveIfNeeded(project) nodeJs.resolveIfNeeded(project)
} }
companion object { companion object {
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.gradle.plugin.TaskHolder
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
@@ -41,7 +40,7 @@ open class KotlinPackageJsonTask : DefaultTask() {
val target = compilation.target val target = compilation.target
val project = target.project val project = target.project
val npmProject = compilation.npmProject val npmProject = compilation.npmProject
val nodeJs = project.nodeJs.root val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
val rootClean = project.rootProject.tasks.getByName(BasePlugin.CLEAN_TASK_NAME) val rootClean = project.rootProject.tasks.getByName(BasePlugin.CLEAN_TASK_NAME)
val npmInstallTask = nodeJs.npmInstallTask val npmInstallTask = nodeJs.npmInstallTask
@@ -53,7 +52,7 @@ open class KotlinPackageJsonTask : DefaultTask() {
task.group = NodeJsRootPlugin.TASKS_GROUP_NAME task.group = NodeJsRootPlugin.TASKS_GROUP_NAME
@Suppress("UnstableApiUsage") @Suppress("UnstableApiUsage")
task.dependsOn(target.project.provider{ task.findDependentTasks() }) task.dependsOn(target.project.provider { task.findDependentTasks() })
task.mustRunAfter(rootClean) task.mustRunAfter(rootClean)
} }
@@ -9,7 +9,7 @@ import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfigWriter import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfigWriter
@@ -40,11 +40,12 @@ class KotlinBrowserJs(target: KotlinJsTarget) :
override fun configureRun(compilation: KotlinJsCompilation) { override fun configureRun(compilation: KotlinJsCompilation) {
val project = compilation.target.project val project = compilation.target.project
val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("webpack")) { project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("webpack")) {
val compileKotlinTask = compilation.compileKotlinTask val compileKotlinTask = compilation.compileKotlinTask
it.dependsOn( it.dependsOn(
target.project.nodeJs.root.npmInstallTask, nodeJs.npmInstallTask,
compileKotlinTask compileKotlinTask
) )
@@ -57,7 +58,7 @@ class KotlinBrowserJs(target: KotlinJsTarget) :
val run = project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("run")) { val run = project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("run")) {
val compileKotlinTask = compilation.compileKotlinTask val compileKotlinTask = compilation.compileKotlinTask
it.dependsOn( it.dependsOn(
target.project.nodeJs.root.npmInstallTask, nodeJs.npmInstallTask,
compileKotlinTask, compileKotlinTask,
target.project.tasks.getByName(compilation.processResourcesTaskName) target.project.tasks.getByName(compilation.processResourcesTaskName)
) )
@@ -11,8 +11,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetDsl import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetDsl
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
@@ -25,12 +25,13 @@ abstract class KotlinJsSubTarget(
private val disambiguationClassifier: String private val disambiguationClassifier: String
) : KotlinJsSubTargetDsl { ) : KotlinJsSubTargetDsl {
val project get() = target.project val project get() = target.project
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
val runTaskName = disambiguateCamelCased("run") val runTaskName = disambiguateCamelCased("run")
val testTaskName = disambiguateCamelCased("test") val testTaskName = disambiguateCamelCased("test")
fun configure() { fun configure() {
project.nodeJs NodeJsPlugin.apply(project)
configureTests() configureTests()
configureRun() configureRun()
@@ -67,16 +68,13 @@ abstract class KotlinJsSubTarget(
abstract val testTaskDescription: String abstract val testTaskDescription: String
private fun configureTests(compilation: KotlinJsCompilation) { private fun configureTests(compilation: KotlinJsCompilation) {
// apply plugin (cannot be done at task instantiation time)
val nodeJs = NodeJsRootPlugin.apply(target.project).root
val testJs = project.createOrRegisterTask<KotlinJsTest>(testTaskName) { testJs -> val testJs = project.createOrRegisterTask<KotlinJsTest>(testTaskName) { testJs ->
val compileTask = compilation.compileKotlinTask val compileTask = compilation.compileKotlinTask
testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP
testJs.description = testTaskDescription testJs.description = testTaskDescription
testJs.dependsOn(target.project.nodeJs.root.npmInstallTask, compileTask, nodeJs.nodeJsSetupTask) testJs.dependsOn(nodeJs.npmInstallTask, compileTask, nodeJs.nodeJsSetupTask)
testJs.onlyIf { testJs.onlyIf {
compileTask.outputFile.exists() compileTask.outputFile.exists()
@@ -5,15 +5,11 @@
package org.jetbrains.kotlin.gradle.targets.js.subtargets package org.jetbrains.kotlin.gradle.targets.js.subtargets
import org.jetbrains.kotlin.gradle.plugin.TaskHolder
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
class KotlinNodeJs(target: KotlinJsTarget) : class KotlinNodeJs(target: KotlinJsTarget) :
KotlinJsSubTarget(target, "node"), KotlinJsSubTarget(target, "node"),
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecuti
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.karma.KotlinKarma import org.jetbrains.kotlin.gradle.targets.js.testing.karma.KotlinKarma
@@ -23,6 +22,8 @@ import org.jetbrains.kotlin.gradle.targets.js.testing.nodejs.KotlinNodeJsTestRun
import org.jetbrains.kotlin.gradle.tasks.KotlinTest import org.jetbrains.kotlin.gradle.tasks.KotlinTest
open class KotlinJsTest : KotlinTest(), RequiresNpmDependencies { open class KotlinJsTest : KotlinTest(), RequiresNpmDependencies {
private val nodeJs get() = NodeJsRootPlugin.apply(project.rootProject)
@get:Internal @get:Internal
internal var testFramework: KotlinJsTestFramework? = null internal var testFramework: KotlinJsTestFramework? = null
@@ -92,14 +93,14 @@ open class KotlinJsTest : KotlinTest(), RequiresNpmDependencies {
} }
override fun executeTests() { override fun executeTests() {
project.nodeJs.root.checkRequiredDependencies(project, this) nodeJs.checkRequiredDependencies(project, this)
super.executeTests() super.executeTests()
} }
override fun createTestExecutionSpec(): TCServiceMessagesTestExecutionSpec { override fun createTestExecutionSpec(): TCServiceMessagesTestExecutionSpec {
val forkOptions = DefaultProcessForkOptions(fileResolver) val forkOptions = DefaultProcessForkOptions(fileResolver)
forkOptions.workingDir = compilation.npmProject.dir forkOptions.workingDir = compilation.npmProject.dir
forkOptions.executable = NodeJsRootPlugin.apply(project).root.environment.nodeExecutable forkOptions.executable = nodeJs.environment.nodeExecutable
val nodeJsArgs = mutableListOf<String>() val nodeJsArgs = mutableListOf<String>()
@@ -18,9 +18,9 @@ import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecuti
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.appendConfigsFromDir import org.jetbrains.kotlin.gradle.targets.js.appendConfigsFromDir
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
@@ -31,13 +31,13 @@ import org.slf4j.Logger
import java.io.File import java.io.File
class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestFramework { class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestFramework {
val project: Project private val project: Project = compilation.target.project
get() = compilation.target.project private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
private val versions = nodeJs.versions
private val config: KarmaConfig = KarmaConfig() private val config: KarmaConfig = KarmaConfig()
private val requiredDependencies = mutableSetOf<NpmPackageVersion>() private val requiredDependencies = mutableSetOf<NpmPackageVersion>()
private val versions = project.nodeJs.versions
private val configurators = mutableListOf<(KotlinJsTest) -> Unit>() private val configurators = mutableListOf<(KotlinJsTest) -> Unit>()
private val confJsWriters = mutableListOf<(Appendable) -> Unit>() private val confJsWriters = mutableListOf<(Appendable) -> Unit>()
private var sourceMaps = false private var sourceMaps = false
@@ -119,7 +119,7 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF
sourceMaps = true, sourceMaps = true,
export = false, export = false,
progressReporter = true, progressReporter = true,
progressReporterPathFilter = project.nodeJs.root.rootPackageDir.absolutePath progressReporterPathFilter = nodeJs.rootPackageDir.absolutePath
).appendTo(it) ).appendTo(it)
it.appendln(" return config;") it.appendln(" return config;")
@@ -11,18 +11,17 @@ import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSetti
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.KotlinGradleNpmPackage import org.jetbrains.kotlin.gradle.targets.js.KotlinGradleNpmPackage
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
class KotlinMocha(override val compilation: KotlinJsCompilation) : KotlinJsTestFramework { class KotlinMocha(override val compilation: KotlinJsCompilation) : KotlinJsTestFramework {
val project: Project private val project: Project = compilation.target.project
get() = compilation.target.project private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
private val versions = nodeJs.versions
private val versions = project.nodeJs.versions
override val settingsState: String override val settingsState: String
get() = "mocha" get() = "mocha"
@@ -15,8 +15,8 @@ import org.gradle.deployment.internal.DeploymentRegistry
import org.gradle.process.internal.ExecHandle import org.gradle.process.internal.ExecHandle
import org.gradle.process.internal.ExecHandleFactory import org.gradle.process.internal.ExecHandleFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.testing.internal.reportsDir import org.jetbrains.kotlin.gradle.testing.internal.reportsDir
@@ -25,7 +25,8 @@ import java.io.File
import javax.inject.Inject import javax.inject.Inject
open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies { open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
private val versions by lazy { project.nodeJs.versions } private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
private val versions = nodeJs.versions
@get:Inject @get:Inject
open val fileResolver: FileResolver open val fileResolver: FileResolver
@@ -126,7 +127,7 @@ open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
@TaskAction @TaskAction
fun doExecute() { fun doExecute() {
project.nodeJs.root.checkRequiredDependencies(project, this) nodeJs.checkRequiredDependencies(project, this)
val runner = createRunner() val runner = createRunner()
@@ -142,7 +143,7 @@ open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
runner.copy( runner.copy(
configWriter = runner.configWriter.copy( configWriter = runner.configWriter.copy(
progressReporter = true, progressReporter = true,
progressReporterPathFilter = project.nodeJs.root.rootPackageDir.absolutePath progressReporterPathFilter = nodeJs.rootPackageDir.absolutePath
) )
).execute() ).execute()
} }
@@ -23,7 +23,8 @@ abstract class YarnBasics : NpmApi {
description: String, description: String,
vararg args: String vararg args: String
) { ) {
val nodeJsEnv = NodeJsRootPlugin.apply(project).root.environment val nodeJs = NodeJsRootPlugin.apply(project)
val nodeJsEnv = nodeJs.environment
val yarnEnv = YarnPlugin.apply(project).environment val yarnEnv = YarnPlugin.apply(project).environment
project.execWithProgress(description) { exec -> project.execWithProgress(description) { exec ->
@@ -15,7 +15,7 @@ open class YarnPlugin : Plugin<Project> {
"YarnPlugin can be applied only to root project" "YarnPlugin can be applied only to root project"
} }
val nodeJs = NodeJsRootPlugin.apply(this).root val nodeJs = NodeJsRootPlugin.apply(this)
this.extensions.create(YarnRootExtension.YARN, YarnRootExtension::class.java, this) this.extensions.create(YarnRootExtension.YARN, YarnRootExtension::class.java, this)
tasks.create(YarnSetupTask.NAME, YarnSetupTask::class.java) { tasks.create(YarnSetupTask.NAME, YarnSetupTask::class.java) {
@@ -10,6 +10,10 @@ import org.jetbrains.kotlin.gradle.logging.kotlinInfo
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
open class YarnRootExtension(val project: Project) { open class YarnRootExtension(val project: Project) {
init {
check(project == project.rootProject)
}
private val gradleHome = project.gradle.gradleUserHomeDir.also { private val gradleHome = project.gradle.gradleUserHomeDir.also {
project.logger.kotlinInfo("Storing cached files in $it") project.logger.kotlinInfo("Storing cached files in $it")
} }
@@ -28,7 +32,7 @@ open class YarnRootExtension(val project: Project) {
get() = !disableWorkspaces get() = !disableWorkspaces
internal fun executeSetup() { internal fun executeSetup() {
NodeJsRootPlugin.apply(project).root.executeSetup() NodeJsRootPlugin.apply(project).executeSetup()
val env = environment val env = environment
if (!env.home.isDirectory) { if (!env.home.isDirectory) {
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.gradle.targets.js.yarn package org.jetbrains.kotlin.gradle.targets.js.yarn
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.* import org.jetbrains.kotlin.gradle.targets.js.npm.*
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import java.io.File import java.io.File
@@ -30,7 +30,7 @@ object YarnWorkspaces : YarnBasics() {
if (upToDateChecks.all { it.upToDate }) return if (upToDateChecks.all { it.upToDate }) return
val nodeJsWorldDir = rootProject.nodeJs.root.rootPackageDir val nodeJsWorldDir = NodeJsRootPlugin.apply(rootProject).rootPackageDir
saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, nodeJsWorldDir) saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, nodeJsWorldDir)
@@ -55,7 +55,8 @@ object YarnWorkspaces : YarnBasics() {
rootPackageJson.workspaces = npmProjectWorkspaces + importedProjectWorkspaces rootPackageJson.workspaces = npmProjectWorkspaces + importedProjectWorkspaces
rootProject.nodeJs.packageJsonHandlers.forEach { val nodeJs = NodeJsRootPlugin.apply(rootProject)
nodeJs.packageJsonHandlers.forEach {
it(rootPackageJson) it(rootPackageJson)
} }