diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsBrowser.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinBrowserJs.kt similarity index 80% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsBrowser.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinBrowserJs.kt index 7e90d2b415d..c0f2fc4a9f9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsBrowser.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinBrowserJs.kt @@ -8,17 +8,23 @@ package org.jetbrains.kotlin.gradle.targets.js import org.gradle.language.base.plugins.LifecycleBasePlugin import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation 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.testing.KotlinJsTest import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask -class KotlinJsBrowser( +class KotlinBrowserJs( target: KotlinOnlyTarget ) : KotlinJsInnerTargetConfigurator(target) { + private val versions = project.nodeJs.versions + override fun configureDefaultTestFramework(it: KotlinJsTest) { - it.useNodeJs { } + it.useKarma { + useWebpack() + useChromeHeadless() + } } override fun configureRun(compilation: KotlinJsCompilation) { @@ -27,13 +33,13 @@ class KotlinJsBrowser( val compileKotlinTask = compilation.compileKotlinTask compilation.dependencies { - runtimeOnly(npm("webpack", "4.29.6")) - runtimeOnly(npm("webpack-cli", "3.3.0")) - runtimeOnly(npm("webpack-bundle-analyzer", "3.3.2")) + runtimeOnly(versions.webpack) + runtimeOnly(versions.webpackCli) + runtimeOnly(versions.webpackBundleAnalyzer) - // for source map support only - runtimeOnly(npm("source-map-loader", "0.2.4")) - runtimeOnly(npm("source-map-support", "0.5.12")) + // for source map support + runtimeOnly(versions.sourceMapLoader.npm(project)) + runtimeOnly(versions.sourceMapSupport.npm(project)) } project.createOrRegisterTask(disambiguateCamelCased("webpack")) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinNodeJs.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinNodeJs.kt index 57c26619ec1..b6e748c1622 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinNodeJs.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinNodeJs.kt @@ -5,47 +5,32 @@ 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.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 KotlinNodeJs(kotlinPluginVersion: String) : - KotlinJsTargetConfigurator(kotlinPluginVersion) { +class KotlinNodeJs(target: KotlinOnlyTarget) : + KotlinJsInnerTargetConfigurator(target) { - override fun configureTarget(target: KotlinOnlyTarget) { - super.configureTarget(target) - configureApplication(target) + override fun configureDefaultTestFramework(it: KotlinJsTest) { + it.useNodeJs { } } - 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")) - } + override fun configureRun(compilation: KotlinJsCompilation) { + // 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" - ) - } - } + val project = target.project + project.createOrRegisterTask("run") { + it.args(project.npmProject.compileOutput(compilation.compileKotlinTask)) + + // 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 { } - } - } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/NpmPackageVersions.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/NpmPackageVersions.kt deleted file mode 100644 index 8cfc3e63249..00000000000 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/NpmPackageVersions.kt +++ /dev/null @@ -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) -} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExtension.kt index 7d5620fdc3d..ac6ff57c857 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsExtension.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.targets.js.nodejs import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.targets.js.npm.NpmPackages import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson open class NodeJsExtension(val project: Project) { @@ -14,6 +15,9 @@ open class NodeJsExtension(val project: Project) { internal val packageJsonHandlers = mutableListOf Unit>() + val versions = NpmPackages() + + @Suppress("unused") fun packageJson(handler: PackageJson.() -> Unit) { packageJsonHandlers.add(handler) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmPackages.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmPackages.kt new file mode 100644 index 00000000000..179261f2e3e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmPackages.kt @@ -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) +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt index 09bd5c85c31..6731793878b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/karma/KotlinKarma.kt @@ -7,16 +7,14 @@ package org.jetbrains.kotlin.gradle.targets.js.testing.karma import com.google.gson.GsonBuilder import org.gradle.api.Project -import org.gradle.api.tasks.Input import org.gradle.process.ProcessForkOptions import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSettings import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec 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.karmaChromeLauncher -import org.jetbrains.kotlin.gradle.targets.js.karmaPhantomjsLauncher -import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject +import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs +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.testing.KotlinJsTest 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 requiredDependencies = mutableSetOf() - 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) { config.browsers.add(id) @@ -40,24 +55,24 @@ class KotlinKarma(val project: Project) : KotlinJsTestFramework { } fun useMocha() { - + requiredDependencies.add(versions.karmaMocha) + requiredDependencies.add(versions.mocha) } fun useWebpack() { + requiredDependencies.add(versions.karmaWebpack) + } + fun useSourceMapSupport() { + config.frameworks.add("source-map-support") + requiredDependencies.add(versions.karmaSourceMapSupport) } override fun configure(dependenciesHolder: HasKotlinDependencies) { dependenciesHolder.dependencies { - runtimeOnly(npm("karma", "4.0.1")) - runtimeOnly(npm("karma-chrome-launcher", "2.2.0")) - 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")) + requiredDependencies.forEach { + npm(it.name, it.version) + } } } @@ -74,48 +89,24 @@ class KotlinKarma(val project: Project) : KotlinJsTestFramework { ignoreOutOfRootNodes = true ) - val npmProjectLayout = NpmProject[task.project] + val npmProject = task.project.npmProject - val files = task.nodeModulesToLoad.map { - npmProjectLayout.nodeModulesDir.resolve(it).also { file -> - check(file.isFile) { "Cannot find ${file.canonicalPath}" } - }.canonicalPath - }.let { - GsonBuilder().create().toJson(it) - } + config.files.addAll(task.nodeModulesToLoad.map { + npmProject.getModuleEntryPath(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 { - //language=JavaScript - 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() - ) + GsonBuilder().setPrettyPrinting().create().toJson(config, it) } val nodeModules = listOf("karma/bin/karma") val args = nodeJsArgs + nodeModules.map { - npmProjectLayout.nodeModulesDir.resolve(it).also { file -> + npmProject.nodeModulesDir.resolve(it).also { file -> check(file.isFile) { "Cannot find ${file.canonicalPath}" } }.canonicalPath } +