Maxim Pestryakov
1 week ago
committed by
GitHub
66 changed files with 739 additions and 665 deletions
@ -1,78 +0,0 @@ |
|||||||
plugins { |
|
||||||
kotlin("jvm") version "1.5.30" apply false |
|
||||||
id("com.github.johnrengelman.shadow") version "7.1.0" apply false |
|
||||||
} |
|
||||||
|
|
||||||
subprojects { |
|
||||||
group = "org.jetbrains.compose.internal.build-helpers" |
|
||||||
version = project.property("deploy.version") as String |
|
||||||
|
|
||||||
repositories { |
|
||||||
mavenCentral() |
|
||||||
} |
|
||||||
|
|
||||||
plugins.withType(JavaBasePlugin::class.java) { |
|
||||||
afterEvaluate { |
|
||||||
configureIfExists<JavaPluginExtension> { |
|
||||||
sourceCompatibility = JavaVersion.VERSION_1_8 |
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8 |
|
||||||
if (sourceSets.names.contains(SourceSet.MAIN_SOURCE_SET_NAME)) { |
|
||||||
withJavadocJar() |
|
||||||
withSourcesJar() |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
plugins.withId("maven-publish") { |
|
||||||
configureIfExists<PublishingExtension> { |
|
||||||
configurePublishing(project) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
fun PublishingExtension.configurePublishing(project: Project) { |
|
||||||
repositories { |
|
||||||
configureEach { |
|
||||||
val repoName = name |
|
||||||
project.tasks.register("publishTo${repoName}") { |
|
||||||
group = "publishing" |
|
||||||
dependsOn(project.tasks.named("publishAllPublicationsTo${repoName}Repository")) |
|
||||||
} |
|
||||||
} |
|
||||||
maven { |
|
||||||
name = "BuildRepo" |
|
||||||
url = uri("${rootProject.buildDir}/repo") |
|
||||||
} |
|
||||||
maven { |
|
||||||
name = "ComposeInternalRepo" |
|
||||||
url = uri( |
|
||||||
System.getenv("COMPOSE_INTERNAL_REPO_URL") |
|
||||||
?: "https://maven.pkg.jetbrains.space/public/p/compose/internal" |
|
||||||
) |
|
||||||
credentials { |
|
||||||
username = |
|
||||||
System.getenv("COMPOSE_INTERNAL_REPO_USERNAME") |
|
||||||
?: System.getenv("COMPOSE_REPO_USERNAME") |
|
||||||
?: "" |
|
||||||
password = |
|
||||||
System.getenv("COMPOSE_INTERNAL_REPO_KEY") |
|
||||||
?: System.getenv("COMPOSE_REPO_KEY") |
|
||||||
?: "" |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
publications { |
|
||||||
create<MavenPublication>("main") { |
|
||||||
groupId = project.group.toString() |
|
||||||
artifactId = project.name |
|
||||||
version = project.version.toString() |
|
||||||
|
|
||||||
from(project.components["java"]) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
inline fun <reified T> Project.configureIfExists(fn: T.() -> Unit) { |
|
||||||
extensions.findByType(T::class.java)?.fn() |
|
||||||
} |
|
@ -1,51 +0,0 @@ |
|||||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar |
|
||||||
import org.gradle.kotlin.dsl.gradleKotlinDsl |
|
||||||
|
|
||||||
plugins { |
|
||||||
`java` |
|
||||||
`maven-publish` |
|
||||||
`java-gradle-plugin` |
|
||||||
id("org.jetbrains.kotlin.jvm") |
|
||||||
id("com.github.johnrengelman.shadow") apply false |
|
||||||
} |
|
||||||
|
|
||||||
repositories { |
|
||||||
maven("https://maven.pkg.jetbrains.space/public/p/space/maven") |
|
||||||
} |
|
||||||
|
|
||||||
val embeddedDependencies by configurations.creating { isTransitive = false } |
|
||||||
dependencies { |
|
||||||
compileOnly(gradleApi()) |
|
||||||
compileOnly(gradleKotlinDsl()) |
|
||||||
compileOnly(kotlin("stdlib")) |
|
||||||
|
|
||||||
fun embedded(dep: String) { |
|
||||||
compileOnly(dep) |
|
||||||
embeddedDependencies(dep) |
|
||||||
} |
|
||||||
|
|
||||||
val jacksonVersion = "2.12.5" |
|
||||||
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:$jacksonVersion") |
|
||||||
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion") |
|
||||||
implementation("io.ktor:ktor-client-okhttp:1.6.4") |
|
||||||
implementation("org.apache.tika:tika-parsers:1.24.1") |
|
||||||
implementation("org.jsoup:jsoup:1.14.3") |
|
||||||
implementation("org.jetbrains:space-sdk-jvm:83821-beta") |
|
||||||
embedded("de.undercouch:gradle-download-task:4.1.2") |
|
||||||
} |
|
||||||
|
|
||||||
val shadowJar by tasks.registering(ShadowJar::class) { |
|
||||||
val fromPackage = "de.undercouch" |
|
||||||
val toPackage = "org.jetbrains.compose.internal.publishing.$fromPackage" |
|
||||||
relocate(fromPackage, toPackage) |
|
||||||
archiveClassifier.set("shadow") |
|
||||||
configurations = listOf(embeddedDependencies) |
|
||||||
from(sourceSets["main"]!!.output) |
|
||||||
exclude("META-INF/gradle-plugins/de.undercouch.download.properties") |
|
||||||
} |
|
||||||
|
|
||||||
val jar = tasks.named<Jar>("jar") { |
|
||||||
dependsOn(shadowJar) |
|
||||||
from(zipTree(shadowJar.get().archiveFile)) |
|
||||||
this.duplicatesStrategy = DuplicatesStrategy.INCLUDE |
|
||||||
} |
|
@ -0,0 +1,74 @@ |
|||||||
|
import org.jetbrains.compose.internal.publishing.* |
||||||
|
|
||||||
|
plugins { |
||||||
|
signing |
||||||
|
} |
||||||
|
|
||||||
|
val mavenCentral = MavenCentralProperties(project) |
||||||
|
if (mavenCentral.signArtifacts) { |
||||||
|
signing.useInMemoryPgpKeys( |
||||||
|
mavenCentral.signArtifactsKey.get(), |
||||||
|
mavenCentral.signArtifactsPassword.get() |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
val publishingDir = project.layout.buildDirectory.dir("publishing") |
||||||
|
val originalArtifactsRoot = publishingDir.map { it.dir("original") } |
||||||
|
val preparedArtifactsRoot = publishingDir.map { it.dir("prepared") } |
||||||
|
val modulesFile = publishingDir.map { it.file("modules.txt") } |
||||||
|
|
||||||
|
val findComposeModules by tasks.registering(FindModulesInSpaceTask::class) { |
||||||
|
requestedCoordinates.set(mavenCentral.coordinates) |
||||||
|
spaceInstanceUrl.set("https://public.jetbrains.space") |
||||||
|
spaceClientId.set(System.getenv("COMPOSE_REPO_USERNAME") ?: "") |
||||||
|
spaceClientSecret.set(System.getenv("COMPOSE_REPO_KEY") ?: "") |
||||||
|
spaceProjectId.set(System.getenv("COMPOSE_DEV_REPO_PROJECT_ID") ?: "") |
||||||
|
spaceRepoId.set(System.getenv("COMPOSE_DEV_REPO_REPO_ID") ?: "") |
||||||
|
modulesTxtFile.set(modulesFile) |
||||||
|
} |
||||||
|
|
||||||
|
val downloadArtifactsFromComposeDev by tasks.registering(DownloadFromSpaceMavenRepoTask::class) { |
||||||
|
dependsOn(findComposeModules) |
||||||
|
modulesToDownload.set(project.provider { |
||||||
|
readComposeModules( |
||||||
|
modulesFile, |
||||||
|
originalArtifactsRoot |
||||||
|
) |
||||||
|
}) |
||||||
|
spaceRepoUrl.set("https://maven.pkg.jetbrains.space/public/p/compose/dev") |
||||||
|
} |
||||||
|
|
||||||
|
val fixModulesBeforePublishing by tasks.registering(FixModulesBeforePublishingTask::class) { |
||||||
|
dependsOn(downloadArtifactsFromComposeDev) |
||||||
|
inputRepoDir.set(originalArtifactsRoot) |
||||||
|
outputRepoDir.set(preparedArtifactsRoot) |
||||||
|
} |
||||||
|
|
||||||
|
val reuploadArtifactsToMavenCentral by tasks.registering(UploadToSonatypeTask::class) { |
||||||
|
dependsOn(fixModulesBeforePublishing) |
||||||
|
|
||||||
|
modulesToUpload.set(project.provider { readComposeModules(modulesFile, preparedArtifactsRoot) }) |
||||||
|
|
||||||
|
sonatypeServer.set("https://oss.sonatype.org") |
||||||
|
user.set(mavenCentral.user) |
||||||
|
password.set(mavenCentral.password) |
||||||
|
autoCommitOnSuccess.set(mavenCentral.autoCommitOnSuccess) |
||||||
|
stagingProfileName.set(mavenCentral.stage) |
||||||
|
stagingDescription.set(mavenCentral.description) |
||||||
|
} |
||||||
|
|
||||||
|
fun readComposeModules( |
||||||
|
modulesFile: Provider<out FileSystemLocation>, |
||||||
|
repoRoot: Provider<out FileSystemLocation> |
||||||
|
): List<ModuleToUpload> = |
||||||
|
modulesFile.get().asFile.readLines() |
||||||
|
.filter { it.isNotBlank() } |
||||||
|
.map { line -> |
||||||
|
val (group, artifact, version) = line.split(":") |
||||||
|
ModuleToUpload( |
||||||
|
groupId = group, |
||||||
|
artifactId = artifact, |
||||||
|
version = version, |
||||||
|
localDir = repoRoot.get().asFile.resolve("$group/$artifact/$version") |
||||||
|
) |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
import org.gradle.kotlin.dsl.gradleKotlinDsl |
||||||
|
|
||||||
|
plugins { |
||||||
|
`java` |
||||||
|
`java-gradle-plugin` |
||||||
|
kotlin("jvm") version "1.9.24" |
||||||
|
} |
||||||
|
|
||||||
|
repositories { |
||||||
|
mavenCentral() |
||||||
|
maven("https://maven.pkg.jetbrains.space/public/p/space/maven") |
||||||
|
} |
||||||
|
|
||||||
|
dependencies { |
||||||
|
compileOnly(gradleApi()) |
||||||
|
compileOnly(gradleKotlinDsl()) |
||||||
|
|
||||||
|
val jacksonVersion = "2.12.5" |
||||||
|
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:$jacksonVersion") |
||||||
|
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonVersion") |
||||||
|
implementation("io.ktor:ktor-client-okhttp:1.6.4") |
||||||
|
implementation("org.apache.tika:tika-parsers:1.24.1") |
||||||
|
implementation("org.jsoup:jsoup:1.14.3") |
||||||
|
implementation("org.jetbrains:space-sdk-jvm:83821-beta") |
||||||
|
implementation("de.undercouch:gradle-download-task:4.1.2") |
||||||
|
} |
@ -1,5 +1,5 @@ |
|||||||
distributionBase=GRADLE_USER_HOME |
distributionBase=GRADLE_USER_HOME |
||||||
distributionPath=wrapper/dists |
distributionPath=wrapper/dists |
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip |
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip |
||||||
zipStoreBase=GRADLE_USER_HOME |
zipStoreBase=GRADLE_USER_HOME |
||||||
zipStorePath=wrapper/dists |
zipStorePath=wrapper/dists |
Binary file not shown.
@ -0,0 +1,181 @@ |
|||||||
|
package org.jetbrains.compose.resources |
||||||
|
|
||||||
|
import kotlin.test.Test |
||||||
|
import kotlin.test.assertEquals |
||||||
|
import kotlin.test.assertFailsWith |
||||||
|
|
||||||
|
class StringFormatTest { |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs replaces placeholders with corresponding arguments`() { |
||||||
|
val template = "Hello %1\$s, you have %2\$d new messages!" |
||||||
|
val args = listOf("Alice", "5") |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
assertEquals("Hello Alice, you have 5 new messages!", result) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs works with multiple placeholders referring to the same argument`() { |
||||||
|
val template = "%1\$s and %1\$s are best friends!" |
||||||
|
val args = listOf("Alice") |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
assertEquals("Alice and Alice are best friends!", result) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs works when placeholders are out of order`() { |
||||||
|
val template = "Order: %2\$s comes after %1\$s" |
||||||
|
val args = listOf("Alice", "Bob") |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
assertEquals("Order: Bob comes after Alice", result) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs works when there are no placeholders`() { |
||||||
|
val template = "No placeholders here!" |
||||||
|
val args = emptyList<String>() |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
assertEquals("No placeholders here!", result) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs throws exception when placeholders index is out of bounds`() { |
||||||
|
val template = "Hello %1\$s, %2\$s!" |
||||||
|
val args = listOf("Alice") |
||||||
|
|
||||||
|
assertFailsWith<IndexOutOfBoundsException> { |
||||||
|
template.replaceWithArgs(args) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs handles empty string template`() { |
||||||
|
val template = "" |
||||||
|
val args = listOf("Alice", "5") |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
assertEquals("", result) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs handles templates with no matching args`() { |
||||||
|
val template = "Hello %1\$s, you have %3\$s messages" |
||||||
|
val args = listOf("Alice") |
||||||
|
|
||||||
|
assertFailsWith<IndexOutOfBoundsException> { |
||||||
|
template.replaceWithArgs(args) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs replaces multiple placeholders of the same index`() { |
||||||
|
val template = "Repeat: %1\$s, %1\$s, and again %1\$s!" |
||||||
|
val args = listOf("Echo") |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
assertEquals("Repeat: Echo, Echo, and again Echo!", result) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs ensures %d and %s placeholders behave identically`() { |
||||||
|
val template = "%1\$d, %1\$s, %2\$d, %2\$s" |
||||||
|
val args = listOf("42", "hello") |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
assertEquals("42, 42, hello, hello", result) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs handles 15 arguments correctly`() { |
||||||
|
val template = "%1\$s, %2\$s, %3\$s, %4\$s, %5\$s, %6\$s, %7\$s, %8\$s, %9\$s, %10\$s, %11\$s, %12\$s, %13\$s, %14\$s, %15\$s!" |
||||||
|
val args = listOf( |
||||||
|
"arg1", "arg2", "arg3", "arg4", "arg5", |
||||||
|
"arg6", "arg7", "arg8", "arg9", "arg10", |
||||||
|
"arg11", "arg12", "arg13", "arg14", "arg15" |
||||||
|
) |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
assertEquals( |
||||||
|
"arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15!", |
||||||
|
result |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs throws exception for template with missing argument index`() { |
||||||
|
val template = "Hello %${'$'}s, how are you?" |
||||||
|
val args = listOf("Alice") |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
// Since the template doesn't properly specify a valid index (e.g., %1$s), it will replace nothing. |
||||||
|
assertEquals("Hello %${'$'}s, how are you?", result) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs does not replace invalid placeholders`() { |
||||||
|
val template = "Hello %1\$x, how are you?" |
||||||
|
val args = listOf("Alice") |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
// %1$x is not a valid placeholder, so the template should remain unchanged |
||||||
|
assertEquals("Hello %1\$x, how are you?", result) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs throws exception for missing arguments`() { |
||||||
|
val template = "Hello %1\$s, you have %2\$d messages!" |
||||||
|
val args = listOf("Alice") |
||||||
|
|
||||||
|
// An exception should be thrown because the second argument (%2$d) is missing |
||||||
|
assertFailsWith<IndexOutOfBoundsException> { |
||||||
|
template.replaceWithArgs(args) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs throws exception for unmatched placeholders`() { |
||||||
|
val template = "Hello %1\$s, your rank is %3\$s" |
||||||
|
val args = listOf("Alice", "1") |
||||||
|
|
||||||
|
// The template has a %3$s placeholder, but there is no third argument |
||||||
|
assertFailsWith<IndexOutOfBoundsException> { |
||||||
|
template.replaceWithArgs(args) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs handles templates with invalid format`() { |
||||||
|
val template = "This is %1\$" |
||||||
|
val args = listOf("test") |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
// The incomplete placeholder %1$ will not be replaced |
||||||
|
assertEquals("This is %1\$", result) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `replaceWithArgs ignores extra arguments`() { |
||||||
|
val template = "Hello %1\$s!" |
||||||
|
val args = listOf("Alice", "ExtraData1", "ExtraData2") |
||||||
|
|
||||||
|
val result = template.replaceWithArgs(args) |
||||||
|
|
||||||
|
// Only the first argument should be used, ignoring the rest |
||||||
|
assertEquals("Hello Alice!", result) |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
package org.jetbrains.compose.resources |
||||||
|
|
||||||
|
import androidx.compose.ui.text.font.FontVariation |
||||||
|
import kotlin.test.Test |
||||||
|
import kotlin.test.assertEquals |
||||||
|
import kotlin.test.assertFailsWith |
||||||
|
|
||||||
|
class VariationFontCacheTest { |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `getCacheKey should return an empty string for an empty settings list`() { |
||||||
|
val settings = FontVariation.Settings() |
||||||
|
val cacheKey = settings.getCacheKey() |
||||||
|
assertEquals("", cacheKey, "Cache key for empty settings list should be an empty string") |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `getCacheKey should return a correct key for a single setting`() { |
||||||
|
val setting = FontVariation.Setting("wght", 700f) |
||||||
|
val settings = FontVariation.Settings(setting) |
||||||
|
val cacheKey = settings.getCacheKey() |
||||||
|
assertEquals("SettingFloat(wght,700.0)", cacheKey, "Cache key for a single setting is incorrect") |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `getCacheKey should correctly sort settings by class name and axis name`() { |
||||||
|
val setting1 = FontVariation.Setting("wght", 400f) |
||||||
|
val setting2 = FontVariation.Setting("ital", 1f) |
||||||
|
val settings = FontVariation.Settings(setting1, setting2) |
||||||
|
val cacheKey = settings.getCacheKey() |
||||||
|
assertEquals( |
||||||
|
"SettingFloat(ital,1.0),SettingFloat(wght,400.0)", |
||||||
|
cacheKey, |
||||||
|
"Cache key should sort settings by class name and axis name" |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
fun `getCacheKey should throw an exception when there are duplicate settings`() { |
||||||
|
val setting1 = FontVariation.Setting("wght", 400f) |
||||||
|
val setting2 = FontVariation.Setting("wght", 700f) |
||||||
|
|
||||||
|
assertFailsWith<IllegalArgumentException>( |
||||||
|
"'axis' must be unique" |
||||||
|
) { |
||||||
|
FontVariation.Settings(setting1, setting2) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -1,3 +0,0 @@ |
|||||||
<resources> |
|
||||||
<string name="macOS_str">macOS string</string> |
|
||||||
</resources> |
|
@ -1,10 +0,0 @@ |
|||||||
package me.sample.app |
|
||||||
|
|
||||||
import androidx.compose.runtime.Composable |
|
||||||
import kmpresourcepublication.appmodule.generated.resources.Res |
|
||||||
import kmpresourcepublication.appmodule.generated.resources.macOS_str |
|
||||||
import org.jetbrains.compose.resources.stringResource |
|
||||||
|
|
||||||
@Composable |
|
||||||
actual fun getPlatformSpecificString(): String = |
|
||||||
stringResource(Res.string.macOS_str) |
|
@ -1,32 +0,0 @@ |
|||||||
plugins { |
|
||||||
kotlin("multiplatform") |
|
||||||
kotlin("plugin.compose") |
|
||||||
kotlin("native.cocoapods") |
|
||||||
id("org.jetbrains.compose") |
|
||||||
} |
|
||||||
|
|
||||||
kotlin { |
|
||||||
cocoapods { |
|
||||||
version = "1.0" |
|
||||||
summary = "Some description for a Kotlin/Native module" |
|
||||||
homepage = "Link to a Kotlin/Native module homepage" |
|
||||||
pod("Base64", "1.1.2") |
|
||||||
framework { |
|
||||||
baseName = "shared" |
|
||||||
isStatic = true |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
macosX64() |
|
||||||
macosArm64() |
|
||||||
|
|
||||||
sourceSets { |
|
||||||
commonMain { |
|
||||||
dependencies { |
|
||||||
implementation(compose.runtime) |
|
||||||
implementation(compose.material) |
|
||||||
implementation(compose.components.resources) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,54 +0,0 @@ |
|||||||
Pod::Spec.new do |spec| |
|
||||||
spec.name = 'macosResources' |
|
||||||
spec.version = '1.0' |
|
||||||
spec.homepage = 'Link to a Kotlin/Native module homepage' |
|
||||||
spec.source = { :http=> ''} |
|
||||||
spec.authors = '' |
|
||||||
spec.license = '' |
|
||||||
spec.summary = 'Some description for a Kotlin/Native module' |
|
||||||
spec.vendored_frameworks = 'build/cocoapods/framework/shared.framework' |
|
||||||
spec.libraries = 'c++' |
|
||||||
|
|
||||||
spec.dependency 'Base64', '1.1.2' |
|
||||||
|
|
||||||
if !Dir.exist?('build/cocoapods/framework/shared.framework') || Dir.empty?('build/cocoapods/framework/shared.framework') |
|
||||||
raise " |
|
||||||
|
|
||||||
Kotlin framework 'shared' doesn't exist yet, so a proper Xcode project can't be generated. |
|
||||||
'pod install' should be executed after running ':generateDummyFramework' Gradle task: |
|
||||||
|
|
||||||
./gradlew :generateDummyFramework |
|
||||||
|
|
||||||
Alternatively, proper pod installation is performed during Gradle sync in the IDE (if Podfile location is set)" |
|
||||||
end |
|
||||||
|
|
||||||
spec.xcconfig = { |
|
||||||
'ENABLE_USER_SCRIPT_SANDBOXING' => 'NO', |
|
||||||
} |
|
||||||
|
|
||||||
spec.pod_target_xcconfig = { |
|
||||||
'KOTLIN_PROJECT_PATH' => '', |
|
||||||
'PRODUCT_MODULE_NAME' => 'shared', |
|
||||||
} |
|
||||||
|
|
||||||
spec.script_phases = [ |
|
||||||
{ |
|
||||||
:name => 'Build macosResources', |
|
||||||
:execution_position => :before_compile, |
|
||||||
:shell_path => '/bin/sh', |
|
||||||
:script => <<-SCRIPT |
|
||||||
if [ "YES" = "$OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED" ]; then |
|
||||||
echo "Skipping Gradle build task invocation due to OVERRIDE_KOTLIN_BUILD_IDE_SUPPORTED environment variable set to \"YES\"" |
|
||||||
exit 0 |
|
||||||
fi |
|
||||||
set -ev |
|
||||||
REPO_ROOT="$PODS_TARGET_SRCROOT" |
|
||||||
"$REPO_ROOT/gradlew" -p "$REPO_ROOT" $KOTLIN_PROJECT_PATH:syncFramework \ |
|
||||||
-Pkotlin.native.cocoapods.platform=$PLATFORM_NAME \ |
|
||||||
-Pkotlin.native.cocoapods.archs="$ARCHS" \ |
|
||||||
-Pkotlin.native.cocoapods.configuration="$CONFIGURATION" |
|
||||||
SCRIPT |
|
||||||
} |
|
||||||
] |
|
||||||
spec.resources = ['build/compose/cocoapods/compose-resources'] |
|
||||||
end |
|
@ -1,2 +0,0 @@ |
|||||||
org.gradle.jvmargs=-Xmx8096M |
|
||||||
org.jetbrains.compose.experimental.macos.enabled=true |
|
@ -1,24 +0,0 @@ |
|||||||
rootProject.name = "macosResources" |
|
||||||
pluginManagement { |
|
||||||
repositories { |
|
||||||
mavenLocal() |
|
||||||
gradlePluginPortal() |
|
||||||
google() |
|
||||||
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") |
|
||||||
} |
|
||||||
plugins { |
|
||||||
id("org.jetbrains.kotlin.multiplatform").version("KOTLIN_VERSION_PLACEHOLDER") |
|
||||||
id("org.jetbrains.kotlin.plugin.compose").version("KOTLIN_VERSION_PLACEHOLDER") |
|
||||||
id("org.jetbrains.kotlin.native.cocoapods").version("KOTLIN_VERSION_PLACEHOLDER") |
|
||||||
id("org.jetbrains.compose").version("COMPOSE_GRADLE_PLUGIN_VERSION_PLACEHOLDER") |
|
||||||
} |
|
||||||
} |
|
||||||
dependencyResolutionManagement { |
|
||||||
repositories { |
|
||||||
mavenLocal() |
|
||||||
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") |
|
||||||
mavenCentral() |
|
||||||
gradlePluginPortal() |
|
||||||
google() |
|
||||||
} |
|
||||||
} |
|
@ -1,36 +0,0 @@ |
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" |
|
||||||
android:width="600dp" |
|
||||||
android:height="600dp" |
|
||||||
android:viewportWidth="600" |
|
||||||
android:viewportHeight="600"> |
|
||||||
<path |
|
||||||
android:fillColor="#041619" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M301.21,418.53C300.97,418.54 300.73,418.56 300.49,418.56C297.09,418.59 293.74,417.72 290.79,416.05L222.6,377.54C220.63,376.43 219,374.82 217.85,372.88C216.7,370.94 216.09,368.73 216.07,366.47L216.07,288.16C216.06,287.32 216.09,286.49 216.17,285.67C216.38,283.54 216.91,281.5 217.71,279.6L199.29,268.27L177.74,256.19C175.72,260.43 174.73,265.23 174.78,270.22L174.79,387.05C174.85,393.89 178.57,400.2 184.53,403.56L286.26,461.02C290.67,463.51 295.66,464.8 300.73,464.76C300.91,464.76 301.09,464.74 301.27,464.74C301.24,449.84 301.22,439.23 301.22,439.23L301.21,418.53Z" /> |
|
||||||
<path |
|
||||||
android:fillColor="#37BF6E" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M409.45,242.91L312.64,188.23C303.64,183.15 292.58,183.26 283.68,188.51L187.92,245C183.31,247.73 179.93,251.62 177.75,256.17L177.74,256.19L199.29,268.27L217.71,279.6C217.83,279.32 217.92,279.02 218.05,278.74C218.24,278.36 218.43,277.98 218.64,277.62C219.06,276.88 219.52,276.18 220.04,275.51C221.37,273.8 223.01,272.35 224.87,271.25L289.06,233.39C290.42,232.59 291.87,231.96 293.39,231.51C295.53,230.87 297.77,230.6 300,230.72C302.98,230.88 305.88,231.73 308.47,233.2L373.37,269.85C375.54,271.08 377.49,272.68 379.13,274.57C379.68,275.19 380.18,275.85 380.65,276.53C380.86,276.84 381.05,277.15 381.24,277.47L397.79,266.39L420.34,252.93L420.31,252.88C417.55,248.8 413.77,245.35 409.45,242.91Z" /> |
|
||||||
<path |
|
||||||
android:fillColor="#3870B2" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M381.24,277.47C381.51,277.92 381.77,278.38 382.01,278.84C382.21,279.24 382.39,279.65 382.57,280.06C382.91,280.88 383.19,281.73 383.41,282.59C383.74,283.88 383.92,285.21 383.93,286.57L383.93,361.1C383.96,363.95 383.35,366.77 382.16,369.36C381.93,369.86 381.69,370.35 381.42,370.83C379.75,373.79 377.32,376.27 374.39,378L310.2,415.87C307.47,417.48 304.38,418.39 301.21,418.53L301.22,439.23C301.22,439.23 301.24,449.84 301.27,464.74C306.1,464.61 310.91,463.3 315.21,460.75L410.98,404.25C419.88,399 425.31,389.37 425.22,379.03L425.22,267.85C425.17,262.48 423.34,257.34 420.34,252.93L397.79,266.39L381.24,277.47Z" /> |
|
||||||
<path |
|
||||||
android:fillColor="#00000000" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M177.75,256.17C179.93,251.62 183.31,247.73 187.92,245L283.68,188.51C292.58,183.26 303.64,183.15 312.64,188.23L409.45,242.91C413.77,245.35 417.55,248.8 420.31,252.88L420.34,252.93L498.59,206.19C494.03,199.46 487.79,193.78 480.67,189.75L320.86,99.49C306.01,91.1 287.75,91.27 273.07,99.95L114.99,193.2C107.39,197.69 101.81,204.11 98.21,211.63L177.74,256.19L177.75,256.17ZM301.27,464.74C301.09,464.74 300.91,464.76 300.73,464.76C295.66,464.8 290.67,463.51 286.26,461.02L184.53,403.56C178.57,400.2 174.85,393.89 174.79,387.05L174.78,270.22C174.73,265.23 175.72,260.43 177.74,256.19L98.21,211.63C94.86,218.63 93.23,226.58 93.31,234.82L93.31,427.67C93.42,438.97 99.54,449.37 109.4,454.92L277.31,549.77C284.6,553.88 292.84,556.01 301.2,555.94L301.2,555.8C301.39,543.78 301.33,495.26 301.27,464.74Z" |
|
||||||
android:strokeWidth="10" |
|
||||||
android:strokeColor="#083042" /> |
|
||||||
<path |
|
||||||
android:fillColor="#00000000" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M498.59,206.19L420.34,252.93C423.34,257.34 425.17,262.48 425.22,267.85L425.22,379.03C425.31,389.37 419.88,399 410.98,404.25L315.21,460.75C310.91,463.3 306.1,464.61 301.27,464.74C301.33,495.26 301.39,543.78 301.2,555.8L301.2,555.94C309.48,555.87 317.74,553.68 325.11,549.32L483.18,456.06C497.87,447.39 506.85,431.49 506.69,414.43L506.69,230.91C506.6,222.02 503.57,213.5 498.59,206.19Z" |
|
||||||
android:strokeWidth="10" |
|
||||||
android:strokeColor="#083042" /> |
|
||||||
<path |
|
||||||
android:fillColor="#00000000" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M301.2,555.94C292.84,556.01 284.6,553.88 277.31,549.76L109.4,454.92C99.54,449.37 93.42,438.97 93.31,427.67L93.31,234.82C93.23,226.58 94.86,218.63 98.21,211.63C101.81,204.11 107.39,197.69 114.99,193.2L273.07,99.95C287.75,91.27 306.01,91.1 320.86,99.49L480.67,189.75C487.79,193.78 494.03,199.46 498.59,206.19C503.57,213.5 506.6,222.02 506.69,230.91L506.69,414.43C506.85,431.49 497.87,447.39 483.18,456.06L325.11,549.32C317.74,553.68 309.48,555.87 301.2,555.94Z" |
|
||||||
android:strokeWidth="10" |
|
||||||
android:strokeColor="#083042" /> |
|
||||||
</vector> |
|
@ -1,39 +0,0 @@ |
|||||||
import androidx.compose.animation.AnimatedVisibility |
|
||||||
import androidx.compose.foundation.Image |
|
||||||
import androidx.compose.foundation.layout.Column |
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth |
|
||||||
import androidx.compose.material.Button |
|
||||||
import androidx.compose.material.MaterialTheme |
|
||||||
import androidx.compose.material.Text |
|
||||||
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 androidx.compose.ui.Alignment |
|
||||||
import androidx.compose.ui.Modifier |
|
||||||
import org.jetbrains.compose.resources.ExperimentalResourceApi |
|
||||||
import org.jetbrains.compose.resources.painterResource |
|
||||||
import iosResources.generated.resources.* |
|
||||||
|
|
||||||
@OptIn(ExperimentalResourceApi::class) |
|
||||||
@Composable |
|
||||||
fun App() { |
|
||||||
MaterialTheme { |
|
||||||
var greetingText by remember { mutableStateOf("Hello, World!") } |
|
||||||
var showImage by remember { mutableStateOf(false) } |
|
||||||
Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { |
|
||||||
Button(onClick = { |
|
||||||
showImage = !showImage |
|
||||||
}) { |
|
||||||
Text(greetingText) |
|
||||||
} |
|
||||||
AnimatedVisibility(showImage) { |
|
||||||
Image( |
|
||||||
painterResource(Res.drawable.compose_multiplatform), |
|
||||||
null |
|
||||||
) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,36 +0,0 @@ |
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" |
|
||||||
android:width="600dp" |
|
||||||
android:height="600dp" |
|
||||||
android:viewportWidth="600" |
|
||||||
android:viewportHeight="600"> |
|
||||||
<path |
|
||||||
android:fillColor="#041619" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M301.21,418.53C300.97,418.54 300.73,418.56 300.49,418.56C297.09,418.59 293.74,417.72 290.79,416.05L222.6,377.54C220.63,376.43 219,374.82 217.85,372.88C216.7,370.94 216.09,368.73 216.07,366.47L216.07,288.16C216.06,287.32 216.09,286.49 216.17,285.67C216.38,283.54 216.91,281.5 217.71,279.6L199.29,268.27L177.74,256.19C175.72,260.43 174.73,265.23 174.78,270.22L174.79,387.05C174.85,393.89 178.57,400.2 184.53,403.56L286.26,461.02C290.67,463.51 295.66,464.8 300.73,464.76C300.91,464.76 301.09,464.74 301.27,464.74C301.24,449.84 301.22,439.23 301.22,439.23L301.21,418.53Z" /> |
|
||||||
<path |
|
||||||
android:fillColor="#37BF6E" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M409.45,242.91L312.64,188.23C303.64,183.15 292.58,183.26 283.68,188.51L187.92,245C183.31,247.73 179.93,251.62 177.75,256.17L177.74,256.19L199.29,268.27L217.71,279.6C217.83,279.32 217.92,279.02 218.05,278.74C218.24,278.36 218.43,277.98 218.64,277.62C219.06,276.88 219.52,276.18 220.04,275.51C221.37,273.8 223.01,272.35 224.87,271.25L289.06,233.39C290.42,232.59 291.87,231.96 293.39,231.51C295.53,230.87 297.77,230.6 300,230.72C302.98,230.88 305.88,231.73 308.47,233.2L373.37,269.85C375.54,271.08 377.49,272.68 379.13,274.57C379.68,275.19 380.18,275.85 380.65,276.53C380.86,276.84 381.05,277.15 381.24,277.47L397.79,266.39L420.34,252.93L420.31,252.88C417.55,248.8 413.77,245.35 409.45,242.91Z" /> |
|
||||||
<path |
|
||||||
android:fillColor="#3870B2" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M381.24,277.47C381.51,277.92 381.77,278.38 382.01,278.84C382.21,279.24 382.39,279.65 382.57,280.06C382.91,280.88 383.19,281.73 383.41,282.59C383.74,283.88 383.92,285.21 383.93,286.57L383.93,361.1C383.96,363.95 383.35,366.77 382.16,369.36C381.93,369.86 381.69,370.35 381.42,370.83C379.75,373.79 377.32,376.27 374.39,378L310.2,415.87C307.47,417.48 304.38,418.39 301.21,418.53L301.22,439.23C301.22,439.23 301.24,449.84 301.27,464.74C306.1,464.61 310.91,463.3 315.21,460.75L410.98,404.25C419.88,399 425.31,389.37 425.22,379.03L425.22,267.85C425.17,262.48 423.34,257.34 420.34,252.93L397.79,266.39L381.24,277.47Z" /> |
|
||||||
<path |
|
||||||
android:fillColor="#00000000" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M177.75,256.17C179.93,251.62 183.31,247.73 187.92,245L283.68,188.51C292.58,183.26 303.64,183.15 312.64,188.23L409.45,242.91C413.77,245.35 417.55,248.8 420.31,252.88L420.34,252.93L498.59,206.19C494.03,199.46 487.79,193.78 480.67,189.75L320.86,99.49C306.01,91.1 287.75,91.27 273.07,99.95L114.99,193.2C107.39,197.69 101.81,204.11 98.21,211.63L177.74,256.19L177.75,256.17ZM301.27,464.74C301.09,464.74 300.91,464.76 300.73,464.76C295.66,464.8 290.67,463.51 286.26,461.02L184.53,403.56C178.57,400.2 174.85,393.89 174.79,387.05L174.78,270.22C174.73,265.23 175.72,260.43 177.74,256.19L98.21,211.63C94.86,218.63 93.23,226.58 93.31,234.82L93.31,427.67C93.42,438.97 99.54,449.37 109.4,454.92L277.31,549.77C284.6,553.88 292.84,556.01 301.2,555.94L301.2,555.8C301.39,543.78 301.33,495.26 301.27,464.74Z" |
|
||||||
android:strokeWidth="10" |
|
||||||
android:strokeColor="#083042" /> |
|
||||||
<path |
|
||||||
android:fillColor="#00000000" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M498.59,206.19L420.34,252.93C423.34,257.34 425.17,262.48 425.22,267.85L425.22,379.03C425.31,389.37 419.88,399 410.98,404.25L315.21,460.75C310.91,463.3 306.1,464.61 301.27,464.74C301.33,495.26 301.39,543.78 301.2,555.8L301.2,555.94C309.48,555.87 317.74,553.68 325.11,549.32L483.18,456.06C497.87,447.39 506.85,431.49 506.69,414.43L506.69,230.91C506.6,222.02 503.57,213.5 498.59,206.19Z" |
|
||||||
android:strokeWidth="10" |
|
||||||
android:strokeColor="#083042" /> |
|
||||||
<path |
|
||||||
android:fillColor="#00000000" |
|
||||||
android:fillType="nonZero" |
|
||||||
android:pathData="M301.2,555.94C292.84,556.01 284.6,553.88 277.31,549.76L109.4,454.92C99.54,449.37 93.42,438.97 93.31,427.67L93.31,234.82C93.23,226.58 94.86,218.63 98.21,211.63C101.81,204.11 107.39,197.69 114.99,193.2L273.07,99.95C287.75,91.27 306.01,91.1 320.86,99.49L480.67,189.75C487.79,193.78 494.03,199.46 498.59,206.19C503.57,213.5 506.6,222.02 506.69,230.91L506.69,414.43C506.85,431.49 497.87,447.39 483.18,456.06L325.11,549.32C317.74,553.68 309.48,555.87 301.2,555.94Z" |
|
||||||
android:strokeWidth="10" |
|
||||||
android:strokeColor="#083042" /> |
|
||||||
</vector> |
|
@ -1,4 +1,3 @@ |
|||||||
org.gradle.jvmargs=-Xmx8096M |
org.gradle.jvmargs=-Xmx8096M |
||||||
android.useAndroidX=true |
android.useAndroidX=true |
||||||
org.jetbrains.compose.experimental.jscanvas.enabled=true |
org.jetbrains.compose.experimental.jscanvas.enabled=true |
||||||
org.jetbrains.compose.experimental.macos.enabled=true |
|
Loading…
Reference in new issue