Repository: google/kotlin-fhir
Pull request #11: Rename :library to :fhir-model and add wasm wasi platform support
Author: login: jingtang10
Created: 2025-05-01T14:21:48Z | Merged: 2025-05-07T08:40:21Z

- Renamed `:library` module to `:fhir-model` to prepare for artifact release
- Added wasm wasi support
- Removed linux support due to its limited usage and lower tier in kmp support
- Add a section in the `README.md` file for platform support
- Updated kotlinx-datetime version from 0.6.1 to 0.6.2 to support wasm wasi


Diff:
diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
index 608253f65..42c7d0574 100644
--- a/.github/workflows/gradle.yml
+++ b/.github/workflows/gradle.yml
@@ -26,8 +26,6 @@ jobs:
             os: macos-latest
           - target: jvmTest
             os: ubuntu-latest
-          - target: linuxX64Test
-            os: ubuntu-latest
           - target: testDebugUnitTest
             os: ubuntu-latest
           - target: testReleaseUnitTest
diff --git a/README.md b/README.md
index 8557b641c..710bf38f8 100644
--- a/README.md
+++ b/README.md
@@ -31,6 +31,36 @@ dependencies. Only essential Kotlin Multiplatform dependencies are included, e.g
 [protocol buffers](https://protobuf.dev/). However, there is no XML or Turtle support as of
 Jan 2025.
 
+## Supported platforms
+
+The library supports the following
+[target platforms](https://kotlinlang.org/docs/multiplatform-dsl-reference.html#targets):
+
+| Target platform                    | Target          | Artifact suffix | Support |
+|:-----------------------------------|:----------------|:----------------|:--------|
+| Kotlin/JVM                         | `jvm`           | `-jvm`          | ✅       |
+| Kotlin/Wasm                        | `wasmJs`        | `-wasm-js`      | ✅       |
+| Kotlin/Wasm                        | `wasmWasi`      | `-wasm-wasi`    | ✅       |
+| Kotlin/JS                          | `js`            | `-js`           | ✅       |
+| Android applications and libraries | `androidTarget` | `-android`      | ✅       |
+
+as well as a subset of
+[tier 1 Kotlin/Native targets](https://kotlinlang.org/docs/native-target-support.html#tier-1), detailed below:
+
+| Gradle target name | Artifact suffix      | Support |
+|:-------------------|:---------------------|:--------|
+| macosX64           | `-macosx64`          | ⛔       |
+| macosArm64         | `-macosarm64`        | ⛔       |
+| iosSimulatorArm64  | `-iossimulatorarm64` | ✅       |
+| iosX64             | `-iosx64`            | ✅       |
+| iosArm64           | `-iosarm64`         | ✅       |
+
+The library does not support `macos` targets in the tier 1 list, or any
+[tier2](https://kotlinlang.org/docs/native-target-support.html#tier-2) and
+[tier3](https://kotlinlang.org/docs/native-target-support.html#tier-3) Kotlin/Native targets. This
+reflects their limited usage currently rather than technical difficulty. Please contact the team if
+you require support for these platforms.
+
 ## Implementation
 
 ### Overview
@@ -209,11 +239,11 @@ To put all this together, the
 [FHIR codegen](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen) in the Gradle
 binary plugin generates three classes for each FHIR resource type:
 
-- the model class (the most important class) in the root package e.g. `com.google.fhir.r4`,
+- the model class (the most important class) in the root package e.g. `com.google.fhir.model.r4`,
 - the surrogate class (for mapping primitive data types to JSON properties) in the surrogate package
-  e.g. `com.google.fhir.r4.surrogates`, and
+  e.g. `com.google.fhir.model.r4.surrogates`, and
 - the serializer class (to delegate serialization/deserialization to the surrogate class) in the
-  serializer package e.g. `com.google.fhir.r4.serializers`,
+  serializer package e.g. `com.google.fhir.model.r4.serializers`,
 
 using
 [`ModelTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/ModelTypeSpecGenerator.kt),
@@ -232,7 +262,7 @@ mentioned [earlier](#mapping-fhir-primitive-data-types-to-kotlin).
 
 ## User Guide
 
-### Running the codegen
+### Running the codegen locally
 
 You can manually run the code generator (codegen) to inspect the generated code or, as an
 alternative to using the library as a dependency, copy the generated code into your project for
@@ -251,7 +281,7 @@ For example, to generate code for FHIR R4:
 ./gradlew r4
 ```
 
-The generated code will be located in the `library/build/generated/<FHIR_VERSION>` subdirectory.
+The generated code will be located in the `fhir-model/build/generated/<FHIR_VERSION>` subdirectory.
 
 > **Note:** The library is designed for use as a dependency. Directly copying generated code into
 > your project is generally discouraged as it can lead to maintenance issues and conflicts with
@@ -286,9 +316,9 @@ Kotlin's [named arguments](https://kotlinlang.org/docs/functions.html#named-argu
 improved code readability and to avoid errors caused by incorrect parameter order. For example:
 
 ```kotlin
-import com.google.fhir.r4.Address
-import com.google.fhir.r4.Patient
-import com.google.fhir.r4.HumanName
+import com.google.fhir.model.r4.Address
+import com.google.fhir.model.r4.Patient
+import com.google.fhir.model.r4.HumanName
 
 fun main() {
     val patient = Patient(
@@ -313,9 +343,9 @@ Alternatively, use Kotlin's `apply` function whilst creating new FHIR resources
 flexibility:
 
 ```kotlin
-import com.google.fhir.r4.Address
-import com.google.fhir.r4.Patient
-import com.google.fhir.r4.HumanName
+import com.google.fhir.model.r4.Address
+import com.google.fhir.model.r4.Patient
+import com.google.fhir.model.r4.HumanName
 
 fun main() {
     val patient = Patient().apply {
@@ -347,7 +377,7 @@ and deserialization. For more information, see the
 This is an example of serializing and deserializing the FHIR Patient resource created previously:
 
 ```kotlin
-import com.google.fhir.r4.Patient
+import com.google.fhir.model.r4.Patient
 import kotlinx.serialization.json.Json
 
 fun main() {
@@ -380,8 +410,8 @@ To use polymorphic deserialization, use the base type `Resource` as the type par
 deserialization:
 
 ```kotlin
-import com.google.fhir.r4.Patient
-import com.google.fhir.r4.Resource
+import com.google.fhir.model.r4.Patient
+import com.google.fhir.model.r4.Resource
 import kotlinx.serialization.json.Json
 
 fun main() {
@@ -420,13 +450,15 @@ serialization process normalizes these variations, resulting in potentially diff
 However, in all of these cases, semantic equivalence is maintained.
 
 ## Publishing
+
 To create a maven repository from the project, run:
 
-`./gradlew :library:publish`
+`./gradlew :fhir-model:publish`
 
-This will create a maven repository in the `library/build/repo` directory.
+This will create a maven repository in the `fhir-model/build/repo` directory.
 
-There is also a `zipRepo` task that will zip the repository into the `library/build/repoZip` directory.
+There is also a `zipRepo` task that will zip the repository into the `fhir-model/build/repoZip`
+directory.
 
 ## Acknowledgements
 
diff --git a/library/build.gradle.kts b/fhir-model/build.gradle.kts
similarity index 84%
rename from library/build.gradle.kts
rename to fhir-model/build.gradle.kts
index 782db8cfe..c82675839 100644
--- a/library/build.gradle.kts
+++ b/fhir-model/build.gradle.kts
@@ -13,34 +13,30 @@ plugins {
 
 group = "com.google.fhir"
 version = "1.0.0-alpha01"
+
 val codegenTaskR4 = fhirCodegenExtension.newTask("r4") {
     this.definitionFiles.from(
         File(project.rootDir, "third_party/hl7.fhir.r4.core/package").listFiles()
     )
-    this.packageName.set("com.google.fhir.r4")
+    this.packageName.set("com.google.fhir.model.r4")
 }
 
 val codegenTaskR4B = fhirCodegenExtension.newTask("r4b") {
     this.definitionFiles.from(
         File(project.rootDir, "third_party/hl7.fhir.r4b.core/package").listFiles()
     )
-    this.packageName.set("com.google.fhir.r4b")
+    this.packageName.set("com.google.fhir.model.r4b")
 }
 
 val codegenTaskR5 = fhirCodegenExtension.newTask("r5") {
     this.definitionFiles.from(
         File(project.rootDir, "third_party/hl7.fhir.r5.core/package").listFiles()
     )
-    this.packageName.set("com.google.fhir.r5")
+    this.packageName.set("com.google.fhir.model.r5")
 }
 
 kotlin {
     jvm()
-    androidTarget {
-        compilerOptions {
-            jvmTarget.set(JvmTarget.JVM_1_8)
-        }
-    }
     @OptIn(ExperimentalWasmDsl::class) wasmJs {
         browser {
             val rootDirPath = project.rootDir.path
@@ -56,14 +52,23 @@ kotlin {
             }
         }
     }
-    js() {
+    @OptIn(ExperimentalWasmDsl::class) wasmWasi {
+        nodejs()
+        binaries.library()
+    }
+    js {
         browser()
-        binaries.executable()
+        binaries.library()
+    }
+    androidTarget {
+        compilerOptions {
+            jvmTarget.set(JvmTarget.JVM_1_8)
+        }
     }
     iosX64 {
         binaries {
             framework {
-                baseName = "KmpFhir" // Set the name of your framework
+                baseName = "KotlinFhir" // Set the name of your framework
 
                 // EXPORT DEPENDENCIES FOR OBJC INTEROP
                 // If you are using other Kotlin modules as dependencies, you may need
@@ -77,7 +82,6 @@ kotlin {
     }
     iosArm64()
     iosSimulatorArm64()
-    linuxX64()
 
     sourceSets {
         val commonMain by getting {
@@ -116,7 +120,7 @@ tasks.withType<Test>().configureEach {
 }
 
 // publishing prep
-val localRepo = project.layout.buildDirectory.get().dir("repo")
+val localRepo: Directory = project.layout.buildDirectory.get().dir("repo")
 publishing {
     repositories {
         maven {
@@ -125,7 +129,8 @@ publishing {
     }
 }
 val deleteRepoTask = tasks.register<Delete>("deleteLocalRepo") {
-    description = "Deletes the local repository to get rid of stale artifacts before local publishing"
+    description =
+        "Deletes the local repository to get rid of stale artifacts before local publishing"
     this.delete(localRepo)
 }
 tasks.named("publishAllPublicationsToMavenRepository").configure {
@@ -135,8 +140,10 @@ tasks.register("zipRepo", Zip::class) {
     description = "Create a zip of the maven repository"
     this.destinationDirectory.set(project.layout.buildDirectory.dir("repoZip"))
     archiveBaseName.set("kotlin-fhir")
+
+    // Hint to gradle that the repo files are produced by the publish task. This establishes a
+    // dependency from the zipRepo task to the publish task.
     this.from(tasks.named("publish").map { _ ->
-        // mapping from publish task to establish dependency.
         localRepo
     })
 }
diff --git a/library/src/jvmTest/kotlin/com/google/fhir/SerializationRoundTripTest.kt b/fhir-model/src/jvmTest/kotlin/com/google/fhir/model/SerializationRoundTripTest.kt
similarity index 94%
rename from library/src/jvmTest/kotlin/com/google/fhir/SerializationRoundTripTest.kt
rename to fhir-model/src/jvmTest/kotlin/com/google/fhir/model/SerializationRoundTripTest.kt
index 816389160..2c3e0f893 100644
--- a/library/src/jvmTest/kotlin/com/google/fhir/SerializationRoundTripTest.kt
+++ b/fhir-model/src/jvmTest/kotlin/com/google/fhir/model/SerializationRoundTripTest.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.google.fhir
+package com.google.fhir.model
 
 import java.io.File
 import kotlin.test.Test
@@ -144,8 +144,8 @@ class SerializationRoundTripTest {
       ?.filterNot { exclusionListR4.contains(it.name) }
       ?.forEach { file ->
         val exampleJson = prettyPrintJson(file.readText())
-        val domainResource: com.google.fhir.r4.Resource =
-          Json.decodeFromString<com.google.fhir.r4.Resource>(exampleJson)
+        val domainResource: com.google.fhir.model.r4.Resource =
+          Json.decodeFromString<com.google.fhir.model.r4.Resource>(exampleJson)
         val reserializedString = json.encodeToString(domainResource)
         assertEqualsIgnoringZeros(exampleJson, reserializedString)
       }
@@ -164,8 +164,8 @@ class SerializationRoundTripTest {
       ?.filterNot { exclusionListR4B.contains(it.name) }
       ?.forEach { file ->
         val exampleJson = prettyPrintJson(file.readText())
-        val domainResource: com.google.fhir.r4b.Resource =
-          Json.decodeFromString<com.google.fhir.r4b.Resource>(exampleJson)
+        val domainResource: com.google.fhir.model.r4b.Resource =
+          Json.decodeFromString<com.google.fhir.model.r4b.Resource>(exampleJson)
         val reserializedString = json.encodeToString(domainResource)
         assertEqualsIgnoringZeros(exampleJson, reserializedString)
       }
@@ -184,8 +184,8 @@ class SerializationRoundTripTest {
       ?.filterNot { exclusionsListR5.contains(it.name) }
       ?.forEach { file ->
         val exampleJson = prettyPrintJson(file.readText())
-        val domainResource: com.google.fhir.r5.Resource =
-          Json.decodeFromString<com.google.fhir.r5.Resource>(exampleJson)
+        val domainResource: com.google.fhir.model.r5.Resource =
+          Json.decodeFromString<com.google.fhir.model.r5.Resource>(exampleJson)
         val reserializedString = json.encodeToString(domainResource)
         assertEqualsIgnoringZeros(exampleJson, reserializedString)
       }
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index f4342cab5..b214a157e 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -4,7 +4,7 @@ android-minSdk = "24"
 android-compileSdk = "34"
 kotlin = "2.1.0"
 kotlin-poet = "2.0.0"
-kotlinx-datetime = "0.6.1"
+kotlinx-datetime = "0.6.2"
 kotlinx-serialization-json = "1.8.0-RC"
 maven-publish = "0.29.0"
 spotless = "7.0.1"
diff --git a/settings.gradle.kts b/settings.gradle.kts
index a897c4c44..e1d11c9ae 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -13,6 +13,6 @@ dependencyResolutionManagement {
     }
 }
 
-rootProject.name = "kmp-fhir"
-include(":library")
+rootProject.name = "kotlin-fhir"
+include(":fhir-model")
 includeBuild("fhir-codegen")


Reviews:
user: login: copilot-pull-request-reviewer[bot]
body: ## Pull Request Overview

This pull request renames the :library module to :models and updates the project documentation while adding support for the wasmWasi target and deprecating Linux support.  
- Module renaming from :library to :models in build configuration and documentation  
- Added a new section in README.md to document supported platforms, including wasmWasi support  
- Bumped the version for kotlinx-datetime in the gradle versions file

### Reviewed Changes

Copilot reviewed 3 out of 5 changed files in this pull request and generated 3 comments.

| File                        | Description                                                           |
| --------------------------- | --------------------------------------------------------------------- |
| gradle/libs.versions.toml   | Updated kotlinx-datetime version from 0.6.1 to 0.6.2                  |
| README.md                   | Updated documentation for platform support and module renaming        |

<details>
<summary>Files not reviewed (2)</summary>

* **models/build.gradle.kts**: Language not supported
* **settings.gradle.kts**: Language not supported
</details>



state: COMMENTED
author_association: NONE
submitted_at: 2025-05-01T14:22:43Z
user: login: copilot-pull-request-reviewer[bot]
body: ## Pull Request Overview

This PR renames the module from :library to :models in preparation for artifact release and adds support for the wasm wasi platform while removing Linux support due to low usage. Key changes include updating module names in build and documentation, adding a "Supported platforms" section in the README, and updating the kotlinx-datetime version.

### Reviewed Changes

Copilot reviewed 3 out of 5 changed files in this pull request and generated 1 comment.

| File                          | Description                                                           |
| ----------------------------- | --------------------------------------------------------------------- |
| gradle/libs.versions.toml     | Updated kotlinx-datetime version to 0.6.2 for wasm wasi support       |
| README.md                     | Added supported platform details, updated publish paths, and renamed module references from "library" to "models" |

<details>
<summary>Files not reviewed (2)</summary>

* **models/build.gradle.kts**: Language not supported
* **settings.gradle.kts**: Language not supported
</details>



state: COMMENTED
author_association: NONE
submitted_at: 2025-05-01T14:27:29Z
user: login: copilot-pull-request-reviewer[bot]
body: ## Pull Request Overview

This PR renames the ":library" module to ":models" and adds support for wasm wasi, while also updating dependency versions and the README documentation to reflect these changes.  
- Renamed module references from "library" to "models".  
- Added platform support for wasm wasi and updated supported platforms documentation.  
- Updated kotlinx-datetime version from 0.6.1 to 0.6.2.

### Reviewed Changes

Copilot reviewed 3 out of 5 changed files in this pull request and generated 1 comment.

| File                         | Description                                                             |
| ---------------------------- | ----------------------------------------------------------------------- |
| gradle/libs.versions.toml    | Updated kotlinx-datetime version to support wasm wasi.                  |
| README.md                    | Updated module references and added a supported platforms section.      |

<details>
<summary>Files not reviewed (2)</summary>

* **models/build.gradle.kts**: Language not supported
* **settings.gradle.kts**: Language not supported
</details>



state: COMMENTED
author_association: NONE
submitted_at: 2025-05-01T14:29:08Z
user: login: yigit
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-05-01T15:39:31Z
user: login: jingtang10
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T09:25:22Z
user: login: jingtang10
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T09:25:26Z
user: login: ellykits
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-06T12:16:34Z

Review comments:
diff_hunk: @@ -216,10 +246,13 @@ binary plugin generates three classes for each FHIR resource type:
   serializer package e.g. `com.google.fhir.r4.serializers`,
 
 using
-[`ModelTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/ModelTypeSpecGenerator.kt),
-[`SurrogateTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/SurrogateTypeSpecGenerator.kt),
+[
+`ModelTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/ModelTypeSpecGenerator.kt),
+[
path: README.md
user: login: Copilot
body: The markdown link formatting for 'ModelTypeSpecGenerator' appears broken due to the standalone opening bracket. Consider merging it with the link text to form a proper inline link: `[ModelTypeSpecGenerator](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/ModelTypeSpecGenerator.kt)`.
```suggestion
[`ModelTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/ModelTypeSpecGenerator.kt),
[
```
created_at: 2025-05-01T14:22:42Z
author_association: NONE
diff_hunk: @@ -216,10 +246,13 @@ binary plugin generates three classes for each FHIR resource type:
   serializer package e.g. `com.google.fhir.r4.serializers`,
 
 using
-[`ModelTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/ModelTypeSpecGenerator.kt),
-[`SurrogateTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/SurrogateTypeSpecGenerator.kt),
+[
+`ModelTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/ModelTypeSpecGenerator.kt),
+[
+`SurrogateTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/SurrogateTypeSpecGenerator.kt),
path: README.md
user: login: Copilot
body: The markdown link formatting for 'SurrogateTypeSpecGenerator' appears broken due to the standalone opening bracket. Consider merging it with the link text to form a proper inline link: `[SurrogateTypeSpecGenerator](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/SurrogateTypeSpecGenerator.kt)`.
```suggestion
[`SurrogateTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/SurrogateTypeSpecGenerator.kt),
```
created_at: 2025-05-01T14:22:42Z
author_association: NONE
diff_hunk: @@ -216,10 +246,13 @@ binary plugin generates three classes for each FHIR resource type:
   serializer package e.g. `com.google.fhir.r4.serializers`,
 
 using
-[`ModelTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/ModelTypeSpecGenerator.kt),
-[`SurrogateTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/SurrogateTypeSpecGenerator.kt),
+[
+`ModelTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/ModelTypeSpecGenerator.kt),
+[
+`SurrogateTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/SurrogateTypeSpecGenerator.kt),
 and
-[`SerializerTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/SerializerTypeSpecGenerator.kt),
+[
+`SerializerTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/SerializerTypeSpecGenerator.kt),
path: README.md
user: login: Copilot
body: The markdown link formatting for 'SerializerTypeSpecGenerator' appears broken due to the standalone opening bracket. Consider merging it with the link text to form a proper inline link: `[SerializerTypeSpecGenerator](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/SerializerTypeSpecGenerator.kt)`.
```suggestion
[`SerializerTypeSpecGenerator`](fhir-codegen/gradle-plugin/src/main/kotlin/com/google/fhir/codegen/SerializerTypeSpecGenerator.kt),
```
created_at: 2025-05-01T14:22:42Z
author_association: NONE
diff_hunk: @@ -31,6 +31,36 @@ dependencies. Only essential Kotlin Multiplatform dependencies are included, e.g
 [protocol buffers](https://protobuf.dev/). However, there is no XML or Turtle support as of
 Jan 2025.
 
+## Supported platforms
+
+The library supports the following
+[target platforms](https://kotlinlang.org/docs/multiplatform-dsl-reference.html#targets):
+
+| Target platform                    | Target          | Artifact suffix | Support |
+|:-----------------------------------|:----------------|:----------------|:--------|
+| Kotlin/JVM                         | `jvm`           | `-jvm`          | ✅       |
+| Kotlin/Wasm                        | `wasmJs`        | `-wasm-js`      | ✅       |
+| Kotlin/Wasm                        | `wasmWasi`      | `-wasm-wasi`    | ✅       |
+| Kotlin/JS                          | `js`            | `-js`           | ✅       |
+| Android applications and libraries | `androidTarget` | `-android`      | ✅       |
+
+and some
+[tier 1 Kotlin/Native targets](https://kotlinlang.org/docs/native-target-support.html#tier-1):
+
+| Gradle target name | Artifact suffix      | Support |
+|:-------------------|:---------------------|:--------|
+| macosX64           | `-macosx64`          | ⛔       |
+| macosArm64         | `-macosarm64`        | ⛔       |
+| iosSimulatorArm64  | `-iossimulatorarm64` | ✅       |
+| iosX64             | `-iosx64`            | ✅       |
+| iosArm64           | `-iosarm64`️         | ✅       |
path: README.md
user: login: Copilot
body: There appears to be an extraneous character after the artifact suffix in the iosArm64 row. Removing it may improve clarity.
```suggestion
| iosArm64           | `-iosarm64`         | ✅       |
```
created_at: 2025-05-01T14:27:29Z
author_association: NONE
diff_hunk: @@ -31,6 +31,36 @@ dependencies. Only essential Kotlin Multiplatform dependencies are included, e.g
 [protocol buffers](https://protobuf.dev/). However, there is no XML or Turtle support as of
 Jan 2025.
 
+## Supported platforms
+
+The library supports the following
+[target platforms](https://kotlinlang.org/docs/multiplatform-dsl-reference.html#targets):
+
+| Target platform                    | Target          | Artifact suffix | Support |
+|:-----------------------------------|:----------------|:----------------|:--------|
+| Kotlin/JVM                         | `jvm`           | `-jvm`          | ✅       |
+| Kotlin/Wasm                        | `wasmJs`        | `-wasm-js`      | ✅       |
+| Kotlin/Wasm                        | `wasmWasi`      | `-wasm-wasi`    | ✅       |
+| Kotlin/JS                          | `js`            | `-js`           | ✅       |
+| Android applications and libraries | `androidTarget` | `-android`      | ✅       |
+
+and some
+[tier 1 Kotlin/Native targets](https://kotlinlang.org/docs/native-target-support.html#tier-1):
path: README.md
user: login: Copilot
body: [nitpick] The phrase 'and some' is ambiguous; consider clarifying it to introduce the Tier 1 Kotlin/Native targets section with a more descriptive phrase.
```suggestion
as well as a subset of
[tier 1 Kotlin/Native targets](https://kotlinlang.org/docs/native-target-support.html#tier-1), detailed below:
```
created_at: 2025-05-01T14:29:08Z
author_association: NONE
diff_hunk: @@ -56,14 +52,23 @@ kotlin {
             }
         }
     }
-    js() {
+    @OptIn(ExperimentalWasmDsl::class) wasmWasi {
+        nodejs()
+        binaries.executable()
path: models/build.gradle.kts
user: login: yigit
body: this should be library, same for js.
idk why i put these executable in the first CL, sorry.
created_at: 2025-05-01T15:38:50Z
author_association: CONTRIBUTOR
diff_hunk: @@ -56,14 +52,23 @@ kotlin {
             }
         }
     }
-    js() {
+    @OptIn(ExperimentalWasmDsl::class) wasmWasi {
+        nodejs()
+        binaries.executable()
+    }
+    js {
         browser()
         binaries.executable()
path: models/build.gradle.kts
user: login: yigit
body: ditto
created_at: 2025-05-01T15:39:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -56,14 +52,23 @@ kotlin {
             }
         }
     }
-    js() {
+    @OptIn(ExperimentalWasmDsl::class) wasmWasi {
+        nodejs()
+        binaries.executable()
path: models/build.gradle.kts
user: login: jingtang10
body: done
created_at: 2025-05-06T09:25:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -56,14 +52,23 @@ kotlin {
             }
         }
     }
-    js() {
+    @OptIn(ExperimentalWasmDsl::class) wasmWasi {
+        nodejs()
+        binaries.executable()
+    }
+    js {
         browser()
         binaries.executable()
path: models/build.gradle.kts
user: login: jingtang10
body: done
created_at: 2025-05-06T09:25:26Z
author_association: CONTRIBUTOR

PR comments:
user: login: jingtang10
created_at: 2025-05-06T16:31:09Z
body: After some research and talking to Gemini, I've decided to
- use singlar form in the namespace e.g. `com.google.fhir.model.r4.Patient`. This (singular, not plural) is more consistent with the convention in hapi fhir and other libraries too.
- rename the module to `:fhir-model` so that the released artifact will be similar to `com.google.fhir:fhir-model`. It is recommended by Gemini to have useful repetition of the keyword FHIR in case other types of models need to be released. This is very consistent with other jetpack libraries too: e.g. https://maven.google.com/web/index.html?q=model#androidx.lifecycle
author_association: CONTRIBUTOR
user: login: jingtang10
created_at: 2025-05-06T16:32:30Z
body: @yigit is currently away. So I will not wait for his further comments.
author_association: CONTRIBUTOR