Compare commits

...

13 Commits

22 changed files with 228 additions and 73 deletions

View File

@@ -1,17 +0,0 @@
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

@@ -19,12 +19,12 @@ jobs:
- name: Set version from gradle.properties
run: echo "version=` cat gradle.properties | grep ^version= | grep -o [\\.0-9]* `" >> $GITHUB_ENV
- name: Build
run: ./gradlew build packageUberJarForCurrentOS
run: ./gradlew build packageReleaseUberJarForCurrentOS
- name: Publish Web
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./web/build/distributions
publish_dir: ./core/build/distributions
publish_branch: site
- name: Create Release
id: create_release
@@ -38,12 +38,12 @@ jobs:
draft: false
prerelease: true
- name: Upload Ubuntu Release Asset
id: upload-ubuntu-release-asset
id: upload-ubuntu-release-asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps
asset_path: "./desktop/build/compose/jars/kmppscriptbuilder.desktop-linux-x64-${{ env.version }}${{ env.additional_version }}.jar"
upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps
asset_path: "./core/build/compose/jars/kmppscriptbuilder.core-linux-x64-${{ env.version }}${{ env.additional_version }}.jar"
asset_name: KotlinPublicationScriptsBuilder-linux-x64.jar
asset_content_type: application/java-archive

View File

