From d330652eee526d5a52819d1a5875445214a3a010 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 22 Jan 2020 16:29:17 +0300 Subject: [PATCH] Wizard: add support of react js to the js template --- .../simpleJsClient/WelcomeStyles.kt.vm | 17 +++ .../templates/simpleJsClient/index.html.vm | 11 ++ .../simpleJsClient/reactClient.kt.vm | 15 +++ .../simpleJsClient/reactComponent.kt.vm | 59 +++++++++ .../projectWizard/ir/buildsystem/ModuleIR.kt | 9 +- .../projectWizard/plugins/StructurePlugin.kt | 11 +- .../plugins/buildSystem/BuildSystemPlugin.kt | 4 +- .../plugins/kotlin/ModulesToIRsConverter.kt | 2 +- .../plugins/templates/TemplatesPlugin.kt | 15 ++- .../settings/buildsystem/Repository.kt | 1 + .../templates/FileTemplateDescriptor.kt | 9 +- .../templates/SimpleJsClientTemplate.kt | 123 ++++++++++++++++-- 12 files changed, 255 insertions(+), 21 deletions(-) create mode 100644 libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/WelcomeStyles.kt.vm create mode 100644 libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/index.html.vm create mode 100644 libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/reactClient.kt.vm create mode 100644 libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/reactComponent.kt.vm diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/WelcomeStyles.kt.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/WelcomeStyles.kt.vm new file mode 100644 index 00000000000..d3b227672d8 --- /dev/null +++ b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/WelcomeStyles.kt.vm @@ -0,0 +1,17 @@ +import kotlinx.css.* +import styled.StyleSheet + +object WelcomeStyles : StyleSheet("WelcomeStyles", isStatic = true) { + val textContainer by css { + padding(5.px) + + backgroundColor = rgb(8, 97, 22) + color = rgb(56, 246, 137) + } + + val textInput by css { + margin(vertical = 5.px) + + fontSize = 14.px + } +} diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/index.html.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/index.html.vm new file mode 100644 index 00000000000..7f44966ab93 --- /dev/null +++ b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/index.html.vm @@ -0,0 +1,11 @@ + + + + + JS Client + + + +
+ + diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/reactClient.kt.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/reactClient.kt.vm new file mode 100644 index 00000000000..1af822892df --- /dev/null +++ b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/reactClient.kt.vm @@ -0,0 +1,15 @@ +import react.dom.render +import kotlin.browser.document +import kotlin.browser.window + +fun main() { + window.onload = { + render(document.getElementById("root")) { + child(Welcome::class) { + attrs { + name = "Kotlin/JS" + } + } + } + } +} diff --git a/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/reactComponent.kt.vm b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/reactComponent.kt.vm new file mode 100644 index 00000000000..698ed1f629e --- /dev/null +++ b/libraries/tools/new-project-wizard/resources/org/jetbrains/kotlin/tools/projectWizard/templates/simpleJsClient/reactComponent.kt.vm @@ -0,0 +1,59 @@ +import kotlinx.html.InputType +import kotlinx.html.js.onChangeFunction +import org.w3c.dom.HTMLInputElement +import react.RBuilder +import react.RComponent +import react.RProps +import react.RState +#if($useStyledComponents) +import styled.css +import styled.styledDiv +import styled.styledInput +#else +import react.dom.div +import react.dom.input +#end + +interface WelcomeProps : RProps { + var name: String +} + +data class WelcomeState(val name: String) : RState + +class Welcome(props: WelcomeProps) : RComponent(props) { + + init { + state = WelcomeState(props.name) + } + + override fun RBuilder.render() { +#if($useStyledComponents) + styledDiv { + css { + +WelcomeStyles.textContainer + } +#else + div { +#end + +"Hello, ${state.name}" + } +#if($useStyledComponents) + styledInput { + css { + +WelcomeStyles.textInput + } +#else + input { +#end + attrs { + type = InputType.text + value = state.name + onChangeFunction = { event -> + setState( + WelcomeState(name = (event.target as HTMLInputElement).value) + ) + } + } + } + } +} 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 d0c1581ac4d..0c94c6ac14f 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 @@ -6,6 +6,7 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.GradlePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.MavenPrinter import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module +import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.ModuleKind import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Sourceset import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType import org.jetbrains.kotlin.tools.projectWizard.templates.Template @@ -67,4 +68,10 @@ data class MultiplatformModuleIR( ) }.listNl(needFirstIndent = false) } -} \ No newline at end of file +} + +fun MultiplatformModuleIR.neighbourTargetModules() = + originalModule.parent + ?.takeIf { it.kind == ModuleKind.multiplatform } + ?.subModules + .orEmpty() \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt index 0ba3e1a013a..aa310e68414 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/StructurePlugin.kt @@ -1,11 +1,8 @@ package org.jetbrains.kotlin.tools.projectWizard.plugins -import org.jetbrains.kotlin.tools.projectWizard.core.Context -import org.jetbrains.kotlin.tools.projectWizard.core.Plugin -import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext +import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.entity.StringValidators import org.jetbrains.kotlin.tools.projectWizard.core.entity.reference -import org.jetbrains.kotlin.tools.projectWizard.core.pathParser import org.jetbrains.kotlin.tools.projectWizard.core.service.FileSystemWizardService import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.PomIR import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase @@ -39,9 +36,13 @@ class StructurePlugin(context: Context) : Plugin(context) { } } -val TaskRunningContext.projectPath +val ValuesReadingContext.projectPath get() = StructurePlugin::projectPath.reference.settingValue +val ValuesReadingContext.projectName + get() = StructurePlugin::name.reference.settingValue + + fun TaskRunningContext.pomIR() = PomIR( artifactId = StructurePlugin::artifactId.reference.settingValue, groupId = StructurePlugin::groupId.reference.settingValue, diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt index 6dee07da0ad..f75aba51f80 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/buildSystem/BuildSystemPlugin.kt @@ -15,6 +15,8 @@ import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ProjectKind import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.BuildFilePrinter import org.jetbrains.kotlin.tools.projectWizard.plugins.printer.printBuildFile import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath +import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatePlugin +import org.jetbrains.kotlin.tools.projectWizard.plugins.templates.TemplatesPlugin import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Repository import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles @@ -44,7 +46,7 @@ abstract class BuildSystemPlugin(context: Context) : Plugin(context) { val takeRepositoriesFromDependencies by pipelineTask(GenerationPhase.PROJECT_GENERATION) { runBefore(BuildSystemPlugin::createModules) - runAfter(KotlinPlugin::createModules) + runAfter(TemplatesPlugin::postApplyTemplatesToModules) withAction { updateBuildFiles { buildFile -> diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt index 6bacf6cc043..19adf8b86a9 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/kotlin/ModulesToIRsConverter.kt @@ -116,7 +116,7 @@ class ModulesToIRsConverter( } val moduleIr = SingleplatformModuleIR( - module.name, + if (modulePath == projectPath) projectName else module.name, modulePath, dependenciesIRs, module.template, diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt index f629d3a81a8..70178c7097d 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/plugins/templates/TemplatesPlugin.kt @@ -8,6 +8,8 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.plugins.buildSystem.BuildSystemPlugin import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin +import org.jetbrains.kotlin.tools.projectWizard.plugins.projectName +import org.jetbrains.kotlin.tools.projectWizard.plugins.projectPath import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.updateBuildFiles import org.jetbrains.kotlin.tools.projectWizard.templates.* import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.InterceptionPoint @@ -111,7 +113,11 @@ class TemplatesPlugin(context: Context) : Plugin(context) { ): TaskResult { val template = module.template ?: return UNIT_SUCCESS val settings = with(template) { settingsAsMap(module.originalModule) } - val allSettings = settings + interceptionPointSettings.mapKeys { it.key.name } + val allSettings: Map = mutableMapOf().apply { + putAll(settings) + putAll(interceptionPointSettings.mapKeys { it.key.name }) + putAll(defaultSettings(module)) + } return with(template) { getFileTemplates(module) }.map { (fileTemplateDescriptor, filePath) -> val path = generatePathForFileTemplate(module, filePath) val fileTemplate = FileTemplate( @@ -123,11 +129,16 @@ class TemplatesPlugin(context: Context) : Plugin(context) { }.sequenceIgnore() } + private fun TaskRunningContext.defaultSettings(moduleIR: ModuleIR) = mapOf( + "projectName" to projectName, + "moduleName" to moduleIR.name + ) + private fun generatePathForFileTemplate(module: ModuleIR, filePath: FilePath) = when (module) { is SingleplatformModuleIR -> { when (filePath) { is SrcFilePath -> SRC_DIR / filePath.sourcesetType.toString() / KOTLIN_DIR - is ResourcesFilePath -> RESOURCES_DIR / filePath.sourcesetType.toString() + is ResourcesFilePath -> SRC_DIR / filePath.sourcesetType.toString() / RESOURCES_DIR } } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt index f32051b09ae..7c0ad91e0a2 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/settings/buildsystem/Repository.kt @@ -39,6 +39,7 @@ data class BintrayRepository(val repository: String) : CustomMavenRepository { object Repositories { val KTOR_BINTRAY = BintrayRepository("kotlin/ktor") + val KOTLIN_JS_WRAPPERS_BINTRAY = BintrayRepository("kotlin/kotlin-js-wrappers") val KOTLIN_EAP_BINTRAY = BintrayRepository("kotlin/kotlin-eap") val KOTLIN_DEV_BINTRAY = BintrayRepository("kotlin/kotlin-dev") } diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/FileTemplateDescriptor.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/FileTemplateDescriptor.kt index 34dbdfa70a8..d04a65f17ad 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/FileTemplateDescriptor.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/FileTemplateDescriptor.kt @@ -1,12 +1,19 @@ package org.jetbrains.kotlin.tools.projectWizard.templates +import org.jetbrains.kotlin.tools.projectWizard.core.asPath import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.SourcesetType import java.nio.file.Path +import java.nio.file.Paths // Should be used to create any kind of files in the generated project // Except build files as they will be generated using IR -data class FileTemplateDescriptor(val templateId: String, val relativePath: Path) +data class FileTemplateDescriptor(val templateId: String, val relativePath: Path) { + constructor(templateId: String) : this( + templateId, + Paths.get(templateId).fileName.toString().removeSuffix(".vm").asPath() + ) +} sealed class FilePath { abstract val sourcesetType: SourcesetType 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 index 64f2780f6e2..9d2b26eb41e 100644 --- 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 @@ -8,16 +8,21 @@ package org.jetbrains.kotlin.tools.projectWizard.templates import org.jetbrains.kotlin.tools.projectWizard.core.TaskRunningContext import org.jetbrains.kotlin.tools.projectWizard.core.asPath import org.jetbrains.kotlin.tools.projectWizard.core.buildList +import org.jetbrains.kotlin.tools.projectWizard.core.entity.TemplateSetting import org.jetbrains.kotlin.tools.projectWizard.core.safeAs 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.library.NpmArtifact import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JsBrowserTargetConfigurator +import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase 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.DefaultRepository import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module +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 import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.TemplateInterceptor @@ -32,19 +37,62 @@ class SimpleJsClientTemplate : Template() { override fun isApplicableTo(module: Module): Boolean = module.configurator == JsBrowserTargetConfigurator - override fun TaskRunningContext.getRequiredLibraries(module: ModuleIR): List = + val renderEngine by enumSetting("Rendering engine", GenerationPhase.PROJECT_GENERATION) { + defaultValue = RenderEngine.REACT_WITH_STYLED + } + + override val settings: List> = listOf(renderEngine) + + override fun TaskRunningContext.getRequiredLibraries(module: ModuleIR): List = withSettingsOf(module.originalModule) { buildList { +ArtifactBasedLibraryDependencyIR( MavenArtifact(DefaultRepository.JCENTER, "org.jetbrains.kotlinx", "kotlinx-html-js"), Version.fromString("0.6.12"), DependencyType.MAIN ) + + if (renderEngine.reference.settingValue != RenderEngine.KOTLINX_HTML) { + +Dependencies.KOTLIN_REACT + +Dependencies.KOTLIN_REACT_DOM + +Dependencies.NPM_REACT + +Dependencies.NPM_REACT_DOM + if (renderEngine.reference.settingValue == RenderEngine.REACT_WITH_STYLED) { + +Dependencies.NPM_REACT_IS + +Dependencies.KOTLIN_STYLED + +Dependencies.NPM_STYLED_COMPONENTS + +Dependencies.NPM_INLINE_STYLE_PREFIXER + } + } + } + } + + + override fun TaskRunningContext.getFileTemplates(module: ModuleIR): List = + withSettingsOf(module.originalModule) { + buildList { + val hasKtorServNeighbourTarget = module.safeAs() + ?.neighbourTargetModules() + .orEmpty() + .any { module -> + module.template is KtorServerTemplate + } + if (!hasKtorServNeighbourTarget) { + +(FileTemplateDescriptor("$id/index.html.vm") asResourceOf SourcesetType.main) + } + if (renderEngine.reference.settingValue == RenderEngine.KOTLINX_HTML) { + +(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 TaskRunningContext.getFileTemplates(module: ModuleIR): List = buildList { - +(FileTemplateDescriptor("$id/client.kt.vm", "client.kt".asPath()) asSrcOf SourcesetType.main) - +(FileTemplateDescriptor("$id/TestClient.kt.vm", "TestClient.kt".asPath()) asSrcOf SourcesetType.test) - } override fun createInterceptors(module: ModuleIR): List = buildList { +interceptTemplate(KtorServerTemplate()) { @@ -78,7 +126,12 @@ class SimpleJsClientTemplate : Template() { if (value.isNotEmpty()) return@interceptAtPoint value buildList { +value - +"""script(src = "/static/output.js") {}""" + +""" + div { + id = "root" + } + """.trimIndent() + +"""script(src = "/static/$JS_OUTPUT_FILE_NAME") {}""" } } @@ -88,7 +141,7 @@ class SimpleJsClientTemplate : Template() { target.safeAs()?.targetAccess?.type == ModuleSubType.jvm } as? DefaultTargetConfigurationIR ?: return@transformBuildFile null val jvmTargetName = jvmTarget.targetName - val webPackTaskName = "${jsSourcesetName}BrowserWebpack" + val webPackTaskName = "$jsSourcesetName$WEBPACK_TASK_SUFFIX" val jvmJarTaskAccess = GradleByNameTaskAccessIR("${jvmTargetName}Jar", "Jar") val jvmJarTaskConfiguration = run { @@ -133,13 +186,12 @@ class SimpleJsClientTemplate : Template() { } } - override fun TaskRunningContext.getIrsToAddToBuildFile(module: ModuleIR): List = buildList { +RepositoryIR(DefaultRepository.JCENTER) if (module is MultiplatformModuleIR) { +GradleImportIR("org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack") val taskAccessIR = GradleByNameTaskAccessIR( - "${module.name}BrowserWebpack", + "${module.name}$WEBPACK_TASK_SUFFIX", WEBPACK_TASK_CLASS ) @@ -157,5 +209,56 @@ class SimpleJsClientTemplate : Template() { companion object { private const val JS_OUTPUT_FILE_NAME = "output.js" private const val WEBPACK_TASK_CLASS = "KotlinWebpack" + private const val WEBPACK_TASK_SUFFIX = "BrowserProductionWebpack" } -} \ No newline at end of file + + private object Dependencies { + val KOTLIN_REACT = ArtifactBasedLibraryDependencyIR( + MavenArtifact(Repositories.KOTLIN_JS_WRAPPERS_BINTRAY, "org.jetbrains", "kotlin-react"), + Version.fromString("16.9.0-pre.89-kotlin-1.3.60"), + DependencyType.MAIN + ) + val KOTLIN_REACT_DOM = ArtifactBasedLibraryDependencyIR( + MavenArtifact(Repositories.KOTLIN_JS_WRAPPERS_BINTRAY, "org.jetbrains", "kotlin-react-dom"), + Version.fromString("16.9.0-pre.89-kotlin-1.3.60"), + DependencyType.MAIN + ) + val KOTLIN_STYLED = ArtifactBasedLibraryDependencyIR( + MavenArtifact(Repositories.KOTLIN_JS_WRAPPERS_BINTRAY, "org.jetbrains", "kotlin-styled"), + Version.fromString("1.0.0-pre.89-kotlin-1.3.60"), + DependencyType.MAIN + ) + + val NPM_REACT = ArtifactBasedLibraryDependencyIR( + NpmArtifact("react"), + Version.fromString("16.12.0"), + DependencyType.MAIN + ) + val NPM_REACT_DOM = ArtifactBasedLibraryDependencyIR( + NpmArtifact("react-dom"), + Version.fromString("16.12.0"), + DependencyType.MAIN + ) + val NPM_REACT_IS = ArtifactBasedLibraryDependencyIR( + NpmArtifact("react-is"), + Version.fromString("16.12.0"), + DependencyType.MAIN + ) + val NPM_STYLED_COMPONENTS = ArtifactBasedLibraryDependencyIR( + NpmArtifact("styled-components"), + Version.fromString("5.0.0"), + DependencyType.MAIN + ) + val NPM_INLINE_STYLE_PREFIXER = ArtifactBasedLibraryDependencyIR( + NpmArtifact("inline-style-prefixer"), + Version.fromString("5.1.0"), + DependencyType.MAIN + ) + } + + enum class RenderEngine(override val text: String) : DisplayableSettingItem { + KOTLINX_HTML("Use statically typed Kotlinx.html DSL"), + REACT("Use Kotlin-wrapped React library"), + REACT_WITH_STYLED("Use Kotlin-wrapped React framework together with Styled Components"), + } +}