Wizard: add simple JS client template

This commit is contained in:
Ilya Kirillov
2019-12-14 16:06:59 +03:00
parent 56fccce305
commit 8bf9c31880
11 changed files with 165 additions and 17 deletions
@@ -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"
}
}
}
}
@@ -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
}
@@ -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<GradleImportIR>()?.let { imports ->
imports.listNl()
nl()
nl()
}
irsOfTypeOrNull<BuildScriptIR>()?.let { buildScriptIrs ->
sectionCall("buildscript", needIndent = true) {
sectionCall("repositories", buildScriptIrs.filterIsInstance<BuildScriptRepositoryIR>())
@@ -43,11 +43,11 @@ data class BuildFileIR(
pom.render(this); nl()
sectionCall("repositories", irsOfType<RepositoryIR>())
nl()
irsOfTypeOrNull<FreeIR>()?.let { freeIrs ->
freeIrs.listNl()
nlIndented()
}
modules.render(this)
irsOfTypeOrNull<FreeIR>()?.let { freeIrs ->
nl()
freeIrs.listNl()
}.ignore()
}
is MavenPrinter -> pom {
pom.render(this)
@@ -84,3 +84,5 @@ data class SourcesetModuleIR(
}
}
val SourcesetModuleIR.targetName
get() = name.removeSuffix(sourcesetType.name.capitalize())
@@ -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
@@ -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
}
@@ -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())
}
@@ -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<SettingWithValue<*, *>> = 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() {
)
)
)
}
}
@@ -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<ModuleType> = setOf(ModuleType.js)
override val sourcesetTypes: Set<SourcesetType> = setOf(SourcesetType.main)
override val id: String = "simpleJsClient"
override fun TaskRunningContext.getRequiredLibraries(sourceset: SourcesetIR): List<DependencyIR> =
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<FileTemplateDescriptor> = listOf(
FileTemplateDescriptor("$id/client.kt.vm", sourcesPath("client.kt"))
)
override fun TaskRunningContext.getIrsToAddToBuildFile(sourceset: SourcesetIR): List<BuildSystemIR> = 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"
}
}
@@ -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()
@@ -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<BuildSystemIR>
}
class JvmRunTask(private val mainClass: String) : Task {
override val name: String = "Run task"
override fun createTaskIRs(moduleIR: ModuleIR, buildSystemType: BuildSystemType): List<BuildSystemIR> = buildList {
+runTaskIrs(mainClass)
}
}