From 066efc3732493e96db82978dc0d8f8027015f905 Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Tue, 23 Apr 2019 14:44:05 +0300 Subject: [PATCH] Gradle, JS: nodejs target --- .../targets/js/KotlinJsTargetConfigurator.kt | 2 +- .../gradle/targets/js/nodejs/NodeJsExec.kt | 45 ++++++++++++++++ .../gradle/targets/js/npm/NpmProject.kt | 2 +- .../targets/js/webpack/KotlinWebpack.kt | 4 +- .../KotlinNodeJsSingleTargetConfigurator.kt | 53 +++++++++++++++++++ 5 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExec.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/nodejs/KotlinNodeJsSingleTargetConfigurator.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetConfigurator.kt index 4c8b24b89f6..f24e3de43cb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsTargetConfigurator.kt @@ -74,7 +74,7 @@ class KotlinJsSingleTargetConfigurator(kotlinPluginVersion: String) : override fun newTestsConfigurator(compilation: KotlinJsCompilation) = object : KotlinJsCompilationTestsConfigurator(compilation) { override fun configureDefaultTestFramework(it: KotlinJsTest) { - it.useMocha { } + it.useKarma { } } } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExec.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExec.kt new file mode 100644 index 00000000000..67e8ccd7c85 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExec.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. 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.nodejs + +import org.gradle.api.tasks.AbstractExecTask +import org.gradle.api.tasks.Internal +import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject +import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile +import java.io.File + +class NodeJsExec : AbstractExecTask(NodeJsExec::class.java) { + private val npmProject by lazy { project.npmProject } + + init { + val nodeJs = NodeJsPlugin.apply(project).root + dependsOn(nodeJs.nodeJsSetupTask) + + executable = nodeJs.environment.nodeExecutable + workingDir = project.npmProject.nodeWorkDir + } + + @Internal + var script: String? = null + + fun require(moduleName: String) { + args("--require", moduleName) + } + + fun requireSourceMapSupport() { + require("kotlin-test-nodejs-runner/kotlin-nodejs-source-map-support.js") + } + + fun script(file: File) { + check(script == null) { + "Script was already set to $script" + } + script = file.canonicalFile.relativeToOrSelf(npmProject.nodeWorkDir).path + } + + fun compileOutput(compilationTask: Kotlin2JsCompile) = + script(npmProject.compileOutput(compilationTask)) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt index fad7f4f6a2d..4a6ab078828 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProject.kt @@ -46,7 +46,7 @@ open class NpmProject( if (hoistGradleNodeModules) project.rootProject.npmProject.nodeModulesDir else nodeModulesDir - open fun moduleOutput(compilationTask: Kotlin2JsCompile): File { + open fun compileOutput(compilationTask: Kotlin2JsCompile): File { return compileOutputCopyDest?.resolve(compilationTask.outputFile.name) ?: compilationTask.outputFile } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt index 43b67bd30df..ab9957638d7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt @@ -132,7 +132,7 @@ open class KotlinWebpack : DefaultTask() { it.dependsOn(compileKotlinTask) - it.entry = npmProject.moduleOutput(compileKotlinTask) + it.entry = npmProject.compileOutput(compileKotlinTask) it.outputs.upToDateWhen { false } } @@ -148,7 +148,7 @@ open class KotlinWebpack : DefaultTask() { it.dependsOn(compileKotlinTask) it.bin = "webpack-dev-server" - it.entry = npmProject.moduleOutput(compileKotlinTask) + it.entry = npmProject.compileOutput(compileKotlinTask) val projectDir = compilation.target.project.projectDir.canonicalPath it.devServer = KotlinWebpackConfig.DevServer( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/nodejs/KotlinNodeJsSingleTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/nodejs/KotlinNodeJsSingleTargetConfigurator.kt new file mode 100644 index 00000000000..debf1562628 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/nodejs/KotlinNodeJsSingleTargetConfigurator.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. 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.nodejs + +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilationTestsConfigurator +import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTargetConfigurator +import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec +import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject +import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest +import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask + +class KotlinNodeJsSingleTargetConfigurator(kotlinPluginVersion: String) : + KotlinJsTargetConfigurator(kotlinPluginVersion) { + + override fun configureTarget(target: KotlinOnlyTarget) { + super.configureTarget(target) + configureApplication(target) + + + } + + private fun configureApplication(target: KotlinOnlyTarget) { + target.compilations.all { compilation -> + if (compilation.name == KotlinCompilation.MAIN_COMPILATION_NAME) { + // source maps support + compilation.dependencies { + runtimeOnly(kotlin("test-nodejs-runner")) + } + + val project = target.project + project.createOrRegisterTask("run") { + it.args( + project.npmProject.compileOutput(compilation.compileKotlinTask), + "--require", "kotlin-test-nodejs-runner/kotlin-nodejs-source-map-support.js" + ) + } + } + } + } + + override fun newTestsConfigurator(compilation: KotlinJsCompilation) = + object : KotlinJsCompilationTestsConfigurator(compilation) { + override fun configureDefaultTestFramework(it: KotlinJsTest) { + it.useNodeJs { } + } + } +} \ No newline at end of file