[JS, Wizard] Separate browser application without react

^KT-41417 fixed
This commit is contained in:
Ilya Goncharov
2020-08-24 16:17:55 +03:00
parent 491eb5e366
commit 96e1b1c0e0
3 changed files with 22 additions and 51 deletions
@@ -126,8 +126,8 @@ project.template.full.stack.description=Fully-functional web application using K
project.template.native.console.title=Native Application
project.template.native.console.description=Application with Kotlin/Native that works as a standalone application under a specific platform.
project.template.frontend.title=Frontend Application
project.template.frontend.description=Frontend application with Kotlin/JS if you already have a backend.
project.template.browser.title=Browser Application
project.template.browser.description=A blank application targeting the browser
project.template.nodejs.title=Node.JS Application
project.template.nodejs.description=A blank application targeting Node.js
@@ -152,14 +152,11 @@ module.template.ktor.server.setting.engine.jetty=Jetty
module.template.native.console.title=Native Application
module.template.native.console.description=Simple Kotlin/Native application for your operating system
module.template.js.simple.title=Frontend Application
module.template.js.simple.description=Configurable Kotlin/JS frontend application
module.template.js.simple.title=Browser Application
module.template.js.simple.description=A blank application targeting the browser
module.template.js.simple.run.configuration.dev=BrowserDevelopmentRun in continuous mode
module.template.js.simple.run.configuration.prod=BrowserProductionRun in continuous mode
module.template.js.simple.setting.rendering.engine=Rendering engine
module.template.js.simple.setting.rendering.kotlinx.html=Use statically-typed Kotlinx.html DSL
module.template.js.simple.setting.rendering.react=Use Kotlin-wrapped React library
module.template.js.simple.setting.rendering.react.styled=Use Kotlin-wrapped React framework with Styled Components
module.template.simple.use.kotlinx.html=Use kotlinx.html
module.template.simple.nodejs.title=Node.JS Application
module.template.simple.nodejs.description=A blank application targeting Node.js
@@ -274,8 +274,8 @@ object NativeApplicationProjectTemplate : ProjectTemplate() {
}
object FrontendApplicationProjectTemplate : ProjectTemplate() {
override val title = KotlinNewProjectWizardBundle.message("project.template.frontend.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.frontend.description")
override val title = KotlinNewProjectWizardBundle.message("project.template.browser.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.browser.description")
override val id = "frontendApplication"
@NonNls
@@ -6,8 +6,9 @@
package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.annotations.Nls
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.*
@@ -16,18 +17,15 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
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.library.MavenArtifact
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
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.*
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.TemplateInterceptor
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.interceptTemplate
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
class SimpleJsClientTemplate : Template() {
override val title: String = KotlinNewProjectWizardBundle.message("module.template.js.simple.title")
@@ -53,14 +51,14 @@ class SimpleJsClientTemplate : Template() {
else -> false
}
val renderEngine by enumSetting<RenderEngine>(
KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.engine"),
val useKotlinxHtml by booleanSetting(
KotlinNewProjectWizardBundle.message("module.template.simple.use.kotlinx.html"),
GenerationPhase.PROJECT_GENERATION
) {
defaultValue = value(RenderEngine.REACT_WITH_STYLED)
defaultValue = value(false)
}
override val settings: List<TemplateSetting<*, *>> = listOf(renderEngine)
override val settings: List<TemplateSetting<*, *>> = listOf(useKotlinxHtml)
override fun Reader.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = buildList {
if (module.originalModule.kind == ModuleKind.singleplatformJsBrowser) {
@@ -79,19 +77,12 @@ class SimpleJsClientTemplate : Template() {
override fun Writer.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = withSettingsOf(module.originalModule) {
buildList {
+ArtifactBasedLibraryDependencyIR(
MavenArtifact(Repositories.KOTLINX, "org.jetbrains.kotlinx", "kotlinx-html-js"),
Versions.KOTLINX.KOTLINX_HTML(KotlinPlugin.version.propertyValue.version),
DependencyType.MAIN
)
val kotlinVersion = KotlinPlugin.version.propertyValue
if (renderEngine.reference.settingValue != RenderEngine.KOTLINX_HTML) {
+Dependencies.KOTLIN_REACT(kotlinVersion.version)
+Dependencies.KOTLIN_REACT_DOM(kotlinVersion.version)
if (renderEngine.reference.settingValue == RenderEngine.REACT_WITH_STYLED) {
+Dependencies.KOTLIN_STYLED(kotlinVersion.version)
}
if (useKotlinxHtml.reference.settingValue()) {
+ArtifactBasedLibraryDependencyIR(
MavenArtifact(Repositories.KOTLINX, "org.jetbrains.kotlinx", "kotlinx-html"),
Versions.KOTLINX.KOTLINX_HTML(KotlinPlugin.version.propertyValue.version),
DependencyType.MAIN
)
}
}
}
@@ -109,24 +100,13 @@ class SimpleJsClientTemplate : Template() {
if (!hasKtorServNeighbourTarget) {
+(FileTemplateDescriptor("$id/index.html.vm") asResourceOf SourcesetType.main)
}
if (renderEngine.reference.settingValue == RenderEngine.KOTLINX_HTML) {
if (useKotlinxHtml.reference.settingValue()) {
+(FileTemplateDescriptor("$id/client.kt.vm") asSrcOf SourcesetType.main)
+(FileTemplateDescriptor("$id/TestClient.kt.vm", "TestClient.kt".asPath()) asSrcOf SourcesetType.test)
} else {
+(FileTemplateDescriptor("$id/reactClient.kt.vm", "client.kt".asPath()) asSrcOf SourcesetType.main)
+(FileTemplateDescriptor("$id/reactComponent.kt.vm", "welcome.kt".asPath()) asSrcOf SourcesetType.main)
}
if (renderEngine.reference.settingValue == RenderEngine.REACT_WITH_STYLED) {
+(FileTemplateDescriptor("$id/WelcomeStyles.kt.vm") asSrcOf SourcesetType.main)
}
}
}
override fun Reader.getAdditionalSettings(module: Module): Map<String, Any> = withSettingsOf(module) {
mapOf("useStyledComponents" to (renderEngine.reference.settingValue == RenderEngine.REACT_WITH_STYLED))
}
override fun createInterceptors(module: ModuleIR): List<TemplateInterceptor> = buildList {
+interceptTemplate(KtorServerTemplate()) {
applicableIf { buildFileIR ->
@@ -273,10 +253,4 @@ class SimpleJsClientTemplate : Template() {
)
}
}
enum class RenderEngine(@Nls override val text: String) : DisplayableSettingItem {
KOTLINX_HTML(KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.kotlinx.html")),
REACT(KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.react")),
REACT_WITH_STYLED(KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.react.styled"))
}
}