Compare commits

..

15 Commits

Author SHA1 Message Date
9a95bddf08 add support of JS publish scripts 2022-01-04 21:49:16 +06:00
c880d8e657 updates 2022-01-04 19:46:47 +06:00
ac87a140cc fixes 2021-09-04 19:34:24 +06:00
0dbe3a866b dependencies update 2021-09-04 19:09:16 +06:00
7c50c58a90 fix 2021-05-01 20:22:12 +06:00
ceff1eb1ef updates 2021-05-01 20:12:06 +06:00
46d6d429bb one more fix for web 2021-03-14 21:53:26 +06:00
dd9e71c9a2 fix in web view for loading of config 2021-03-14 21:46:41 +06:00
6d2ffb8a6e Update gradle.properties 2021-03-12 00:11:37 +06:00
25767eecb2 add github badge onto web version 2021-03-02 17:19:17 +06:00
603da9a021 fixes in saves 2021-03-02 16:51:08 +06:00
b43016bb24 repositories properties now checked 2021-03-02 16:45:46 +06:00
4c4845803d Merge pull request #3 from InsanusMokrassar/rewrite_with_web
add and web target
2021-03-02 14:11:38 +06:00
4ec7d3847f update workflows 2021-03-02 14:02:57 +06:00
2bbfe99ff4 add web publish step 2021-03-02 13:53:12 +06:00
28 changed files with 447 additions and 244 deletions

17
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
on: [push]
name: Build
jobs:
build-ubuntu:
name: Commit release
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup JDK
uses: actions/setup-java@v1
with:
java-version: 11
- name: Build
run: ./gradlew build packageUberJarForCurrentOS

View File

@@ -1,4 +1,7 @@
on: [push] on:
push:
branches:
- master
name: Commit release name: Commit release
@@ -16,7 +19,13 @@ jobs:
- name: Set version from gradle.properties - name: Set version from gradle.properties
run: echo "version=` cat gradle.properties | grep ^version= | grep -o [\\.0-9]* `" >> $GITHUB_ENV run: echo "version=` cat gradle.properties | grep ^version= | grep -o [\\.0-9]* `" >> $GITHUB_ENV
- name: Build - name: Build
run: ./gradlew packageUberJarForCurrentOS run: ./gradlew build packageUberJarForCurrentOS
- name: Publish Web
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./web/build/distributions
publish_branch: site
- name: Create Release - name: Create Release
id: create_release id: create_release
uses: actions/create-release@v1 uses: actions/create-release@v1

1
.gitignore vendored
View File

@@ -10,3 +10,4 @@ build/
out/ out/
local.properties local.properties
kotlin-js-store/

View File

