diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/client.kt.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/client.kt.vm new file mode 100644 index 00000000000..9bf6f9b57a8 --- /dev/null +++ b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/client.kt.vm @@ -0,0 +1,14 @@ +import kotlinx.html.div +import kotlinx.html.dom.append +import kotlin.browser.document +import kotlin.browser.window + +fun main() { + window.onload = { + document.body?.append { + div { + +"Hello from JS" + } + } + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/IR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/IR.kt index 04087043b42..0e6ec724d11 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/IR.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/IR.kt @@ -1,5 +1,10 @@ package org.jetbrains.kotlin.tools.projectWizard.ir import org.jetbrains.kotlin.tools.projectWizard.core.safeAs +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.FreeIR interface IR + +interface TaskIR : FreeIR { + val name: String +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt index 283d7892f43..efb22b8a909 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/BuildFileIR.kt @@ -1,13 +1,8 @@ package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem -import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult -import org.jetbrains.kotlin.tools.projectWizard.core.map +import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.safeAs -import org.jetbrains.kotlin.tools.projectWizard.core.sequence -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptDependencyIR -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptIR -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.BuildScriptRepositoryIR -import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.GradleIR +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetConfigurationIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetIR @@ -32,6 +27,11 @@ data class BuildFileIR( override fun BuildFilePrinter.render() = when (this) { is GradlePrinter -> { + irsOfTypeOrNull()?.let { imports -> + imports.listNl() + nl() + nl() + } irsOfTypeOrNull()?.let { buildScriptIrs -> sectionCall("buildscript", needIndent = true) { sectionCall("repositories", buildScriptIrs.filterIsInstance()) @@ -43,11 +43,11 @@ data class BuildFileIR( pom.render(this); nl() sectionCall("repositories", irsOfType()) nl() - irsOfTypeOrNull()?.let { freeIrs -> - freeIrs.listNl() - nlIndented() - } modules.render(this) + irsOfTypeOrNull()?.let { freeIrs -> + nl() + freeIrs.listNl() + }.ignore() } is MavenPrinter -> pom { pom.render(this) diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/ModuleIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/ModuleIR.kt index 2236b3b40d0..5b43182d63f 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/ModuleIR.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/ModuleIR.kt @@ -84,3 +84,5 @@ data class SourcesetModuleIR( } } +val SourcesetModuleIR.targetName + get() = name.removeSuffix(sourcesetType.name.capitalize()) \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleIR.kt index 095c2ae1ac5..610f2925930 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleIR.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleIR.kt @@ -61,7 +61,7 @@ data class GradleSectionIR( data class GradleAssignmentIR( val target: String, val assignee: BuildSystemIR -) : GradleIR { +) : GradleIR, FreeIR { override fun GradlePrinter.renderGradle() { +"$target = " assignee.render(this) @@ -106,6 +106,13 @@ data class GradlePropertyAccessIR(val propertyName: String) : GradleIR { } } +data class GradleImportIR(val import: String) : GradleIR { + override fun GradlePrinter.renderGradle() { + +"import " + +import + } +} + interface BuildScriptIR : BuildSystemIR data class BuildScriptDependencyIR(val dependencyIR: GradleIR) : BuildScriptIR, BuildSystemIR by dependencyIR diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt index b6c3196f54d..223723c9877 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/ir/buildsystem/gradle/GradleTaskIR.kt @@ -1,10 +1,10 @@ package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle +import org.jetbrains.kotlin.tools.projectWizard.ir.TaskIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.FreeIR import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter -interface GradleTaskIR : GradleIR, FreeIR { - val name: String +interface GradleTaskIR : GradleIR, TaskIR { val taskClass: String val body: BodyIR } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/JsTemplatesPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/JsTemplatesPlugin.kt new file mode 100644 index 00000000000..cddd4686b2c --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/JsTemplatesPlugin.kt @@ -0,0 +1,8 @@ +package org.jetbrains.kotlin.tools.projectWizard.plugins.templates + +import org.jetbrains.kotlin.tools.projectWizard.core.* +import org.jetbrains.kotlin.tools.projectWizard.templates.* + +class JsTemplatesPlugin(context: Context) : TemplatePlugin(context) { + val addTemplate by addTemplateTask(SimpleJsClientTemplate()) +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt index b6248599d54..7ba55699260 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt @@ -8,6 +8,7 @@ import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.defaultTarge import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ProjectKind +import org.jetbrains.kotlin.tools.projectWizard.projectTemplates.MultiplatformLibrary.withTemplate import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.templates.* @@ -50,6 +51,7 @@ sealed class ProjectTemplate : DisplayableSettingItem { CustomSingleplatformProjectTemplate, CustomMultiplatformProjectTemplate, JvmConsoleApplication, + JvmServerJsClient, MultiplatformLibrary, AndroidApplication ) @@ -180,6 +182,31 @@ object MultiplatformLibrary : ProjectTemplate() { ) } +object JvmServerJsClient : ProjectTemplate() { + override val title: String = "JS client and JVM server" + override val htmlDescription: String = + "Multiplatform Gradle project allowing reuse of the same Kotlin code between JS Client and JVM Server" + override val suggestedProjectName: String = "myFullStackApplication" + override val projectKind: ProjectKind = ProjectKind.Multiplatform + override val setsPluginSettings: List> = listOf( + KotlinPlugin::modules withValue listOf( + MultiplatformModule( + "application", + listOf( + ModuleType.jvm.createDefaultTarget().apply { + mainSourceset?.withTemplate(KtorServerTemplate()) { + template.serverEngine withValue KtorServerEngine.Netty + } + }, + ModuleType.js.createDefaultTarget().apply { + mainSourceset?.withTemplate(SimpleJsClientTemplate()) + } + ) + ) + ) + ) +} + object AndroidApplication : ProjectTemplate() { override val title = "Android Application" @Language("HTML") @@ -203,4 +230,4 @@ object AndroidApplication : ProjectTemplate() { ) ) ) -} \ No newline at end of file +} diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt new file mode 100644 index 00000000000..37c4d28a7bc --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleJsClientTemplate.kt @@ -0,0 +1,61 @@ +/* + * 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.tools.projectWizard.templates + +import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext +import org.jetbrains.kotlin.tools.projectWizard.core.buildList +import org.jetbrains.kotlin.tools.projectWizard.core.entity.TemplateSetting +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.* +import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact +import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase +import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType +import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem +import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository +import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repositories +import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType +import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version + +class SimpleJsClientTemplate : Template() { + override val title: String = "Simple JS client" + override val htmlDescription: String = title + override val moduleTypes: Set = setOf(ModuleType.js) + override val sourcesetTypes: Set = setOf(SourcesetType.main) + override val id: String = "simpleJsClient" + + override fun TaskRunningContext.getRequiredLibraries(sourceset: SourcesetIR): List = + buildList { + +ArtifactBasedLibraryDependencyIR( + MavenArtifact(DefaultRepository.JCENTER, "org.jetbrains.kotlinx", "kotlinx-html-js"), + Version.fromString("0.6.12"), + DependencyType.MAIN + ) + } + + override fun TaskRunningContext.getFileTemplates(sourceset: SourcesetIR): List = listOf( + FileTemplateDescriptor("$id/client.kt.vm", sourcesPath("client.kt")) + ) + + override fun TaskRunningContext.getIrsToAddToBuildFile(sourceset: SourcesetIR): List = buildList { + +RepositoryIR(DefaultRepository.JCENTER) + if (sourceset is SourcesetModuleIR) { + +GradleImportIR("org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack") + val taskAccessIR = GetGradleTaskIR( + "${sourceset.targetName}BrowserWebpack", + "KotlinWebpack", + buildBody { + +GradleAssignmentIR("outputFileName", GradleStringConstIR(JS_OUTPUT_FILE_NAME)) + } + ) + +CreateGradleValueIR(JS_BROWSER_WEBPACK_TASK_ALIAS, taskAccessIR) + } + } + + companion object { + const val JS_OUTPUT_FILE_NAME = "output.js" + const val JS_BROWSER_WEBPACK_TASK_ALIAS = "jsBrowserWebpack" + } +} \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt index 9feca8969b5..e3aa25f8a8e 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/Template.kt @@ -91,8 +91,7 @@ abstract class Template : SettingsOwner { val targetsUpdater = when (sourceset) { is SourcesetModuleIR -> { target: TargetConfigurationIR -> - val targetName = sourceset.name.removeSuffix(sourceset.sourcesetType.name.capitalize()) - if (target.name == targetName) updateTargetIr(sourceset, target) + if (target.name == sourceset.targetName) updateTargetIr(sourceset, target) else target } else -> idFunction() diff --git a/libraries/tools/new-project-wizard/src/tasks/Task.kt b/libraries/tools/new-project-wizard/src/tasks/Task.kt new file mode 100644 index 00000000000..d1ebdc3f91c --- /dev/null +++ b/libraries/tools/new-project-wizard/src/tasks/Task.kt @@ -0,0 +1,25 @@ +/* + * 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 tasks + +import org.jetbrains.kotlin.tools.projectWizard.core.buildList +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.BuildSystemIR +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR +import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.runTaskIrs +import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemType + +interface Task { + val name: String + fun createTaskIRs(moduleIR: ModuleIR, buildSystemType: BuildSystemType): List +} + +class JvmRunTask(private val mainClass: String) : Task { + override val name: String = "Run task" + + override fun createTaskIRs(moduleIR: ModuleIR, buildSystemType: BuildSystemType): List = buildList { + +runTaskIrs(mainClass) + } +} \ No newline at end of file