Skip to content

Commit 2eddd84

Browse files
authored
create Promise based client for JS (#137)
1 parent 2381ece commit 2eddd84

File tree

26 files changed

+872
-57
lines changed

26 files changed

+872
-57
lines changed

build.gradle.kts

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ kotlin {
3333
jvmToolchain(21)
3434
explicitApiWarning()
3535
compilerOptions {
36+
optIn = listOf("kotlin.js.ExperimentalJsExport")
3637
allWarningsAsErrors = true
3738
freeCompilerArgs.addAll("-Xexpect-actual-classes", "-Xconsistent-data-class-copy-visibility")
3839
}
@@ -42,6 +43,9 @@ kotlin {
4243
js(IR) {
4344
browser { testTask { useMocha { timeout = "10min" } } }
4445
nodejs { testTask { useMocha { timeout = "10min" } } }
46+
47+
binaries.library()
48+
generateTypeScriptDefinitions()
4549
}
4650

4751
wasmJs {
@@ -84,12 +88,29 @@ kotlin {
8488
implementation(libs.ktorfit)
8589
}
8690

87-
jvmMain.dependencies { implementation(libs.ktor.client.okhttp) }
88-
appleMain.dependencies { implementation(libs.ktor.client.darwin) }
89-
linuxMain.dependencies { implementation(libs.ktor.client.curl) }
90-
mingwMain.dependencies { implementation(libs.ktor.client.winhttp) }
91-
jsMain.dependencies { implementation(libs.ktor.client.js) }
92-
wasmJsMain.dependencies { implementation(libs.ktor.client.js) }
91+
val nonJsMain by creating { dependsOn(commonMain.get()) }
92+
93+
jvmMain {
94+
dependsOn(nonJsMain)
95+
dependencies { implementation(libs.ktor.client.okhttp) }
96+
}
97+
appleMain {
98+
dependsOn(nonJsMain)
99+
dependencies { implementation(libs.ktor.client.darwin) }
100+
}
101+
linuxMain {
102+
dependsOn(nonJsMain)
103+
dependencies { implementation(libs.ktor.client.curl) }
104+
}
105+
mingwMain {
106+
dependsOn(nonJsMain)
107+
dependencies { implementation(libs.ktor.client.winhttp) }
108+
}
109+
jsMain { dependencies { implementation(libs.ktor.client.js) } }
110+
wasmJsMain {
111+
dependsOn(nonJsMain)
112+
dependencies { implementation(libs.ktor.client.js) }
113+
}
93114

94115
commonTest.dependencies {
95116
implementation(kotlin("test"))

src/commonMain/kotlin/co/pokeapi/pokekotlin/PokeApi.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@ import de.jensklingenberg.ktorfit.http.Query
1010
import io.ktor.client.*
1111
import io.ktor.client.engine.*
1212
import io.ktor.client.plugins.cache.storage.*
13-
import kotlin.jvm.JvmName
1413

15-
@JvmName("create")
16-
public fun PokeApi(
14+
public fun createPokeApi(
1715
baseUrl: String = "https://pokeapi.co/api/v2/",
1816
cacheStorage: CacheStorage? = null,
1917
engine: HttpClientEngine = getDefaultEngine(),
@@ -31,7 +29,7 @@ public fun PokeApi(
3129
}
3230

3331
public interface PokeApi {
34-
public companion object : PokeApi by PokeApi()
32+
public companion object : PokeApi by createPokeApi()
3533

3634
// region Resource Lists
3735

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package co.pokeapi.pokekotlin.internal
2+
3+
import co.pokeapi.pokekotlin.model.ApiResource
4+
import kotlinx.serialization.KSerializer
5+
import kotlinx.serialization.Serializable
6+
7+
internal class ApiResourceSerializer :
8+
KSerializer<ApiResource> by DelegatingSerializer(
9+
serialName = "co.pokeapi.pokekotlin.model.ApiResource",
10+
delegate = Delegate.serializer(),
11+
fromDelegate = { ApiResource(url = it.url) },
12+
toDelegate = { Delegate(url = it.url) },
13+
) {
14+
@Serializable internal data class Delegate(val url: String)
15+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package co.pokeapi.pokekotlin.internal
2+
3+
import kotlin.annotation.AnnotationTarget.*
4+
import kotlin.js.ExperimentalJsExport
5+
6+
@ExperimentalJsExport
7+
@Retention(AnnotationRetention.BINARY)
8+
@Target(CLASS, PROPERTY, FUNCTION, FILE)
9+
internal expect annotation class JsOnlyExport()
10+
11+
@Retention(AnnotationRetention.BINARY)
12+
@Target(CLASS, PROPERTY, FUNCTION, FILE)
13+
internal annotation class NoOpExport()
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package co.pokeapi.pokekotlin.internal
2+
3+
import co.pokeapi.pokekotlin.model.NamedApiResource
4+
import kotlinx.serialization.KSerializer
5+
import kotlinx.serialization.Serializable
6+
7+
internal class NamedApiResourceSerializer :
8+
KSerializer<NamedApiResource> by DelegatingSerializer(
9+
serialName = "co.pokeapi.pokekotlin.model.NamedApiResource",
10+
delegate = Delegate.serializer(),
11+
fromDelegate = { NamedApiResource(name = it.name, url = it.url) },
12+
toDelegate = { Delegate(name = it.name, url = it.url) },
13+
) {
14+
@Serializable internal data class Delegate(val name: String, val url: String)
15+
}

src/commonMain/kotlin/co/pokeapi/pokekotlin/model/berries.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package co.pokeapi.pokekotlin.model
22

3+
import co.pokeapi.pokekotlin.internal.JsOnlyExport
34
import kotlinx.serialization.Serializable
45

56
@Serializable
7+
@JsOnlyExport
68
public data class Berry(
79
val id: Int,
810
val name: String,
@@ -18,9 +20,12 @@ public data class Berry(
1820
val naturalGiftType: NamedApiResource,
1921
)
2022

21-
@Serializable public data class BerryFlavorMap(val potency: Int, val flavor: NamedApiResource)
23+
@Serializable
24+
@JsOnlyExport
25+
public data class BerryFlavorMap(val potency: Int, val flavor: NamedApiResource)
2226

2327
@Serializable
28+
@JsOnlyExport
2429
public data class BerryFirmness(
2530
val id: Int,
2631
val name: String,
@@ -29,6 +34,7 @@ public data class BerryFirmness(
2934
)
3035

3136
@Serializable
37+
@JsOnlyExport
3238
public data class BerryFlavor(
3339
val id: Int,
3440
val name: String,
@@ -37,4 +43,6 @@ public data class BerryFlavor(
3743
val names: List<Name>,
3844
)
3945

40-
@Serializable public data class FlavorBerryMap(val potency: Int, val berry: NamedApiResource)
46+
@Serializable
47+
@JsOnlyExport
48+
public data class FlavorBerryMap(val potency: Int, val berry: NamedApiResource)

src/commonMain/kotlin/co/pokeapi/pokekotlin/model/contests.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package co.pokeapi.pokekotlin.model
22

3+
import co.pokeapi.pokekotlin.internal.JsOnlyExport
34
import kotlinx.serialization.Serializable
45

56
@Serializable
7+
@JsOnlyExport
68
public data class ContestType(
79
val id: Int,
810
val name: String,
@@ -11,9 +13,11 @@ public data class ContestType(
1113
)
1214

1315
@Serializable
16+
@JsOnlyExport
1417
public data class ContestName(val name: String, val color: String, val language: NamedApiResource)
1518

1619
@Serializable
20+
@JsOnlyExport
1721
public data class ContestEffect(
1822
val id: Int,
1923
val appeal: Int,
@@ -23,6 +27,7 @@ public data class ContestEffect(
2327
)
2428

2529
@Serializable
30+
@JsOnlyExport
2631
public data class SuperContestEffect(
2732
val id: Int,
2833
val appeal: Int,

src/commonMain/kotlin/co/pokeapi/pokekotlin/model/encounters.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package co.pokeapi.pokekotlin.model
22

3+
import co.pokeapi.pokekotlin.internal.JsOnlyExport
34
import kotlinx.serialization.Serializable
45

56
@Serializable
7+
@JsOnlyExport
68
public data class EncounterMethod(
79
val id: Int,
810
val name: String,
@@ -11,6 +13,7 @@ public data class EncounterMethod(
1113
)
1214

1315
@Serializable
16+
@JsOnlyExport
1417
public data class EncounterCondition(
1518
val id: Int,
1619
val name: String,
@@ -19,6 +22,7 @@ public data class EncounterCondition(
1922
)
2023

2124
@Serializable
25+
@JsOnlyExport
2226
public data class EncounterConditionValue(
2327
val id: Int,
2428
val name: String,

src/commonMain/kotlin/co/pokeapi/pokekotlin/model/evolution.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
package co.pokeapi.pokekotlin.model
22

3+
import co.pokeapi.pokekotlin.internal.JsOnlyExport
34
import kotlinx.serialization.Serializable
45

56
@Serializable
7+
@JsOnlyExport
68
public data class EvolutionChain(
79
val id: Int,
810
val babyTriggerItem: NamedApiResource?,
911
val chain: ChainLink,
1012
)
1113

1214
@Serializable
15+
@JsOnlyExport
1316
public data class ChainLink(
1417
val isBaby: Boolean,
1518
val species: NamedApiResource,
@@ -18,6 +21,7 @@ public data class ChainLink(
1821
)
1922

2023
@Serializable
24+
@JsOnlyExport
2125
public data class EvolutionDetail(
2226
val trigger: NamedApiResource,
2327
val item: NamedApiResource? = null,
@@ -40,6 +44,7 @@ public data class EvolutionDetail(
4044
)
4145

4246
@Serializable
47+
@JsOnlyExport
4348
public data class EvolutionTrigger(
4449
val id: Int,
4550
val name: String,

src/commonMain/kotlin/co/pokeapi/pokekotlin/model/games.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package co.pokeapi.pokekotlin.model
22

3+
import co.pokeapi.pokekotlin.internal.JsOnlyExport
34
import kotlinx.serialization.Serializable
45

56
@Serializable
7+
@JsOnlyExport
68
public data class Generation(
79
val id: Int,
810
val name: String,
@@ -16,6 +18,7 @@ public data class Generation(
1618
)
1719

1820
@Serializable
21+
@JsOnlyExport
1922
public data class Pokedex(
2023
val id: Int,
2124
val name: String,
@@ -28,9 +31,11 @@ public data class Pokedex(
2831
)
2932

3033
@Serializable
34+
@JsOnlyExport
3135
public data class PokemonEntry(val entryNumber: Int, val pokemonSpecies: NamedApiResource)
3236

3337
@Serializable
38+
@JsOnlyExport
3439
public data class Version(
3540
val id: Int,
3641
val name: String,
@@ -39,6 +44,7 @@ public data class Version(
3944
)
4045

4146
@Serializable
47+
@JsOnlyExport
4248
public data class VersionGroup(
4349
val id: Int,
4450
val name: String,

0 commit comments

Comments
 (0)