@@ -1,6 +1,5 @@
buildscript { buildscript {
repositories { repositories {
jcenter()
google() google()
mavenCentral() mavenCentral()
mavenLocal() mavenLocal()
@@ -8,7 +7,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:4.0.2' classpath 'com.android.tools.build:gradle:7.0.4'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath "com.getkeepsafe.dexcount:dexcount-gradle-plugin:$dexcount_version" classpath "com.getkeepsafe.dexcount:dexcount-gradle-plugin:$dexcount_version"
@@ -19,10 +18,8 @@ buildscript {
allprojects { allprojects {
repositories { repositories {
mavenLocal() mavenLocal()
jcenter()
mavenCentral() mavenCentral()
google() google()
maven { url "https://kotlin.bintray.com/kotlinx" }
maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" } maven { url "https://maven.pkg.jetbrains.space/public/p/compose/dev" }
} }
} }

View File

@@ -0,0 +1,27 @@
package dev.inmo.kmppscriptbuilder.core.export
import dev.inmo.kmppscriptbuilder.core.models.GpgSigning
fun GpgSigning.generateMavenConfig() = when (this) {
GpgSigning.Disabled -> ""
GpgSigning.Optional ->
"""
if (project.hasProperty("signing.gnupg.keyName")) {
apply plugin: 'signing'
signing {
useGpgCmd()
sign publishing.publications
}
}"""
GpgSigning.Enabled ->
"""
apply plugin: 'signing'
signing {
useGpgCmd()
sign publishing.publications
}"""
}

View File

@@ -0,0 +1,67 @@
package dev.inmo.kmppscriptbuilder.core.export.js_only
import dev.inmo.kmppscriptbuilder.core.export.generateMavenConfig
import dev.inmo.kmppscriptbuilder.core.models.*
fun MavenConfig.buildJsOnlyMavenConfig(licenses: List<License>): String = """
apply plugin: 'maven-publish'
task javadocJar(type: Jar) {
classifier = 'javadoc'
}
task sourcesJar(type: Jar) {
kotlin.sourceSets.all {
from(kotlin)
}
classifier = 'sources'
}
publishing {
publications {
maven(MavenPublication) {
kotlin.js().components.forEach {
from(it)
}
artifact javadocJar
artifact sourcesJar
pom {
resolveStrategy = Closure.DELEGATE_FIRST
description = "$description"
name = "$name"
url = "$url"
scm {
developerConnection = "scm:git:[fetch=]${vcsUrl}[push=]${vcsUrl}"
url = "$vcsUrl"
}
developers {
${developers.joinToString("\n") { """
developer {
id = "${it.id}"
name = "${it.name}"
email = "${it.eMail}"
}
""" }}
}
licenses {
${licenses.joinToString("\n") { """
license {
name = "${it.title}"
url = "${it.url}"
}
""" }}
}
}
repositories {
${repositories.joinToString("\n ") { it.build(" ") }}
}
}
}
}
${gpgSigning.generateMavenConfig()}
""".trimIndent()

View File

@@ -1,69 +1,64 @@
package dev.inmo.kmppscriptbuilder.core.export.jvm_only package dev.inmo.kmppscriptbuilder.core.export.jvm_only
import dev.inmo.kmppscriptbuilder.core.export.generateMavenConfig
import dev.inmo.kmppscriptbuilder.core.models.* import dev.inmo.kmppscriptbuilder.core.models.*
fun MavenConfig.buildJvmOnlyMavenConfig(licenses: List<License>): String = """ fun MavenConfig.buildJvmOnlyMavenConfig(licenses: List<License>): String = """
apply plugin: 'maven-publish' apply plugin: 'maven-publish'
${if (includeGpgSigning) "apply plugin: 'signing'\n" else ""}
task javadocJar(type: Jar) {
from javadoc
classifier = 'javadoc'
}
task sourcesJar(type: Jar) {
from sourceSets.main.allSource
classifier = 'sources'
}
publishing { task javadocJar(type: Jar) {
publications { from javadoc
maven(MavenPublication) { classifier = 'javadoc'
from components.java }
task sourcesJar(type: Jar) {
artifact javadocJar from sourceSets.main.allSource
artifact sourcesJar classifier = 'sources'
}
pom { publishing {
resolveStrategy = Closure.DELEGATE_FIRST publications {
maven(MavenPublication) {
from components.java
description = "$description" artifact javadocJar
name = "$name" artifact sourcesJar
url = "$url"
scm { pom {
developerConnection = "scm:git:[fetch=]${vcsUrl}[push=]${vcsUrl}" resolveStrategy = Closure.DELEGATE_FIRST
url = "$vcsUrl"
}
developers { description = "$description"
${developers.joinToString("\n") { """ name = "$name"
developer { url = "$url"
id = "${it.id}"
name = "${it.name}"
email = "${it.eMail}"
}
""" }}
}
licenses { scm {
${licenses.joinToString("\n") { """ developerConnection = "scm:git:[fetch=]${vcsUrl}[push=]${vcsUrl}"
license { url = "$vcsUrl"
name = "${it.title}"
url = "${it.url}"
}
""" }}
}
} }
repositories {
${repositories.joinToString("\n ") { it.build(" ") }} developers {
${developers.joinToString("\n") { """
developer {
id = "${it.id}"
name = "${it.name}"
email = "${it.eMail}"
}
""" }}
} }
licenses {
${licenses.joinToString("\n") { """
license {
name = "${it.title}"
url = "${it.url}"
}
""" }}
}
}
repositories {
${repositories.joinToString("\n ") { it.build(" ") }}
} }
} }
} }
${if (includeGpgSigning) """ }
signing { ${gpgSigning.generateMavenConfig()}
useGpgCmd() """.trimIndent()
sign publishing.publications
}
""" else ""}
""".trimIndent()

View File

@@ -1,56 +1,52 @@
package dev.inmo.kmppscriptbuilder.core.export.mpp package dev.inmo.kmppscriptbuilder.core.export.mpp
import dev.inmo.kmppscriptbuilder.core.export.generateMavenConfig
import dev.inmo.kmppscriptbuilder.core.models.* import dev.inmo.kmppscriptbuilder.core.models.*
fun MavenConfig.buildMultiplatformMavenConfig(licenses: List<License>): String = """ fun MavenConfig.buildMultiplatformMavenConfig(licenses: List<License>): String = """
apply plugin: 'maven-publish' apply plugin: 'maven-publish'
${if (includeGpgSigning) "apply plugin: 'signing'\n" else ""}
task javadocsJar(type: Jar) {
classifier = 'javadoc'
}
publishing { task javadocsJar(type: Jar) {
publications.all { classifier = 'javadoc'
artifact javadocsJar }
pom { publishing {
description = "$description" publications.all {
name = "$name" artifact javadocsJar
url = "$url"
scm { pom {
developerConnection = "scm:git:[fetch=]${vcsUrl}[push=]${vcsUrl}" description = "$description"
url = "$vcsUrl" name = "$name"
} url = "$url"
developers { scm {
${developers.joinToString("\n") { """ developerConnection = "scm:git:[fetch=]${vcsUrl}[push=]${vcsUrl}"
developer { url = "$vcsUrl"
id = "${it.id}"
name = "${it.name}"
email = "${it.eMail}"
}
""" }}
}
licenses {
${licenses.joinToString("\n") { """
license {
name = "${it.title}"
url = "${it.url}"
}
""" }}
}
} }
repositories {
${repositories.joinToString("\n ") { it.build(" ") }} developers {
${developers.joinToString("\n") { """
developer {
id = "${it.id}"
name = "${it.name}"
email = "${it.eMail}"
}
""" }}
}
licenses {
${licenses.joinToString("\n") { """
license {
name = "${it.title}"
url = "${it.url}"
}
""" }}
} }
} }
repositories {
${repositories.joinToString("\n ") { it.build(" ") }}
}
} }
${if (includeGpgSigning) """ }
signing { ${gpgSigning.generateMavenConfig()}
useGpgCmd() """.trimIndent()
sign publishing.publications
}
""" else ""}
""".trimIndent()

View File

@@ -1,5 +1,6 @@
package dev.inmo.kmppscriptbuilder.core.models package dev.inmo.kmppscriptbuilder.core.models
import dev.inmo.kmppscriptbuilder.core.export.js_only.buildJsOnlyMavenConfig
import dev.inmo.kmppscriptbuilder.core.export.jvm_only.buildJvmOnlyMavenConfig import dev.inmo.kmppscriptbuilder.core.export.jvm_only.buildJvmOnlyMavenConfig
import dev.inmo.kmppscriptbuilder.core.export.mpp.buildMultiplatformMavenConfig import dev.inmo.kmppscriptbuilder.core.export.mpp.buildMultiplatformMavenConfig
import kotlinx.serialization.* import kotlinx.serialization.*
@@ -32,12 +33,6 @@ object ProjectTypeSerializer : KSerializer<ProjectType> {
object MultiplatformProjectType : ProjectType() { object MultiplatformProjectType : ProjectType() {
override val name: String = "Multiplatform" override val name: String = "Multiplatform"
// override fun buildBintrayGradleConfig(
// bintrayConfig: BintrayConfig,
// licenses: List<License>
// ): String = bintrayConfig.buildMultiplatformGradleConfig(
// licenses
// )
override fun buildMavenGradleConfig( override fun buildMavenGradleConfig(
mavenConfig: MavenConfig, mavenConfig: MavenConfig,
@@ -49,12 +44,6 @@ object MultiplatformProjectType : ProjectType() {
object JVMProjectType : ProjectType() { object JVMProjectType : ProjectType() {
override val name: String = "JVM" override val name: String = "JVM"
// override fun buildBintrayGradleConfig(
// bintrayConfig: BintrayConfig,
// licenses: List<License>
// ): String = bintrayConfig.buildJvmOnlyGradleConfig(
// licenses
// )
override fun buildMavenGradleConfig( override fun buildMavenGradleConfig(
mavenConfig: MavenConfig, mavenConfig: MavenConfig,
@@ -64,6 +53,15 @@ object JVMProjectType : ProjectType() {
) )
} }
object JSProjectType : ProjectType() {
override val name: String = "JS"
override fun buildMavenGradleConfig(
mavenConfig: MavenConfig,
licenses: List<License>
): String = mavenConfig.buildJsOnlyMavenConfig(licenses)
}
@Serializable @Serializable
data class Config( data class Config(
val licenses: List<License>, val licenses: List<License>,

View File

@@ -30,19 +30,19 @@ suspend fun HttpClient.getLicenses(): Map<String, License> {
suspend fun HttpClient.searchLicense(name: String): List<License> { suspend fun HttpClient.searchLicense(name: String): List<License> {
val licenses = licenses ?: getLicenses() val licenses = licenses ?: getLicenses()
val lowerCase = name.toLowerCase() val lowerCase = name.lowercase()
val upperCase = name.toUpperCase() val upperCase = name.uppercase()
return licenses.values.filter { return licenses.values.filter {
it.title.toLowerCase().contains(lowerCase) || it.title.toUpperCase().contains(upperCase) || it.title.contains(name) it.title.lowercase().contains(lowerCase) || it.title.uppercase().contains(upperCase) || it.title.contains(name)
|| it.id.toLowerCase().contains(lowerCase) || it.id.toUpperCase().contains(upperCase) || it.id.contains(name) || it.id.lowercase().contains(lowerCase) || it.id.uppercase().contains(upperCase) || it.id.contains(name)
} }
} }
fun Map<String, License>.searchLicense(name: String): List<License> { fun Map<String, License>.searchLicense(name: String): List<License> {
val lowerCase = name.toLowerCase() val lowerCase = name.lowercase()
val upperCase = name.toUpperCase() val upperCase = name.uppercase()
return values.filter { return values.filter {
it.title.toLowerCase().contains(lowerCase) || it.title.toUpperCase().contains(upperCase) || it.title.contains(name) it.title.lowercase().contains(lowerCase) || it.title.uppercase().contains(upperCase) || it.title.contains(name)
|| it.id.toLowerCase().contains(lowerCase) || it.id.toUpperCase().contains(upperCase) || it.id.contains(name) || it.id.lowercase().contains(lowerCase) || it.id.uppercase().contains(upperCase) || it.id.contains(name)
} }
} }

View File

@@ -2,15 +2,30 @@ package dev.inmo.kmppscriptbuilder.core.models
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
const val defaultProjectName = "\${project.name}"
const val defaultProjectDescription = "\${project.name}"
@Serializable
sealed class GpgSigning {
@Serializable
object Disabled : GpgSigning()
@Serializable
object Optional : GpgSigning()
@Serializable
object Enabled : GpgSigning()
}
@Serializable @Serializable
data class MavenConfig( data class MavenConfig(
val name: String, val name: String,
val description: String, val description: String,
val url: String, val url: String,
val vcsUrl: String, val vcsUrl: String,
val includeGpgSigning: Boolean = false,
val developers: List<Developer>, val developers: List<Developer>,
val repositories: List<MavenPublishingRepository> = emptyList() val repositories: List<MavenPublishingRepository> = emptyList(),
val gpgSigning: GpgSigning = GpgSigning.Disabled,
@Deprecated("Replaced with gpgSigning")
val includeGpgSigning: Boolean = false,
) )
@Serializable @Serializable
@@ -22,14 +37,20 @@ data class MavenPublishingRepository(
name.toUpperCase() name.toUpperCase()
} }
fun build(indent: String) = """maven { fun build(indent: String): String {
name = "$name" val usernameProperty = "${nameCapitalized}_USER"
url = uri("$url") val passwordProperty = "${nameCapitalized}_PASSWORD"
credentials { return """if ((project.hasProperty('${usernameProperty}') || System.getenv('${usernameProperty}') != null) && (project.hasProperty('${passwordProperty}') || System.getenv('${passwordProperty}') != null)) {
username = project.hasProperty('${nameCapitalized}_USER') ? project.property('${nameCapitalized}_USER') : System.getenv('${nameCapitalized}_USER') maven {
password = project.hasProperty('${nameCapitalized}_PASSWORD') ? project.property('${nameCapitalized}_PASSWORD') : System.getenv('${nameCapitalized}_PASSWORD') name = "$name"
url = uri("$url")
credentials {
username = project.hasProperty('${usernameProperty}') ? project.property('${usernameProperty}') : System.getenv('${usernameProperty}')
password = project.hasProperty('${passwordProperty}') ? project.property('${passwordProperty}') : System.getenv('${passwordProperty}')
}
} }
}""".replace("\n", "\n$indent") }""".replace("\n", "\n$indent")
}
} }
val SonatypeRepository = MavenPublishingRepository("sonatype", "https://oss.sonatype.org/service/local/staging/deploy/maven2/") val SonatypeRepository = MavenPublishingRepository("sonatype", "https://oss.sonatype.org/service/local/staging/deploy/maven2/")

View File

@@ -10,7 +10,6 @@ kotlin {
jvm { jvm {
compilations.main.kotlinOptions { compilations.main.kotlinOptions {
jvmTarget = "11" jvmTarget = "11"
useIR = true
} }
} }
sourceSets { sourceSets {

View File

@@ -1,62 +1,67 @@
package dev.inmo.kmppscriptbuilder.desktop package dev.inmo.kmppscriptbuilder.desktop
import androidx.compose.desktop.Window
import androidx.compose.foundation.* import androidx.compose.foundation.*
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.* import androidx.compose.material.Colors
import androidx.compose.material.MaterialTheme
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import dev.inmo.kmppscriptbuilder.desktop.utils.* import androidx.compose.ui.window.Window
import dev.inmo.kmppscriptbuilder.desktop.views.* import androidx.compose.ui.window.application
import dev.inmo.kmppscriptbuilder.desktop.utils.init
import dev.inmo.kmppscriptbuilder.desktop.utils.loadConfigFile
import dev.inmo.kmppscriptbuilder.desktop.views.BuilderView
import java.io.File import java.io.File
//private val uncaughtExceptionsBC = BroadcastChannel<DefaultErrorHandler.ErrorEvent>(Channel.CONFLATED) //private val uncaughtExceptionsBC = BroadcastChannel<DefaultErrorHandler.ErrorEvent>(Channel.CONFLATED)
//val uncaughtExceptionsFlow: Flow<DefaultErrorHandler.ErrorEvent> = uncaughtExceptionsBC.asFlow() //val uncaughtExceptionsFlow: Flow<DefaultErrorHandler.ErrorEvent> = uncaughtExceptionsBC.asFlow()
fun main(args: Array<String>) = Window(title = "Kotlin Multiplatform Publishing Builder") { fun main(args: Array<String>) = application {
val builder = BuilderView() Window(onCloseRequest = ::exitApplication, title = "Kotlin Multiplatform Publishing Builder") {
MaterialTheme( val builder = BuilderView()
Colors( MaterialTheme(
primary = Color(0x01, 0x57, 0x9b), Colors(
primaryVariant = Color(0x00, 0x2f, 0x6c), primary = Color(0x01, 0x57, 0x9b),
secondary = Color(0xb2, 0xeb, 0xf2), primaryVariant = Color(0x00, 0x2f, 0x6c),
secondaryVariant = Color(0x81, 0xb9, 0xbf), secondary = Color(0xb2, 0xeb, 0xf2),
background = Color(0xe1, 0xe2, 0xe1), secondaryVariant = Color(0x81, 0xb9, 0xbf),
surface = Color(0xf5, 0xf5, 0xf6), background = Color(0xe1, 0xe2, 0xe1),
error = Color(0xb7, 0x1c, 0x1c), surface = Color(0xf5, 0xf5, 0xf6),
onPrimary = Color.White, error = Color(0xb7, 0x1c, 0x1c),
onSecondary = Color.Black, onPrimary = Color.White,
onBackground = Color.Black, onSecondary = Color.Black,
onSurface = Color.Black, onBackground = Color.Black,
onError = Color.White, onSurface = Color.Black,
isLight = MaterialTheme.colors.isLight, onError = Color.White,
) isLight = MaterialTheme.colors.isLight,
) {
Box(
Modifier.fillMaxSize()
.background(color = Color(245, 245, 245))
) {
val stateVertical = rememberScrollState(0)
Box(
modifier = Modifier
.fillMaxSize()
.verticalScroll(stateVertical)
) {
builder.init()
}
VerticalScrollbar(
modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
adapter = rememberScrollbarAdapter(stateVertical)
) )
) {
Box(
Modifier.fillMaxSize()
.background(color = Color(245, 245, 245))
) {
val stateVertical = rememberScrollState(0)
Box(
modifier = Modifier
.fillMaxSize()
.verticalScroll(stateVertical)
) {
builder.init()
}
VerticalScrollbar(
modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(),
adapter = rememberScrollbarAdapter(stateVertical)
)
}
}
if (args.isNotEmpty()) {
val config = loadConfigFile(File(args.first()))
builder.config = config
} }
} }
if (args.isNotEmpty()) {
val config = loadConfigFile(File(args.first()))
builder.config = config
}
} }

View File

@@ -0,0 +1,17 @@
package dev.inmo.kmppscriptbuilder.desktop.utils
import java.awt.Desktop
import java.net.URI
fun openLink(link: String): Boolean {
val desktop = if (Desktop.isDesktopSupported()) Desktop.getDesktop() else null
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) {
try {
desktop.browse(URI(link))
return true
} catch (e: Exception) {
e.printStackTrace()
}
}
return false
}

View File

@@ -6,7 +6,7 @@ import androidx.compose.foundation.layout.*
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.svgResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import dev.inmo.kmppscriptbuilder.core.models.Config import dev.inmo.kmppscriptbuilder.core.models.Config
import dev.inmo.kmppscriptbuilder.desktop.utils.* import dev.inmo.kmppscriptbuilder.desktop.utils.*
@@ -45,7 +45,7 @@ class BuilderView : View() {
} }
) { ) {
Image( Image(
painter = svgResource("images/open_file.svg"), painter = painterResource("images/open_file.svg"),
contentDescription = "Open file" contentDescription = "Open file"
) )
} }
@@ -57,7 +57,7 @@ class BuilderView : View() {
} }
) { ) {
Image( Image(
painter = svgResource("images/save_file.svg"), painter = painterResource("images/save_file.svg"),
contentDescription = "Save file" contentDescription = "Save file"
) )
} }
@@ -70,7 +70,7 @@ class BuilderView : View() {
} }
) { ) {
Image( Image(
painter = svgResource("images/export_gradle.svg"), painter = painterResource("images/export_gradle.svg"),
contentDescription = "Export Gradle script" contentDescription = "Export Gradle script"
) )
} }
@@ -84,7 +84,7 @@ class BuilderView : View() {
} }
) { ) {
Image( Image(
painter = svgResource("images/save_as.svg"), painter = painterResource("images/save_as.svg"),
contentDescription = "Export Gradle script" contentDescription = "Export Gradle script"
) )
} }
@@ -100,4 +100,4 @@ class BuilderView : View() {
} }
} }
} }
} }

