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
|
package org.jetbrains.kotlin.tools.projectWizard.ir
|
||||||
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
|
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
|
||||||
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.FreeIR
|
||||||
|
|
||||||
interface IR
|
interface IR
|
||||||
|
|
||||||
|
interface TaskIR : FreeIR {
|
||||||
|
val name: String
|
||||||
|
}
|
||||||
+11
-11
@@ -1,13 +1,8 @@
|
|||||||
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
|
package org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem
|
||||||
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.TaskResult
|
import org.jetbrains.kotlin.tools.projectWizard.core.*
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.map
|
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.core.safeAs
|
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.*
|
||||||
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.multiplatform.DefaultTargetConfigurationIR
|
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.TargetConfigurationIR
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetIR
|
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.TargetIR
|
||||||
@@ -32,6 +27,11 @@ data class BuildFileIR(
|
|||||||
|
|
||||||
override fun BuildFilePrinter.render() = when (this) {
|
override fun BuildFilePrinter.render() = when (this) {
|
||||||
is GradlePrinter -> {
|
is GradlePrinter -> {
|
||||||
|
irsOfTypeOrNull<GradleImportIR>()?.let { imports ->
|
||||||
|
imports.listNl()
|
||||||
|
nl()
|
||||||
|
nl()
|
||||||
|
}
|
||||||
irsOfTypeOrNull<BuildScriptIR>()?.let { buildScriptIrs ->
|
irsOfTypeOrNull<BuildScriptIR>()?.let { buildScriptIrs ->
|
||||||
sectionCall("buildscript", needIndent = true) {
|
sectionCall("buildscript", needIndent = true) {
|
||||||
sectionCall("repositories", buildScriptIrs.filterIsInstance<BuildScriptRepositoryIR>())
|
sectionCall("repositories", buildScriptIrs.filterIsInstance<BuildScriptRepositoryIR>())
|
||||||
@@ -43,11 +43,11 @@ data class BuildFileIR(
|
|||||||
pom.render(this); nl()
|
pom.render(this); nl()
|
||||||
sectionCall("repositories", irsOfType<RepositoryIR>())
|
sectionCall("repositories", irsOfType<RepositoryIR>())
|
||||||
nl()
|
nl()
|
||||||
irsOfTypeOrNull<FreeIR>()?.let { freeIrs ->
|
|
||||||
freeIrs.listNl()
|
|
||||||
nlIndented()
|
|
||||||
}
|
|
||||||
modules.render(this)
|
modules.render(this)
|
||||||
|
irsOfTypeOrNull<FreeIR>()?.let { freeIrs ->
|
||||||
|
nl()
|
||||||
|
freeIrs.listNl()
|
||||||
|
}.ignore()
|
||||||
}
|
}
|
||||||
is MavenPrinter -> pom {
|
is MavenPrinter -> pom {
|
||||||
pom.render(this)
|
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(
|
data class GradleAssignmentIR(
|
||||||
val target: String,
|
val target: String,
|
||||||
val assignee: BuildSystemIR
|
val assignee: BuildSystemIR
|
||||||
) : GradleIR {
|
) : GradleIR, FreeIR {
|
||||||
override fun GradlePrinter.renderGradle() {
|
override fun GradlePrinter.renderGradle() {
|
||||||
+"$target = "
|
+"$target = "
|
||||||
assignee.render(this)
|
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
|
interface BuildScriptIR : BuildSystemIR
|
||||||
|
|
||||||
data class BuildScriptDependencyIR(val dependencyIR: GradleIR) : BuildScriptIR, BuildSystemIR by dependencyIR
|
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
|
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.ir.buildsystem.FreeIR
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter
|
||||||
|
|
||||||
interface GradleTaskIR : GradleIR, FreeIR {
|
interface GradleTaskIR : GradleIR, TaskIR {
|
||||||
val name: String
|
|
||||||
val taskClass: String
|
val taskClass: String
|
||||||
val body: BodyIR
|
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.KotlinPlugin
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ProjectKind
|
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.DisplayableSettingItem
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
|
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
|
||||||
import org.jetbrains.kotlin.tools.projectWizard.templates.*
|
import org.jetbrains.kotlin.tools.projectWizard.templates.*
|
||||||
@@ -50,6 +51,7 @@ sealed class ProjectTemplate : DisplayableSettingItem {
|
|||||||
CustomSingleplatformProjectTemplate,
|
CustomSingleplatformProjectTemplate,
|
||||||
CustomMultiplatformProjectTemplate,
|
CustomMultiplatformProjectTemplate,
|
||||||
JvmConsoleApplication,
|
JvmConsoleApplication,
|
||||||
|
JvmServerJsClient,
|
||||||
MultiplatformLibrary,
|
MultiplatformLibrary,
|
||||||
AndroidApplication
|
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() {
|
object AndroidApplication : ProjectTemplate() {
|
||||||
override val title = "Android Application"
|
override val title = "Android Application"
|
||||||
@Language("HTML")
|
@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) {
|
val targetsUpdater = when (sourceset) {
|
||||||
is SourcesetModuleIR -> { target: TargetConfigurationIR ->
|
is SourcesetModuleIR -> { target: TargetConfigurationIR ->
|
||||||
val targetName = sourceset.name.removeSuffix(sourceset.sourcesetType.name.capitalize())
|
if (target.name == sourceset.targetName) updateTargetIr(sourceset, target)
|
||||||
if (target.name == targetName) updateTargetIr(sourceset, target)
|
|
||||||
else target
|
else target
|
||||||
}
|
}
|
||||||
else -> idFunction()
|
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