Skip to content

Commit ed99f37

Browse files
authored
Merge pull request #506 from icerockdev/#460-kotlin-1820-for-js
#460 kotlin 1820 for js
2 parents c0e98c4 + 8007f9b commit ed99f37

12 files changed

Lines changed: 385 additions & 30 deletions

File tree

README.md

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ buildscript {
6262
}
6363
6464
dependencies {
65-
classpath "dev.icerock.moko:resources-generator:0.22.3"
65+
classpath "dev.icerock.moko:resources-generator:0.23.0"
6666
}
6767
}
6868
@@ -80,10 +80,10 @@ project build.gradle
8080
apply plugin: "dev.icerock.mobile.multiplatform-resources"
8181
8282
dependencies {
83-
commonMainApi("dev.icerock.moko:resources:0.22.3")
84-
commonMainApi("dev.icerock.moko:resources-compose:0.22.3") // for compose multiplatform
83+
commonMainApi("dev.icerock.moko:resources:0.23.0")
84+
commonMainApi("dev.icerock.moko:resources-compose:0.23.0") // for compose multiplatform
8585
86-
commonTestImplementation("dev.icerock.moko:resources-test:0.22.3")
86+
commonTestImplementation("dev.icerock.moko:resources-test:0.23.0")
8787
}
8888
8989
multiplatformResources {
@@ -102,7 +102,7 @@ should [add `export` declarations](https://kotlinlang.org/docs/multiplatform-bui
102102

103103
```
104104
framework {
105-
export("dev.icerock.moko:resources:0.22.3")
105+
export("dev.icerock.moko:resources:0.23.0")
106106
export("dev.icerock.moko:graphics:0.9.0") // toUIColor here
107107
}
108108
```
@@ -629,6 +629,15 @@ with compose you can just call in `commonMain`
629629
val fontFamily: FontFamily = fontFamilyResource(MR.fonts.Raleway.italic)
630630
```
631631

632+
or you can get `Font`
633+
634+
```kotlin
635+
val font: Font = MR.fonts.Raleway.italic.asFont(
636+
weight = FontWeight.Normal, // optional
637+
style = FontStyle.Normal // optional
638+
)
639+
```
640+
632641
### Example 9 - pass colors
633642

634643
Colors resources directory is `commonMain/resources/MR/colors`.

resources-generator/src/main/kotlin/dev/icerock/gradle/generator/LanguageType.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ sealed interface LanguageType {
3030
override val androidResourcesDir: String = buildString {
3131
append("values")
3232
append("-")
33-
append(jvmLocale.language)
33+
append(jvmLocale.getISO639Language())
3434
if (jvmLocale.country.isNotBlank()) {
3535
append("-r")
3636
append(jvmLocale.country)
@@ -54,6 +54,22 @@ sealed interface LanguageType {
5454
override fun equals(other: Any?): Boolean {
5555
return other is Locale && other.jvmLocale == jvmLocale
5656
}
57+
58+
/**
59+
* For android we should use ISO-639-1 language code
60+
* https://developer.android.com/guide/topics/resources/providing-resources
61+
* https://github.com/icerockdev/moko-resources/issues/468
62+
*
63+
* @see java.util.Locale#convertOldISOCodes
64+
*/
65+
private fun JvmLocale.getISO639Language(): String {
66+
return when (language) {
67+
"he" -> "iw"
68+
"yi" -> "ji"
69+
"id" -> "in"
70+
else -> language
71+
}
72+
}
5773
}
5874

5975
companion object {

resources-generator/src/main/kotlin/dev/icerock/gradle/generator/apple/AppleMRGenerator.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,12 @@ class AppleMRGenerator(
9797
setupTestsResources()
9898
setupFatFrameworkTasks()
9999

100-
dependsOnProcessResources(project, sourceSet, generationTask)
100+
dependsOnProcessResources(
101+
project = project,
102+
sourceSet = sourceSet,
103+
task = generationTask,
104+
shouldExcludeGenerated = true
105+
)
101106
}
102107

103108
override fun beforeMRGeneration() {

resources-generator/src/main/kotlin/dev/icerock/gradle/generator/js/JsMRGenerator.kt

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -95,31 +95,40 @@ class JsMRGenerator(
9595
it.dependsOn(generationTask)
9696
}
9797

98-
dependsOnProcessResources(project, sourceSet, generationTask)
98+
dependsOnProcessResources(
99+
project = project,
100+
sourceSet = sourceSet,
101+
task = generationTask,
102+
shouldExcludeGenerated = true
103+
)
99104
}
100105

101106
private fun setupKLibResources(generationTask: Task) {
102-
val compileTask: Kotlin2JsCompile = compilation.compileKotlinTask
103-
compileTask.dependsOn(generationTask)
104-
105-
@Suppress("UNCHECKED_CAST")
106-
compileTask.doLast(CopyResourcesToKLibAction(resourcesGenerationDir) as Action<in Task>)
107+
val taskProvider = compilation.compileTaskProvider
108+
taskProvider.configure { compileTask ->
109+
compileTask.dependsOn(generationTask)
110+
val action = CopyResourcesToKLibAction(resourcesGenerationDir)
111+
@Suppress("UNCHECKED_CAST")
112+
compileTask.doLast(action as Action<in Task>)
113+
}
107114
}
108115

109116
private fun setupResources() {
110-
val kotlinTarget = compilation.target as KotlinJsIrTarget
117+
val kotlinTarget: KotlinJsIrTarget = compilation.target as KotlinJsIrTarget
111118

112119
kotlinTarget.compilations
113-
.map { it.compileKotlinTask }
114-
.forEach { compileTask ->
115-
@Suppress("UNCHECKED_CAST")
116-
compileTask.doLast(CopyResourcesToExecutableAction(resourcesGenerationDir) as Action<in Task>)
120+
.configureEach { compilation ->
121+
compilation.compileTaskProvider.configure { compileTask ->
122+
val action = CopyResourcesToExecutableAction(resourcesGenerationDir)
123+
@Suppress("UNCHECKED_CAST")
124+
compileTask.doLast(action as Action<in Task>)
125+
}
117126
}
118127
}
119128

120129
class CopyResourcesToKLibAction(private val resourcesDir: File) : Action<Kotlin2JsCompile> {
121130
override fun execute(task: Kotlin2JsCompile) {
122-
val unpackedKLibDir: File = task.outputFileProperty.get()
131+
val unpackedKLibDir: File = task.destinationDirectory.asFile.get()
123132
val defaultDir = File(unpackedKLibDir, "default")
124133
val resRepackDir = File(defaultDir, "resources")
125134
if (resRepackDir.exists().not()) return

resources-generator/src/main/kotlin/dev/icerock/gradle/generator/jvm/JvmMRGenerator.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,12 @@ class JvmMRGenerator(
7979
it.exclude("MR/**")
8080
it.dependsOn(generationTask)
8181
}
82-
dependsOnProcessResources(project, sourceSet, generationTask)
82+
dependsOnProcessResources(
83+
project = project,
84+
sourceSet = sourceSet,
85+
task = generationTask,
86+
shouldExcludeGenerated = false
87+
)
8388
}
8489

8590
companion object {

resources-generator/src/main/kotlin/dev/icerock/gradle/utils/ProcessResourcesUtils.kt

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,25 @@ package dev.icerock.gradle.utils
77
import dev.icerock.gradle.generator.MRGenerator
88
import org.gradle.api.Project
99
import org.gradle.api.Task
10+
import org.gradle.kotlin.dsl.withType
11+
import org.gradle.language.jvm.tasks.ProcessResources
1012

11-
fun dependsOnProcessResources(project: Project, sourceSet: MRGenerator.SourceSet, task: Task) {
13+
fun dependsOnProcessResources(
14+
project: Project,
15+
sourceSet: MRGenerator.SourceSet,
16+
task: Task,
17+
shouldExcludeGenerated: Boolean
18+
) {
1219
project.tasks
1320
.matching { it.name == sourceSet.name.removeSuffix("Main") + "ProcessResources" }
14-
.configureEach {
15-
it.dependsOn(task)
21+
.withType<ProcessResources>()
22+
.configureEach { processResourcesTask ->
23+
processResourcesTask.exclude {
24+
val path: String = it.file.absolutePath
25+
if (shouldExcludeGenerated && path.contains("generated/moko")) return@exclude true
26+
if (path.contains("resources/MR")) return@exclude true
27+
false
28+
}
29+
processResourcesTask.dependsOn(task)
1630
}
1731
}

samples/compose-resources-gallery/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ kotlin.mpp.androidSourceSetLayoutVersion=2
1414
kotlin.mpp.androidGradlePluginCompatibility.nowarn=true
1515
# Enable kotlin/native experimental memory model
1616
kotlin.native.binary.memoryModel=experimental
17-
kotlin.version=1.8.10
17+
kotlin.version=1.8.20
1818
agp.version=8.0.1
1919
compose.version=1.4.0

0 commit comments

Comments
 (0)