Gradle, JS: extract npm package constants

#KT-30530
This commit is contained in:
Sergey Rostov
2019-05-13 08:49:28 +03:00
parent 3797ec9255
commit 5ec501dce0
6 changed files with 116 additions and 111 deletions
@@ -8,17 +8,23 @@ package org.jetbrains.kotlin.gradle.targets.js
import org.gradle.language.base.plugins.LifecycleBasePlugin 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.plugin.mpp.KotlinOnlyTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget
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.targets.js.webpack.KotlinWebpack import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
class KotlinJsBrowser( class KotlinBrowserJs(
target: KotlinOnlyTarget<KotlinJsCompilation> target: KotlinOnlyTarget<KotlinJsCompilation>
) : KotlinJsInnerTargetConfigurator(target) { ) : KotlinJsInnerTargetConfigurator(target) {
private val versions = project.nodeJs.versions
override fun configureDefaultTestFramework(it: KotlinJsTest) { override fun configureDefaultTestFramework(it: KotlinJsTest) {
it.useNodeJs { } it.useKarma {
useWebpack()
useChromeHeadless()
}
} }
override fun configureRun(compilation: KotlinJsCompilation) { override fun configureRun(compilation: KotlinJsCompilation) {
@@ -27,13 +33,13 @@ class KotlinJsBrowser(
val compileKotlinTask = compilation.compileKotlinTask val compileKotlinTask = compilation.compileKotlinTask
compilation.dependencies { compilation.dependencies {
runtimeOnly(npm("webpack", "4.29.6")) runtimeOnly(versions.webpack)
runtimeOnly(npm("webpack-cli", "3.3.0")) runtimeOnly(versions.webpackCli)
runtimeOnly(npm("webpack-bundle-analyzer", "3.3.2")) runtimeOnly(versions.webpackBundleAnalyzer)
// for source map support only // for source map support
runtimeOnly(npm("source-map-loader", "0.2.4")) runtimeOnly(versions.sourceMapLoader.npm(project))
runtimeOnly(npm("source-map-support", "0.5.12")) runtimeOnly(versions.sourceMapSupport.npm(project))
} }
project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("webpack")) { project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("webpack")) {
@@ -5,47 +5,32 @@
package org.jetbrains.kotlin.gradle.targets.js package org.jetbrains.kotlin.gradle.targets.js
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget 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.nodejs.NodeJsExec
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
class KotlinNodeJs(kotlinPluginVersion: String) : class KotlinNodeJs(target: KotlinOnlyTarget<KotlinJsCompilation>) :
KotlinJsTargetConfigurator(kotlinPluginVersion) { KotlinJsInnerTargetConfigurator(target) {
override fun configureTarget(target: KotlinOnlyTarget<KotlinJsCompilation>) { override fun configureDefaultTestFramework(it: KotlinJsTest) {
super.configureTarget(target) it.useNodeJs { }
configureApplication(target)
} }
private fun configureApplication(target: KotlinOnlyTarget<KotlinJsCompilation>) { override fun configureRun(compilation: KotlinJsCompilation) {
target.compilations.all { compilation -> // source maps support
if (compilation.name == KotlinCompilation.MAIN_COMPILATION_NAME) { compilation.dependencies {
// source maps support runtimeOnly(kotlin("test-nodejs-runner"))
compilation.dependencies { }
runtimeOnly(kotlin("test-nodejs-runner"))
}
val project = target.project val project = target.project
project.createOrRegisterTask<NodeJsExec>("run") { project.createOrRegisterTask<NodeJsExec>("run") {
it.args( it.args(project.npmProject.compileOutput(compilation.compileKotlinTask))
project.npmProject.compileOutput(compilation.compileKotlinTask),
"--require", "kotlin-test-nodejs-runner/kotlin-nodejs-source-map-support.js" // source maps support
) it.args("--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 { }
}
}
} }
@@ -1,20 +0,0 @@
/*
* Copyright 2010-2019 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
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
val karmaChromeLauncher = NpmPackageVersion("karma-chrome-launcher", "2.2.0")
val karmaPhantomjsLauncher = NpmPackageVersion("karma-phantomjs-launcher", "*")
// karma-firefox-launcher
// karma-opera-launcher
// karma-ie-launcher
// karma-safari-launcher
data class NpmPackageVersion(val name: String, val version: String) {
fun npm(project: Project) = NpmDependency(project, null, name, version)
}
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.gradle.targets.js.nodejs package org.jetbrains.kotlin.gradle.targets.js.nodejs
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmPackages
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
open class NodeJsExtension(val project: Project) { open class NodeJsExtension(val project: Project) {
@@ -14,6 +15,9 @@ open class NodeJsExtension(val project: Project) {
internal val packageJsonHandlers = mutableListOf<PackageJson.() -> Unit>() internal val packageJsonHandlers = mutableListOf<PackageJson.() -> Unit>()
val versions = NpmPackages()
@Suppress("unused")
fun packageJson(handler: PackageJson.() -> Unit) { fun packageJson(handler: PackageJson.() -> Unit) {
packageJsonHandlers.add(handler) packageJsonHandlers.add(handler)
} }
@@ -0,0 +1,39 @@
/*
* Copyright 2010-2019 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.Project
class NpmPackages {
val webpack = NpmPackageVersion("webpack", "4.29.6")
val webpackCli = NpmPackageVersion("webpack-cli", "3.3.0")
val webpackBundleAnalyzer = NpmPackageVersion("webpack-bundle-analyzer", "3.3.2")
val webpackDevServer = NpmPackageVersion("webpack-dev-server", "3.3.1")
val sourceMapLoader = NpmPackageVersion("source-map-loader", "0.2.4")
val sourceMapSupport = NpmPackageVersion("source-map-support", "0.5.12")
val mocha = NpmPackageVersion("mocha", "6.1.2")
val karma = NpmPackageVersion("karma", "4.0.1")
val karmaTeamcityReporter = NpmPackageVersion("karma-teamcity-reporter", "1.1.0")
val karmaChromeLauncher = NpmPackageVersion("karma-chrome-launcher", "2.2.0")
val karmaPhantomJsLauncher = NpmPackageVersion("karma-phantomjs-launcher", "*")
val karmaFirefoxLauncher = NpmPackageVersion("karma-firefox-launcher", "*")
val karmaOperaLauncher = NpmPackageVersion("karma-opera-launcher", "*")
val karmaIeLauncher = NpmPackageVersion("karma-ie-launcher", "*")
val karmaSafariLauncher = NpmPackageVersion("karma-safari-launcher", "*")
val karmaMocha = NpmPackageVersion("karma-mocha", "1.3.0")
val karmaWebpack = NpmPackageVersion("karma-webpack", "*")
val karmaSourceMapSupport = NpmPackageVersion("karma-source-map-support", "1.4.0")
}
data class NpmPackageVersion(val name: String, var version: String) {
fun npm(project: Project) = NpmDependency(project, null, name, version)
}
@@ -7,16 +7,14 @@ package org.jetbrains.kotlin.gradle.targets.js.testing.karma
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.tasks.Input
import org.gradle.process.ProcessForkOptions import org.gradle.process.ProcessForkOptions
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSettings import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSettings
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion
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.karmaChromeLauncher import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.karmaPhantomjsLauncher import org.jetbrains.kotlin.gradle.targets.js.npm.NpmPackageVersion
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
@@ -24,15 +22,32 @@ class KotlinKarma(val project: Project) : KotlinJsTestFramework {
private val config: KarmaConfig = KarmaConfig() private val config: KarmaConfig = KarmaConfig()
private val requiredDependencies = mutableSetOf<NpmPackageVersion>() private val requiredDependencies = mutableSetOf<NpmPackageVersion>()
fun useChrome() = useBrowser("Chrome", karmaChromeLauncher) private val versions = project.nodeJs.versions
fun useChromeCanary() = useBrowser("ChromeCanary", karmaChromeLauncher) init {
requiredDependencies.add(versions.karma)
fun useChromeHeadless() = useBrowser("ChromeHeadless", karmaChromeLauncher) requiredDependencies.add(versions.karmaTeamcityReporter)
config.reporters.add("teamcity")
fun usePhantomJS() = useBrowser("PhantomJS", karmaPhantomjsLauncher) config.singleRun = true
}
fun useFirefox() = useBrowser("Firefox", TODO()) fun useChrome() = useBrowser("Chrome", versions.karmaChromeLauncher)
fun useChromeCanary() = useBrowser("ChromeCanary", versions.karmaChromeLauncher)
fun useChromeHeadless() = useBrowser("ChromeHeadless", versions.karmaChromeLauncher)
fun usePhantomJS() = useBrowser("PhantomJS", versions.karmaPhantomJsLauncher)
fun useFirefox() = useBrowser("Firefox", versions.karmaFirefoxLauncher)
fun useOpera() = useBrowser("Opera", versions.karmaOperaLauncher)
fun useSafari() = useBrowser("Safari", versions.karmaSafariLauncher)
fun useIe() = useBrowser("Ie", versions.karmaIeLauncher)
fun useBrowser(id: String, dependency: NpmPackageVersion) { fun useBrowser(id: String, dependency: NpmPackageVersion) {
config.browsers.add(id) config.browsers.add(id)
@@ -40,24 +55,24 @@ class KotlinKarma(val project: Project) : KotlinJsTestFramework {
} }
fun useMocha() { fun useMocha() {
requiredDependencies.add(versions.karmaMocha)
requiredDependencies.add(versions.mocha)
} }
fun useWebpack() { fun useWebpack() {
requiredDependencies.add(versions.karmaWebpack)
}
fun useSourceMapSupport() {
config.frameworks.add("source-map-support")
requiredDependencies.add(versions.karmaSourceMapSupport)
} }
override fun configure(dependenciesHolder: HasKotlinDependencies) { override fun configure(dependenciesHolder: HasKotlinDependencies) {
dependenciesHolder.dependencies { dependenciesHolder.dependencies {
runtimeOnly(npm("karma", "4.0.1")) requiredDependencies.forEach {
runtimeOnly(npm("karma-chrome-launcher", "2.2.0")) npm(it.name, it.version)
runtimeOnly(npm("puppeteer", "1.14.0")) }
runtimeOnly(npm("karma-source-map-support", "1.4.0"))
runtimeOnly(npm("karma-browserify", "6.0.0"))
runtimeOnly(npm("browserify", "16.2.3"))
runtimeOnly(npm("karma-mocha", "1.3.0"))
runtimeOnly(npm("mocha", "6.1.2"))
runtimeOnly(npm("karma-teamcity-reporter", "1.1.0"))
} }
} }
@@ -74,48 +89,24 @@ class KotlinKarma(val project: Project) : KotlinJsTestFramework {
ignoreOutOfRootNodes = true ignoreOutOfRootNodes = true
) )
val npmProjectLayout = NpmProject[task.project] val npmProject = task.project.npmProject
val files = task.nodeModulesToLoad.map { config.files.addAll(task.nodeModulesToLoad.map {
npmProjectLayout.nodeModulesDir.resolve(it).also { file -> npmProject.getModuleEntryPath(it)
check(file.isFile) { "Cannot find ${file.canonicalPath}" } })
}.canonicalPath
}.let {
GsonBuilder().create().toJson(it)
}
val karmaConfJs = npmProjectLayout.nodeWorkDir.resolve("karma.conf.js") config.basePath = npmProject.nodeModulesDir.absolutePath
val karmaConfJs = npmProject.nodeWorkDir.resolve("karma.conf.js")
karmaConfJs.printWriter().use { karmaConfJs.printWriter().use {
//language=JavaScript GsonBuilder().setPrettyPrinting().create().toJson(config, it)
it.println(
"""
process.env.CHROME_BIN = require('puppeteer').executablePath();
module.exports = (config) => {
config.set({
basePath: 'node_modules',
files: $files,
frameworks: ['browserify', 'source-map-support', 'mocha'],
browsers: ['ChromeHeadless'],
reporters: ['teamcity'],
singleRun: true,
preprocessors: {
'*.js': [ 'browserify' ]
},
browserify: {
debug: true
}
});
}
""".trimIndent()
)
} }
val nodeModules = listOf("karma/bin/karma") val nodeModules = listOf("karma/bin/karma")
val args = nodeJsArgs + val args = nodeJsArgs +
nodeModules.map { nodeModules.map {
npmProjectLayout.nodeModulesDir.resolve(it).also { file -> npmProject.nodeModulesDir.resolve(it).also { file ->
check(file.isFile) { "Cannot find ${file.canonicalPath}" } check(file.isFile) { "Cannot find ${file.canonicalPath}" }
}.canonicalPath }.canonicalPath
} + } +