View File

@@ -2,7 +2,7 @@ package dev.inmo.kmppscriptbuilder.desktop.views
import androidx.compose.runtime.* import androidx.compose.runtime.*
import dev.inmo.kmppscriptbuilder.core.models.Developer import dev.inmo.kmppscriptbuilder.core.models.Developer
import dev.inmo.kmppscriptbuilder.desktop.utils.* import dev.inmo.kmppscriptbuilder.desktop.utils.CommonTextField
class DeveloperState( class DeveloperState(
id: String = "", id: String = "",

View File

@@ -53,7 +53,7 @@ class LicensesView: VerticalView("Licenses") {
licensesOffersToShow.clear() licensesOffersToShow.clear()
if (licenseSearchFilter.isNotEmpty()) { if (licenseSearchFilter.isNotEmpty()) {
licensesOffersToShow.addAll( licensesOffersToShow.addAll(
availableLicensesState.filter { filterText.all { symbol -> symbol.toLowerCase() in it.title } } availableLicensesState.filter { filterText.all { symbol -> symbol.lowercaseChar() in it.title } }
) )
} }
} }

View File

@@ -1,11 +1,13 @@
package dev.inmo.kmppscriptbuilder.desktop.views package dev.inmo.kmppscriptbuilder.desktop.views
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material.* import androidx.compose.material.Button
import androidx.compose.runtime.* import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import dev.inmo.kmppscriptbuilder.desktop.utils.* import dev.inmo.kmppscriptbuilder.desktop.utils.CommonText
import dev.inmo.kmppscriptbuilder.desktop.utils.VerticalView
abstract class ListView<T>(title: String) : VerticalView(title) { abstract class ListView<T>(title: String) : VerticalView(title) {
protected val itemsList = mutableStateListOf<T>() protected val itemsList = mutableStateListOf<T>()

View File

@@ -2,8 +2,7 @@ package dev.inmo.kmppscriptbuilder.desktop.views
import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.runtime.* import androidx.compose.runtime.*
import dev.inmo.kmppscriptbuilder.core.models.MavenConfig import dev.inmo.kmppscriptbuilder.core.models.*
import dev.inmo.kmppscriptbuilder.core.models.SonatypeRepository
import dev.inmo.kmppscriptbuilder.desktop.utils.* import dev.inmo.kmppscriptbuilder.desktop.utils.*
class MavenInfoView : VerticalView("Project information") { class MavenInfoView : VerticalView("Project information") {
@@ -11,31 +10,35 @@ class MavenInfoView : VerticalView("Project information") {
private var projectDescriptionProperty by mutableStateOf("") private var projectDescriptionProperty by mutableStateOf("")
private var projectUrlProperty by mutableStateOf("") private var projectUrlProperty by mutableStateOf("")
private var projectVcsUrlProperty by mutableStateOf("") private var projectVcsUrlProperty by mutableStateOf("")
private var includeGpgSignProperty by mutableStateOf(true) private var gpgSignProperty by mutableStateOf<GpgSigning>(GpgSigning.Disabled)
private var publishToMavenCentralProperty by mutableStateOf(false) private var publishToMavenCentralProperty by mutableStateOf(false)
private val developersView = DevelopersView() private val developersView = DevelopersView()
private val repositoriesView = RepositoriesView() private val repositoriesView = RepositoriesView()
var mavenConfig: MavenConfig var mavenConfig: MavenConfig
get() = MavenConfig( get() = MavenConfig(
projectNameProperty, projectNameProperty.ifBlank { defaultProjectName },
projectDescriptionProperty, projectDescriptionProperty.ifBlank { defaultProjectDescription },
projectUrlProperty, projectUrlProperty,
projectVcsUrlProperty, projectVcsUrlProperty,
includeGpgSignProperty,
developersView.developers, developersView.developers,
repositoriesView.repositories + if (publishToMavenCentralProperty) { repositoriesView.repositories + if (publishToMavenCentralProperty) {
listOf(SonatypeRepository) listOf(SonatypeRepository)
} else { } else {
emptyList() emptyList()
} },
gpgSignProperty
) )
set(value) { set(value) {
projectNameProperty = value.name projectNameProperty = value.name
projectDescriptionProperty = value.description projectDescriptionProperty = value.description
projectUrlProperty = value.url projectUrlProperty = value.url
projectVcsUrlProperty = value.vcsUrl projectVcsUrlProperty = value.vcsUrl
includeGpgSignProperty = value.includeGpgSigning gpgSignProperty = if (value.includeGpgSigning) {
GpgSigning.Enabled
} else {
value.gpgSigning
}
publishToMavenCentralProperty = value.repositories.any { it == SonatypeRepository } publishToMavenCentralProperty = value.repositories.any { it == SonatypeRepository }
developersView.developers = value.developers developersView.developers = value.developers
repositoriesView.repositories = value.repositories.filter { it != SonatypeRepository } repositoriesView.repositories = value.repositories.filter { it != SonatypeRepository }
@@ -60,11 +63,12 @@ class MavenInfoView : VerticalView("Project information") {
"Public project VCS URL (with .git)" "Public project VCS URL (with .git)"
) { projectVcsUrlProperty = it } ) { projectVcsUrlProperty = it }
SwitchWithLabel(
"Include GPG Signing", // SwitchWithLabel(
includeGpgSignProperty, // "Include GPG Signing",
placeSwitchAtTheStart = true // includeGpgSignProperty,
) { includeGpgSignProperty = it } // placeSwitchAtTheStart = true
// ) { includeGpgSignProperty = it }
SwitchWithLabel( SwitchWithLabel(
"Include publication to MavenCentral", "Include publication to MavenCentral",
@@ -74,4 +78,4 @@ class MavenInfoView : VerticalView("Project information") {
developersView.init() developersView.init()
repositoriesView.init() repositoriesView.init()
} }
} }

View File

@@ -2,7 +2,7 @@ package dev.inmo.kmppscriptbuilder.desktop.views
import androidx.compose.runtime.* import androidx.compose.runtime.*
import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository
import dev.inmo.kmppscriptbuilder.desktop.utils.* import dev.inmo.kmppscriptbuilder.desktop.utils.CommonTextField
class RepositoryState( class RepositoryState(
name: String = "", name: String = "",

View File

@@ -6,27 +6,27 @@ kotlin.incremental.js=true
android.useAndroidX=true android.useAndroidX=true
android.enableJetifier=true android.enableJetifier=true
kotlin_version=1.4.30 kotlin_version=1.6.10
kotlin_coroutines_version=1.4.2 kotlin_coroutines_version=1.6.0
kotlin_serialisation_core_version=1.1.0 kotlin_serialisation_core_version=1.3.2
ktor_version=1.5.1 ktor_version=1.6.7
micro_utils_version=0.4.27 micro_utils_version=0.9.0
compose_version=0.3.0 compose_version=1.0.1
# ANDROID # ANDROID
android_minSdkVersion=21 android_minSdkVersion=21
android_compileSdkVersion=30 android_compileSdkVersion=32
android_buildToolsVersion=30.0.2 android_buildToolsVersion=32.0.0
dexcount_version=2.0.0 dexcount_version=3.0.1
junit_version=4.12 junit_version=4.12
test_ext_junit_version=1.1.2 test_ext_junit_version=1.1.2
espresso_core=3.3.0 espresso_core=3.3.0
# Dokka # Dokka
dokka_version=1.4.20 dokka_version=1.6.0
# Project data # Project data

View File

@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip

View File

@@ -14,12 +14,11 @@ fun saveFile(content: String, filename: String) {
setAttribute("style", "visibility:hidden; display: none") setAttribute("style", "visibility:hidden; display: none")
} as HTMLAnchorElement } as HTMLAnchorElement
val blob = Blob(arrayOf(content), BlobPropertyBag( val blob = Blob(arrayOf(content), BlobPropertyBag(
"text/plain;charset=utf-8" "application/*;charset=utf-8"
)) ))
val url = URL.createObjectURL(blob) val url = URL.createObjectURL(blob)
a.href = url a.href = url
a.download = filename a.download = filename
a.target = "_blank"
a.click() a.click()
URL.revokeObjectURL(url) URL.revokeObjectURL(url)
a.remove() a.remove()

View File

@@ -48,7 +48,7 @@ class LicensesView(
emptyList() emptyList()
} else { } else {
licensesTemplates.filter { licensesTemplates.filter {
val lowercasedTitle = it.title.toLowerCase() val lowercasedTitle = it.title.lowercase()
lowercased.all { it in lowercasedTitle } lowercased.all { it in lowercasedTitle }
} }
} }
@@ -57,12 +57,12 @@ class LicensesView(
} }
private val searchElement = rootElement.createTextField("Quick add", "Type some license name part to find it").apply { private val searchElement = rootElement.createTextField("Quick add", "Type some license name part to find it").apply {
oninput = { oninput = {
changeActor.offer(Unit) changeActor.trySend(Unit)
false false
} }
} }
private var searchString: String private var searchString: String
get() = searchElement.value.toLowerCase() get() = searchElement.value.lowercase()
set(value) { set(value) {
searchElement.value = value searchElement.value = value
} }
@@ -71,7 +71,7 @@ class LicensesView(
createCommonButton(value.title).onclick = { createCommonButton(value.title).onclick = {
searchString = "" searchString = ""
licensesView.licenses += value licensesView.licenses += value
changeActor.offer(Unit) changeActor.trySend(Unit)
false false
} }
} }
@@ -110,4 +110,4 @@ class LicensesView(
titleElement.value = to.title titleElement.value = to.title
urlElement.value = to.url ?: "" urlElement.value = to.url ?: ""
} }
} }

View File

@@ -1,7 +1,7 @@
package dev.inmo.kmppscriptbuilder.web.views package dev.inmo.kmppscriptbuilder.web.views
import dev.inmo.kmppscriptbuilder.core.models.MavenConfig import dev.inmo.kmppscriptbuilder.core.models.*
import dev.inmo.kmppscriptbuilder.core.models.SonatypeRepository import dev.inmo.kmppscriptbuilder.web.utils.ukActive
import kotlinx.browser.document import kotlinx.browser.document
import org.w3c.dom.HTMLElement import org.w3c.dom.HTMLElement
import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLInputElement
@@ -11,23 +11,51 @@ class MavenProjectInfoView : View {
private val descriptionElement = document.getElementById("projectDescriptionInput") as HTMLInputElement private val descriptionElement = document.getElementById("projectDescriptionInput") as HTMLInputElement
private val urlElement = document.getElementById("projectUrlInput") as HTMLInputElement private val urlElement = document.getElementById("projectUrlInput") as HTMLInputElement
private val vcsUrlElement = document.getElementById("projectVCSUrlInput") as HTMLInputElement private val vcsUrlElement = document.getElementById("projectVCSUrlInput") as HTMLInputElement
private val includeGpgElement = document.getElementById("includeGpgSignToggle") as HTMLInputElement private val disableGpgSigningElement = document.getElementById("disableGpgSigning") as HTMLElement
private val optionalGpgSigningElement = document.getElementById("optionalGpgSigning") as HTMLElement
private val enableGpgSigningElement = document.getElementById("enableGpgSigning") as HTMLElement
private val includeMavenCentralElement = document.getElementById("includeMavenCentralTargetRepoToggle") as HTMLInputElement private val includeMavenCentralElement = document.getElementById("includeMavenCentralTargetRepoToggle") as HTMLInputElement
private val developersView = DevelopersView(document.getElementById("developersListDiv") as HTMLElement) private val developersView = DevelopersView(document.getElementById("developersListDiv") as HTMLElement)
private val repositoriesView = RepositoriesView(document.getElementById("repositoriesListDiv") as HTMLElement) private val repositoriesView = RepositoriesView(document.getElementById("repositoriesListDiv") as HTMLElement)
private var gpgSignMode: GpgSigning = GpgSigning.Disabled
set(value) {
field = value
when (value) {
GpgSigning.Enabled -> {
enableGpgSigningElement.ukActive = true
disableGpgSigningElement.ukActive = false
optionalGpgSigningElement.ukActive = false
}
GpgSigning.Optional -> {
enableGpgSigningElement.ukActive = false
disableGpgSigningElement.ukActive = false
optionalGpgSigningElement.ukActive = true
}
GpgSigning.Disabled -> {
enableGpgSigningElement.ukActive = false
disableGpgSigningElement.ukActive = true
optionalGpgSigningElement.ukActive = false
}
}
}
var mavenConfig: MavenConfig var mavenConfig: MavenConfig
get() = MavenConfig( get() = MavenConfig(
nameElement.value, nameElement.value.ifBlank { defaultProjectName },
descriptionElement.value, descriptionElement.value.ifBlank { defaultProjectDescription },
urlElement.value, urlElement.value,
vcsUrlElement.value, vcsUrlElement.value,
includeGpgElement.checked,
developersView.developers, developersView.developers,
repositoriesView.repositories + if (includeMavenCentralElement.checked) { repositoriesView.repositories + if (includeMavenCentralElement.checked) {
listOf(SonatypeRepository) listOf(SonatypeRepository)
} else { } else {
emptyList() emptyList()
},
when {
optionalGpgSigningElement.ukActive -> GpgSigning.Optional
enableGpgSigningElement.ukActive -> GpgSigning.Enabled
else -> GpgSigning.Disabled
} }
) )
set(value) { set(value) {
@@ -35,10 +63,20 @@ class MavenProjectInfoView : View {
descriptionElement.value = value.description descriptionElement.value = value.description
urlElement.value = value.url urlElement.value = value.url
vcsUrlElement.value = value.vcsUrl vcsUrlElement.value = value.vcsUrl
includeGpgElement.checked = value.includeGpgSigning gpgSignMode = if (value.includeGpgSigning) {
GpgSigning.Enabled
} else {
value.gpgSigning
}
developersView.developers = value.developers developersView.developers = value.developers
val reposWithoutSonatype = value.repositories.filter { it != SonatypeRepository } val reposWithoutSonatype = value.repositories.filter { it != SonatypeRepository }
includeMavenCentralElement.checked = value.repositories.size != reposWithoutSonatype.size includeMavenCentralElement.checked = value.repositories.size != reposWithoutSonatype.size
repositoriesView.repositories = value.repositories repositoriesView.repositories = reposWithoutSonatype
} }
}
init {
enableGpgSigningElement.onclick = { gpgSignMode = GpgSigning.Enabled; Unit }
disableGpgSigningElement.onclick = { gpgSignMode = GpgSigning.Disabled; Unit }
optionalGpgSigningElement.onclick = { gpgSignMode = GpgSigning.Optional; Unit }
}
}

View File

@@ -8,16 +8,18 @@ import org.w3c.dom.HTMLElement
class ProjectTypeView : View { class ProjectTypeView : View {
private val mppProjectTypeElement = document.getElementById("mppProjectType") as HTMLElement private val mppProjectTypeElement = document.getElementById("mppProjectType") as HTMLElement
private val jvmProjectTypeElement = document.getElementById("jvmProjectType") as HTMLElement private val jvmProjectTypeElement = document.getElementById("jvmProjectType") as HTMLElement
private val jsProjectTypeElement = document.getElementById("jsProjectType") as HTMLElement
var projectType: ProjectType var projectType: ProjectType
get() = if (jvmProjectTypeElement.ukActive) { get() = when {
JVMProjectType jvmProjectTypeElement.ukActive -> JVMProjectType
} else { jsProjectTypeElement.ukActive -> JSProjectType
MultiplatformProjectType else -> MultiplatformProjectType
} }
set(value) { set(value) {
mppProjectTypeElement.ukActive = value == MultiplatformProjectType mppProjectTypeElement.ukActive = value == MultiplatformProjectType
jvmProjectTypeElement.ukActive = value == JVMProjectType jvmProjectTypeElement.ukActive = value == JVMProjectType
jsProjectTypeElement.ukActive = value == JSProjectType
} }
init { init {
@@ -29,5 +31,9 @@ class ProjectTypeView : View {
projectType = JVMProjectType projectType = JVMProjectType
Unit Unit
} }
jsProjectTypeElement.onclick = {
projectType = JSProjectType
Unit
}
} }
} }