@@ -20,6 +20,12 @@ if (project.hasProperty("signing.gnupg.keyName")) {
dependsOn(it)
}
}
// Workaround to make android sign operations depend on signing tasks
project.getTasks().withType(AbstractPublishToMaven.class).configureEach {
def signingTasks = project.getTasks().withType(Sign.class)
mustRunAfter(signingTasks)
}
}
"""
GpgSigning.Enabled ->

View File

@@ -7,13 +7,13 @@ fun MavenConfig.buildJsOnlyMavenConfig(licenses: List<License>): String = """
apply plugin: 'maven-publish'
task javadocJar(type: Jar) {
classifier = 'javadoc'
archiveClassifier = 'javadoc'
}
task sourcesJar(type: Jar) {
kotlin.sourceSets.all {
from(kotlin)
}
classifier = 'sources'
archiveClassifier = 'sources'
}
publishing {

View File

@@ -7,7 +7,7 @@ fun MavenConfig.buildMultiplatformMavenConfig(licenses: List<License>): String =
apply plugin: 'maven-publish'
task javadocsJar(type: Jar) {
classifier = 'javadoc'
archiveClassifier = 'javadoc'
}
publishing {

View File

@@ -33,13 +33,10 @@ data class MavenPublishingRepository(
val name: String,
val url: String,
val credsType: CredentialsType = CredentialsType.UsernameAndPassword(
"${name.uppercase()}_USER",
"${name.uppercase()}_PASSWORD"
CredentialsType.UsernameAndPassword.defaultUsernameProperty(name),
CredentialsType.UsernameAndPassword.defaultPasswordProperty(name),
)
) {
val defaultUsernameProperty = "${name.uppercase()}_USER"
val defaultPasswordProperty = "${name.uppercase()}_PASSWORD"
val defaultHeaderValueProperty = "${name.uppercase()}_TOKEN"
@Serializable
sealed interface CredentialsType {
@@ -53,6 +50,11 @@ data class MavenPublishingRepository(
val usernameProperty: String,
val passwordProperty: String
): CredentialsType {
constructor(baseParameter: String) : this(
defaultUsernameProperty(baseParameter),
defaultPasswordProperty(baseParameter)
)
override fun buildCheckPart(): String = "(project.hasProperty('${usernameProperty}') || System.getenv('${usernameProperty}') != null) && (project.hasProperty('${passwordProperty}') || System.getenv('${passwordProperty}') != null)"
override fun buildCredsPart(): String {
return """
@@ -62,6 +64,15 @@ return """
}
"""
}
companion object {
fun defaultUsernameProperty(name: String): String {
return "${name.uppercase()}_USER"
}
fun defaultPasswordProperty(name: String): String {
return "${name.uppercase()}_PASSWORD"
}
}
}
@Serializable
data class HttpHeaderCredentials(
@@ -75,8 +86,18 @@ return """
name = "$headerName"
value = project.hasProperty('${headerValueProperty}') ? project.property('${headerValueProperty}') : System.getenv('${headerValueProperty}')
}
authentication {
header(HttpHeaderAuthentication)
}
"""
}
companion object {
fun defaultValueProperty(name: String): String {
return "${name.uppercase()}_TOKEN"
}
}
}
fun buildCheckPart(): String

View File

@@ -5,7 +5,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import dev.inmo.kmppscriptbuilder.core.models.Config
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultBox
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultContentColumn
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultDivider
@Composable
@@ -45,7 +45,7 @@ class BuilderView : View() {
config = it
}
DefaultBox {
DefaultContentColumn {
projectTypeView.build()
DefaultDivider()
licensesView.build()

View File

@@ -7,7 +7,6 @@ import androidx.compose.runtime.setValue
import dev.inmo.kmppscriptbuilder.core.models.Developer
import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonText
import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonTextField
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultBox
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultSmallVerticalMargin
class DeveloperState(

View File

@@ -3,23 +3,32 @@ package dev.inmo.kmppscriptbuilder.core.ui
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository
import dev.inmo.kmppscriptbuilder.core.ui.utils.ButtonsPanel
import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonText
import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonTextField
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultContentColumn
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultSmallVerticalMargin
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
class RepositoryState(
name: String = "",
url: String = ""
url: String = "",
credsType: MavenPublishingRepository.CredentialsType = MavenPublishingRepository.CredentialsType.UsernameAndPassword(name)
) {
var name: String by mutableStateOf(name)
var url: String by mutableStateOf(url)
var credsType by mutableStateOf(credsType)
fun toRepository() = MavenPublishingRepository(name, url)
fun toRepository() = MavenPublishingRepository(name, url, credsType)
}
private fun MavenPublishingRepository.toRepositoryState() = RepositoryState(name, url)
private fun MavenPublishingRepository.toRepositoryState() = RepositoryState(name, url, credsType)
expect class RepositoryCredentialTypeDrawer : Drawer<MavenPublishingRepository.CredentialsType>
expect fun RepositoryCredentialTypeDrawerWithState(repositoryState: RepositoryState): RepositoryCredentialTypeDrawer
class RepositoriesView : ListView<RepositoryState>("Repositories info") {
var repositories: List<MavenPublishingRepository>
@@ -38,17 +47,96 @@ class RepositoriesView : ListView<RepositoryState>("Repositories info") {
@Composable
override fun buildView(item: RepositoryState) {
val credsTypesDrawer = remember {
RepositoryCredentialTypeDrawerWithState(item)
}
CommonText("Repository name")
CommonTextField(
item.name,
"This name will be used to identify repository in gradle"
) { item.name = it }
) {
val previous = item.name
item.name = it
when (val currentCredsType = item.credsType) {
is MavenPublishingRepository.CredentialsType.HttpHeaderCredentials -> {
if (MavenPublishingRepository.CredentialsType.HttpHeaderCredentials.defaultValueProperty(previous) == currentCredsType.headerValueProperty) {
item.credsType = currentCredsType.copy(
headerValueProperty = MavenPublishingRepository.CredentialsType.HttpHeaderCredentials.defaultValueProperty(it)
)
}
}
MavenPublishingRepository.CredentialsType.Nothing -> {}
is MavenPublishingRepository.CredentialsType.UsernameAndPassword -> {
var current: MavenPublishingRepository.CredentialsType.UsernameAndPassword = currentCredsType
if (MavenPublishingRepository.CredentialsType.UsernameAndPassword.defaultUsernameProperty(previous) == currentCredsType.usernameProperty) {
current = current.copy(
usernameProperty = MavenPublishingRepository.CredentialsType.UsernameAndPassword.defaultUsernameProperty(it)
)
}
if (MavenPublishingRepository.CredentialsType.UsernameAndPassword.defaultPasswordProperty(previous) == currentCredsType.passwordProperty) {
current = current.copy(
passwordProperty = MavenPublishingRepository.CredentialsType.UsernameAndPassword.defaultPasswordProperty(it)
)
}
item.credsType = current
}
}
}
DefaultSmallVerticalMargin()
CommonText("Repository url")
CommonTextField(
item.url,
"For example: https://repo.maven.apache.org/maven2/"
) { item.url = it }
ButtonsPanel(
"Credentials type",
MavenPublishingRepository.CredentialsType.Nothing.takeIf { item.credsType != it } ?: item.credsType,
MavenPublishingRepository.CredentialsType.UsernameAndPassword(item.name).takeIf { item.credsType !is MavenPublishingRepository.CredentialsType.UsernameAndPassword } ?: item.credsType,
MavenPublishingRepository.CredentialsType.HttpHeaderCredentials(
"Authorization",
MavenPublishingRepository.CredentialsType.HttpHeaderCredentials.defaultValueProperty(item.name)
).takeIf { item.credsType !is MavenPublishingRepository.CredentialsType.HttpHeaderCredentials } ?: item.credsType,
) {
with(credsTypesDrawer) {
with(it) {
draw()
}
}
}
DefaultContentColumn {
when (val credsType = item.credsType) {
is MavenPublishingRepository.CredentialsType.HttpHeaderCredentials -> {
CommonText("Header name")
CommonTextField(credsType.headerName) {
item.credsType = credsType.copy(headerName = it)
}
DefaultSmallVerticalMargin()
CommonText("Property name")
CommonTextField(credsType.headerValueProperty) {
item.credsType = credsType.copy(headerValueProperty = it)
}
}
MavenPublishingRepository.CredentialsType.Nothing -> {
CommonText("No parameters for absence of credentials")
}
is MavenPublishingRepository.CredentialsType.UsernameAndPassword -> {
CommonText("Username property name")
CommonTextField(credsType.usernameProperty) {
item.credsType = credsType.copy(usernameProperty = it)
}
DefaultSmallVerticalMargin()
CommonText("Password property name")
CommonTextField(credsType.passwordProperty) {
item.credsType = credsType.copy(passwordProperty = it)
}
}
}
}
}
}

View File

@@ -1,13 +1,13 @@
package dev.inmo.kmppscriptbuilder.core.ui
import androidx.compose.runtime.Composable
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultBox
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultContentColumn
abstract class VerticalView(protected val title: String) : View() {
abstract val content: @Composable () -> Unit
@Composable
override fun build() {
DefaultBox {
DefaultContentColumn {
DrawVertically(title, content)
}
}

View File

@@ -46,4 +46,4 @@ expect fun DefaultDivider()
expect fun DefaultSmallVerticalMargin()
@Composable
expect fun DefaultBox(block: @Composable () -> Unit)
expect fun DefaultContentColumn(block: @Composable () -> Unit)

View File

@@ -5,17 +5,15 @@ import dev.inmo.jsuikit.elements.DefaultButton
import dev.inmo.jsuikit.modifiers.UIKitButton
import dev.inmo.jsuikit.modifiers.UIKitMargin
import dev.inmo.jsuikit.modifiers.UIKitUtility
import dev.inmo.jsuikit.modifiers.builder
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultBox
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultContentColumn
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
import dev.inmo.kmppscriptbuilder.core.ui.utils.NoTransform
import org.jetbrains.compose.web.dom.Div
actual class ListViewDrawer<T> : Drawer<ListView<T>> {
@Composable
override fun ListView<T>.draw() {
itemsList.forEach { item ->
DefaultBox {
DefaultContentColumn {
buildView(item)
DefaultButton(removeItemText, UIKitButton.Type.Default, UIKitMargin.Small, UIKitUtility.NoTransform, UIKitUtility.Border.Rounded) {
itemsList.remove(item)

View File

@@ -0,0 +1,32 @@
package dev.inmo.kmppscriptbuilder.core.ui
import androidx.compose.runtime.Composable
import dev.inmo.jsuikit.elements.DefaultButton
import dev.inmo.jsuikit.modifiers.UIKitButton
import dev.inmo.jsuikit.modifiers.UIKitMargin
import dev.inmo.jsuikit.modifiers.UIKitUtility
import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
import dev.inmo.kmppscriptbuilder.core.ui.utils.NoTransform
actual class RepositoryCredentialTypeDrawer(
private val state: RepositoryState
) : Drawer<MavenPublishingRepository.CredentialsType> {
@Composable
override fun MavenPublishingRepository.CredentialsType.draw() {
val name = when (this@draw) {
is MavenPublishingRepository.CredentialsType.HttpHeaderCredentials -> "Headers"
MavenPublishingRepository.CredentialsType.Nothing -> "No"
is MavenPublishingRepository.CredentialsType.UsernameAndPassword -> "Username and password"
}
if (state.credsType == this) {
DefaultButton(name, UIKitButton.Type.Primary, UIKitButton.Size.Small, UIKitMargin.Small.Horizontal, UIKitUtility.NoTransform, UIKitUtility.Border.Rounded)
} else {
DefaultButton(name, UIKitButton.Type.Default, UIKitButton.Size.Small, UIKitMargin.Small.Horizontal, UIKitUtility.NoTransform, UIKitUtility.Border.Rounded) {
state.credsType = this
}
}
}
}
actual fun RepositoryCredentialTypeDrawerWithState(repositoryState: RepositoryState): RepositoryCredentialTypeDrawer = RepositoryCredentialTypeDrawer(repositoryState)

View File

@@ -121,7 +121,7 @@ actual fun DefaultSmallVerticalMargin() {
}
@Composable
actual fun DefaultBox(block: @Composable () -> Unit) {
actual fun DefaultContentColumn(block: @Composable () -> Unit) {
Div(attrsBuilder(UIKitMargin.Small.Horizontal, UIKitMargin.Small.Vertical)) {
block()
}

View File

@@ -1,6 +1,5 @@
package dev.inmo.kmppscriptbuilder.core.ui
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.OutlinedButton
@@ -8,14 +7,14 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import dev.inmo.kmppscriptbuilder.core.ui.utils.CommonText
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultBox
import dev.inmo.kmppscriptbuilder.core.ui.utils.DefaultContentColumn
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
actual class ListViewDrawer<T> : Drawer<ListView<T>> {
@Composable
override fun ListView<T>.draw() {
itemsList.forEach { item ->
DefaultBox {
DefaultContentColumn {
buildView(item)
OutlinedButton({ itemsList.remove(item) }, Modifier.padding(8.dp)) {
CommonText(removeItemText,)

View File

@@ -0,0 +1,40 @@
package dev.inmo.kmppscriptbuilder.core.ui
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.OutlinedButton
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import dev.inmo.kmppscriptbuilder.core.models.MavenPublishingRepository
import dev.inmo.kmppscriptbuilder.core.ui.utils.Drawer
actual class RepositoryCredentialTypeDrawer(
private val state: RepositoryState
) : Drawer<MavenPublishingRepository.CredentialsType> {
@Composable
override fun MavenPublishingRepository.CredentialsType.draw() {
val name = when (this@draw) {
is MavenPublishingRepository.CredentialsType.HttpHeaderCredentials -> "Headers"
MavenPublishingRepository.CredentialsType.Nothing -> "No"
is MavenPublishingRepository.CredentialsType.UsernameAndPassword -> "Username and password"
}
if (state.credsType == this) {
Button({}, Modifier.padding(8.dp, 0.dp)) {
Text(name)
}
} else {
OutlinedButton(
{
state.credsType = this
},
Modifier.padding(8.dp, 0.dp)
) {
Text(name)
}
}
}
}
actual fun RepositoryCredentialTypeDrawerWithState(repositoryState: RepositoryState): RepositoryCredentialTypeDrawer = RepositoryCredentialTypeDrawer(repositoryState)

View File

@@ -87,7 +87,8 @@ actual fun TitleText(text: String) {
actual fun <T> ButtonsPanel(
title: String,
data: Iterable<T>,
itemDrawer: @Composable (T) -> Unit) {
itemDrawer: @Composable (T) -> Unit
) {
Row {
Text(title, Modifier.padding(8.dp))
data.forEach { itemDrawer(it) }
@@ -105,7 +106,7 @@ actual fun DefaultSmallVerticalMargin() {
}
@Composable
actual fun DefaultBox(block: @Composable () -> Unit) {
actual fun DefaultContentColumn(block: @Composable () -> Unit) {
Column(Modifier.padding(8.dp)) {
block()
}

View File

@@ -4,18 +4,6 @@ kotlin.js.generate.externals=true
kotlin.incremental=true
kotlin.incremental.js=true
kotlin_version=1.7.20
kotlin_coroutines_version=1.6.4
kotlin_serialisation_core_version=1.4.1
ktor_version=2.1.3
micro_utils_version=0.14.2
compose_version=1.2.1
# Dokka
dokka_version=1.7.20
# Project data
group=dev.inmo

View File

@@ -1,15 +1,15 @@
[versions]
kt = "1.7.20"
kt-serialization = "1.4.1"
kt-coroutines = "1.6.4"
kt = "1.9.20"
kt-serialization = "1.6.0"
kt-coroutines = "1.7.3"
jb-compose = "1.2.1"
jb-dokka = "1.7.20"
microutils = "0.14.2"
kjsuikit = "0.4.1"
jb-compose = "1.5.10"
jb-dokka = "1.9.10"
microutils = "0.20.11"
kjsuikit = "0.7.2"
ktor = "2.1.3"
ktor = "2.3.5"
gh-release = "2.4.1"

View File

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

View File

@@ -13,7 +13,7 @@ kotlin {
commonMain {
dependencies {
implementation kotlin('stdlib')
api "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlin_serialisation_core_version"
api libs.kt.serialization
}
}
commonTest {

View File

@@ -14,7 +14,7 @@ kotlin {
commonMain {
dependencies {
implementation kotlin('stdlib')
api "org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlin_serialisation_core_version"
api libs.kt.serialization
}
}
commonTest {