Wizard: add simple JS client template
This commit is contained in:
+14
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+5
@@ -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
|
||||
}
|
||||
+11
-11
@@ -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)
|
||||
|
||||
+2
@@ -84,3 +84,5 @@ data class SourcesetModuleIR(
|
||||
}
|
||||
}
|
||||
|
||||
val SourcesetModuleIR.targetName
|
||||
get() = name.removeSuffix(sourcesetType.name.capitalize())
|
||||
+8
-1
@@ -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
|
||||
|
||||
+2
-2
@@ -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
|
||||
}
|
||||
|
||||
+8
@@ -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())
|
||||
}
|
||||
+28
-1
@@ -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() {
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+61
@@ -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"
|
||||
}
|
||||
}
|
||||
+1
-2
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user