View File

@@ -21,7 +21,7 @@ class RepositoriesView(rootElement: HTMLElement) : MutableListView<MavenPublishi
override fun HTMLElement.addContentBeforeRemoveButton(value: MavenPublishingRepository) { override fun HTMLElement.addContentBeforeRemoveButton(value: MavenPublishingRepository) {
createTextField("Repository name", "This name will be used to identify repository in grade").value = value.name createTextField("Repository name", "This name will be used to identify repository in grade").value = value.name
createTextField("Repository URL", "For example: https://repo.maven.apache.org/maven2/").value = value.name createTextField("Repository URL", "For example: https://repo.maven.apache.org/maven2/").value = value.url
} }
override fun HTMLElement.updateElement(from: MavenPublishingRepository, to: MavenPublishingRepository) { override fun HTMLElement.updateElement(from: MavenPublishingRepository, to: MavenPublishingRepository) {

View File

@@ -10,6 +10,7 @@
<nav class="uk-navbar-container" uk-navbar> <nav class="uk-navbar-container" uk-navbar>
<div class="uk-navbar-left"> <div class="uk-navbar-left">
<div class="uk-padding-small uk-text-lead">Kotlin Publication Scripts Builder</div> <div class="uk-padding-small uk-text-lead">Kotlin Publication Scripts Builder</div>
<div class="uk-padding-small"><a href="https://github.com/InsanusMokrassar/KotlinPublicationScriptsBuilder"><img src="https://img.shields.io/github/stars/InsanusMokrassar/KotlinPublicationScriptsBuilder?label=Github&style=plastic"/></a></div>
</div> </div>
<div class="uk-navbar-right"> <div class="uk-navbar-right">
<ul class="uk-navbar-nav"> <ul class="uk-navbar-nav">
@@ -26,15 +27,11 @@
<ul class="uk-subnav uk-subnav-pill"> <ul class="uk-subnav uk-subnav-pill">
<li id="mppProjectType" class="uk-active"><a href="#">Multiplatform</a></li> <li id="mppProjectType" class="uk-active"><a href="#">Multiplatform</a></li>
<li id="jvmProjectType"><a href="#">JVM</a></li> <li id="jvmProjectType"><a href="#">JVM</a></li>
<li id="jsProjectType"><a href="#">JS</a></li>
</ul> </ul>
</div> </div>
<legend class="uk-legend">Licenses</legend> <legend class="uk-legend">Licenses</legend>
<div id="licensesListDiv" class="uk-padding-small"> <div id="licensesListDiv" class="uk-padding-small"></div>
<!-- <div class="uk-margin uk-width-1-1">-->
<!-- <input id="searchFilterInput" class="uk-input uk-width-expand" type="text" placeholder="License search filter">-->
<!-- </div>-->
<!-- <button class="uk-button uk-button-primary">Add empty license</button>-->
</div>
<legend class="uk-legend">Project information</legend> <legend class="uk-legend">Project information</legend>
@@ -57,7 +54,15 @@
</div> </div>
<div class="uk-margin"> <div class="uk-margin">
<label><input id="includeGpgSignToggle" class="uk-checkbox" type="checkbox" checked> Include GPG Signing</label> <label>GPG Signing</label>
<div class="uk-padding-small">
<ul class="uk-subnav uk-subnav-pill">
<li id="disableGpgSigning" class="uk-active" uk-tooltip="title: Signing will not be added"><a href="#">Disabled</a></li>
<li id="optionalGpgSigning" uk-tooltip="title: Signing will be added, but disabled in case of absence 'signatory.keyId'"><a href="#">Optional</a></li>
<li id="enableGpgSigning" uk-tooltip="title: Signing will be always enabled"><a href="#">Enabled</a></li>
</ul>
</div>
</div> </div>
<div class="uk-margin"> <div class="uk-margin">
<label><input id="includeMavenCentralTargetRepoToggle" class="uk-checkbox" type="checkbox"> Include publication to MavenCentral</label> <label><input id="includeMavenCentralTargetRepoToggle" class="uk-checkbox" type="checkbox"> Include publication to MavenCentral</label>
@@ -77,4 +82,4 @@
<!-- Internal JS --> <!-- Internal JS -->
<script src="kmppscriptbuilder.web.js"></script> <script src="kmppscriptbuilder.web.js"></script>
</body> </body>
</html> </html>