diff --git a/.github/workflows/sdk-build-validation.yml b/.github/workflows/sdk-build-validation.yml index 55246119e0..e0ff2b399f 100644 --- a/.github/workflows/sdk-build-validation.yml +++ b/.github/workflows/sdk-build-validation.yml @@ -127,9 +127,9 @@ jobs: run: | sudo apt-get update sudo apt-get install -y wget - wget https://download.swift.org/swift-5.9.2-release/ubuntu2204/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-ubuntu22.04.tar.gz - tar xzf swift-5.9.2-RELEASE-ubuntu22.04.tar.gz - sudo mv swift-5.9.2-RELEASE-ubuntu22.04 /usr/share/swift + wget https://download.swift.org/swift-6.0.3-release/ubuntu2204/swift-6.0.3-RELEASE/swift-6.0.3-RELEASE-ubuntu22.04.tar.gz + tar xzf swift-6.0.3-RELEASE-ubuntu22.04.tar.gz + sudo mv swift-6.0.3-RELEASE-ubuntu22.04 /usr/share/swift echo "/usr/share/swift/usr/bin" >> $GITHUB_PATH - name: Setup Java diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ce5ab4e5ff..028ba652c1 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -28,8 +28,6 @@ jobs: FlutterBeta, Go112, Go118, - KotlinJava8, - KotlinJava11, KotlinJava17, Node16, Node18, diff --git a/src/SDK/Language/Android.php b/src/SDK/Language/Android.php index 55d91d5c57..499b1f2241 100644 --- a/src/SDK/Language/Android.php +++ b/src/SDK/Language/Android.php @@ -44,16 +44,6 @@ public function getFiles(): array 'destination' => 'gradle/wrapper/gradle-wrapper.properties', 'template' => '/android/gradle/wrapper/gradle-wrapper.properties', ], - [ - 'scope' => 'copy', - 'destination' => 'scripts/publish-config.gradle', - 'template' => '/android/scripts/publish-config.gradle', - ], - [ - 'scope' => 'copy', - 'destination' => 'scripts/publish-module.gradle', - 'template' => '/android/scripts/publish-module.gradle', - ], [ 'scope' => 'copy', 'destination' => '.gitignore', @@ -61,8 +51,8 @@ public function getFiles(): array ], [ 'scope' => 'default', - 'destination' => 'build.gradle', - 'template' => '/android/build.gradle.twig', + 'destination' => 'build.gradle.kts', + 'template' => '/android/build.gradle.kts.twig', ], [ 'scope' => 'default', @@ -96,8 +86,8 @@ public function getFiles(): array ], [ 'scope' => 'copy', - 'destination' => 'settings.gradle', - 'template' => '/android/settings.gradle', + 'destination' => 'settings.gradle.kts', + 'template' => '/android/settings.gradle.kts', ], // Config for project :library [ @@ -237,8 +227,8 @@ public function getFiles(): array ], [ 'scope' => 'default', - 'destination' => '/library/build.gradle', - 'template' => '/android/library/build.gradle.twig', + 'destination' => '/library/build.gradle.kts', + 'template' => '/android/library/build.gradle.kts.twig', ], [ 'scope' => 'copy', @@ -343,8 +333,8 @@ public function getFiles(): array ], [ 'scope' => 'default', - 'destination' => '/example/build.gradle', - 'template' => '/android/example/build.gradle.twig', + 'destination' => '/example/build.gradle.kts', + 'template' => '/android/example/build.gradle.kts.twig', ], [ 'scope' => 'copy', diff --git a/src/SDK/Language/Kotlin.php b/src/SDK/Language/Kotlin.php index 024bce9477..8e5f1a065a 100644 --- a/src/SDK/Language/Kotlin.php +++ b/src/SDK/Language/Kotlin.php @@ -513,21 +513,6 @@ public function getFiles(): array 'destination' => 'gradle/wrapper/gradle-wrapper.properties', 'template' => '/kotlin/gradle/wrapper/gradle-wrapper.properties', ], - [ - 'scope' => 'copy', - 'destination' => 'scripts/configure.gradle', - 'template' => '/kotlin/scripts/configure.gradle', - ], - [ - 'scope' => 'copy', - 'destination' => 'scripts/publish.gradle', - 'template' => '/kotlin/scripts/publish.gradle', - ], - [ - 'scope' => 'copy', - 'destination' => 'scripts/setup.gradle', - 'template' => '/kotlin/scripts/setup.gradle', - ], [ 'scope' => 'copy', 'destination' => '.gitignore', @@ -535,8 +520,8 @@ public function getFiles(): array ], [ 'scope' => 'default', - 'destination' => 'build.gradle', - 'template' => '/kotlin/build.gradle.twig', + 'destination' => 'build.gradle.kts', + 'template' => '/kotlin/build.gradle.kts.twig', ], [ 'scope' => 'default', @@ -570,8 +555,8 @@ public function getFiles(): array ], [ 'scope' => 'default', - 'destination' => 'settings.gradle', - 'template' => '/kotlin/settings.gradle.twig', + 'destination' => 'settings.gradle.kts', + 'template' => '/kotlin/settings.gradle.kts.twig', ], [ 'scope' => 'default', diff --git a/templates/android/build.gradle.kts.twig b/templates/android/build.gradle.kts.twig new file mode 100644 index 0000000000..d5244701da --- /dev/null +++ b/templates/android/build.gradle.kts.twig @@ -0,0 +1,43 @@ +import java.util.Properties + +plugins { + id("io.github.gradle-nexus.publish-plugin") version "2.0.0" + id("com.android.library") version "9.1.1" apply false + id("com.android.application") version "9.1.1" apply false +} + +version = System.getenv("SDK_VERSION") ?: "0.0.0" + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} + +val signingKeyId: String = System.getenv("SIGNING_KEY_ID") ?: "" +val signingPassword: String = System.getenv("SIGNING_PASSWORD") ?: "" +val signingSecretKeyRingFile: String = System.getenv("SIGNING_SECRET_KEY_RING_FILE") ?: "" +val ossrhUsername: String = System.getenv("OSSRH_USERNAME") ?: "" +val ossrhPassword: String = System.getenv("OSSRH_PASSWORD") ?: "" +val sonatypeStagingProfileId: String = System.getenv("SONATYPE_STAGING_PROFILE_ID") ?: "" + +val secretPropsFile = project.rootProject.file("local.properties") +val localProperties = Properties().apply { + if (secretPropsFile.exists()) { + secretPropsFile.inputStream().use { load(it) } + } +} + +extra["signing.keyId"] = signingKeyId.ifEmpty { localProperties.getProperty("signing.keyId", "") } +extra["signing.password"] = signingPassword.ifEmpty { localProperties.getProperty("signing.password", "") } +extra["signing.secretKeyRingFile"] = signingSecretKeyRingFile.ifEmpty { localProperties.getProperty("signing.secretKeyRingFile", "") } + +nexusPublishing { + repositories { + sonatype { + stagingProfileId.set(sonatypeStagingProfileId.ifEmpty { localProperties.getProperty("sonatypeStagingProfileId", "") }) + username.set(ossrhUsername.ifEmpty { localProperties.getProperty("ossrhUsername", "") }) + password.set(ossrhPassword.ifEmpty { localProperties.getProperty("ossrhPassword", "") }) + nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/")) + snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/")) + } + } +} diff --git a/templates/android/build.gradle.twig b/templates/android/build.gradle.twig deleted file mode 100644 index a1957d4a17..0000000000 --- a/templates/android/build.gradle.twig +++ /dev/null @@ -1,33 +0,0 @@ -apply plugin: 'io.github.gradle-nexus.publish-plugin' - -// Top-level build file where you can add configuration options common to all sub-projects/modules. -buildscript { - ext.kotlin_version = "1.9.10" - - version System.getenv("SDK_VERSION") - - repositories { - maven { url "https://plugins.gradle.org/m2/" } - google() - mavenCentral() - } - dependencies { - classpath "com.android.tools.build:gradle:8.2.2" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath "io.github.gradle-nexus:publish-plugin:1.3.0" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} - -apply from: "${rootDir}/scripts/publish-config.gradle" - diff --git a/templates/android/example/build.gradle.kts.twig b/templates/android/example/build.gradle.kts.twig new file mode 100644 index 0000000000..7d672b8de0 --- /dev/null +++ b/templates/android/example/build.gradle.kts.twig @@ -0,0 +1,58 @@ +plugins { + id("com.android.application") +} + +android { + namespace = "{{ sdk.namespace | caseDot }}.android" + + compileSdk = 36 + + defaultConfig { + applicationId = "{{ sdk.namespace | caseDot }}.android" + minSdk = 21 + @Suppress("DEPRECATION") + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildFeatures { + dataBinding = true + } + + buildTypes { + release { + isMinifyEnabled = false + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} + +dependencies { + implementation(project(":library")) + + implementation("androidx.core:core-ktx:1.15.0") + implementation("androidx.appcompat:appcompat:1.7.0") + implementation("com.google.android.material:material:1.12.0") + implementation("androidx.constraintlayout:constraintlayout:2.2.0") + implementation("androidx.navigation:navigation-fragment-ktx:2.8.5") + implementation("androidx.fragment:fragment-ktx:1.8.5") + implementation("androidx.navigation:navigation-ui-ktx:2.8.5") + implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.7") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") + + implementation(platform("com.google.firebase:firebase-bom:33.7.0")) + implementation("com.google.firebase:firebase-messaging") + + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.2.1") + androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") +} diff --git a/templates/android/example/build.gradle.twig b/templates/android/example/build.gradle.twig deleted file mode 100644 index 4b720c078d..0000000000 --- a/templates/android/example/build.gradle.twig +++ /dev/null @@ -1,65 +0,0 @@ -plugins { - id 'com.android.application' - id 'kotlin-android' - id 'kotlin-kapt' -} - -android { - namespace "{{ sdk.namespace | caseDot }}.android" - - compileSdkVersion 34 - - defaultConfig { - applicationId "{{ sdk.namespace | caseDot }}.android" - minSdkVersion 21 - targetSdkVersion 34 - versionCode 1 - versionName "1.0" - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildFeatures { - dataBinding true - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } - kotlinOptions { - jvmTarget = '1.8' - } -} - -dependencies { - implementation(project(path: ':library')) - - implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version") - implementation("androidx.core:core-ktx:1.12.0") - implementation("androidx.appcompat:appcompat:1.6.1") - implementation("com.google.android.material:material:1.11.0") - implementation("androidx.constraintlayout:constraintlayout:2.1.4") - implementation("androidx.navigation:navigation-fragment-ktx:2.7.7") - implementation("androidx.fragment:fragment-ktx:1.6.2") - implementation("androidx.navigation:navigation-ui-ktx:2.7.7") - implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0") - implementation("androidx.navigation:navigation-fragment-ktx:2.7.7") - implementation("androidx.navigation:navigation-ui-ktx:2.7.7") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1") - - implementation(platform("com.google.firebase:firebase-bom:32.7.0")) - implementation("com.google.firebase:firebase-messaging") - - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") -} \ No newline at end of file diff --git a/templates/android/gradle/wrapper/gradle-wrapper.properties b/templates/android/gradle/wrapper/gradle-wrapper.properties index ebd754f09d..2f2958b923 100644 --- a/templates/android/gradle/wrapper/gradle-wrapper.properties +++ b/templates/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Tue Jun 01 15:55:54 IST 2021 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/templates/android/library/build.gradle.kts.twig b/templates/android/library/build.gradle.kts.twig new file mode 100644 index 0000000000..b523c47314 --- /dev/null +++ b/templates/android/library/build.gradle.kts.twig @@ -0,0 +1,127 @@ +plugins { + id("com.android.library") + `maven-publish` + signing +} + +val publishGroupId = "{{ sdk.namespace | caseDot }}" +val publishArtifactId = "{{ sdk.gitRepoName | caseDash }}" +val publishVersion: String = System.getenv("SDK_VERSION") ?: "0.0.0" +val pomUrl = "https://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}" +val pomScmUrl = "https://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}" +val pomDescription = "{{ sdk.description }}" +val pomLicenseUrl = "https://opensource.org/licenses/GPL-3.0" +val pomLicenseName = "GPL-3.0" +val pomDeveloperId = "{{ sdk.gitUserName }}" +val pomDeveloperName = "{{ spec.contactName }}" +val pomDeveloperEmail = "{{ spec.contactEmail }}" +val githubScmConnection = "scm:git:git://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}.git" + +version = publishVersion + +android { + namespace = publishGroupId + + compileSdk = 36 + + buildFeatures { + buildConfig = true + } + + defaultConfig { + minSdk = 21 + buildConfigField("String", "SDK_VERSION", "\"$publishVersion\"") + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + } + } + + testOptions { + unitTests.all { + it.systemProperty("robolectric.conscryptMode", "OFF") + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + publishing { + singleVariant("release") { + withSourcesJar() + withJavadocJar() + } + } +} + +dependencies { + api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") + api("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2") + + implementation(platform("com.squareup.okhttp3:okhttp-bom:5.3.2")) + implementation("com.squareup.okhttp3:okhttp") + implementation("com.google.code.gson:gson:2.11.0") + + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7") + implementation("androidx.lifecycle:lifecycle-common-java8:2.8.7") + implementation("androidx.appcompat:appcompat:1.7.0") + implementation("androidx.fragment:fragment-ktx:1.8.5") + implementation("androidx.activity:activity-ktx:1.9.3") + implementation("androidx.browser:browser:1.8.0") + implementation("androidx.core:core-ktx:1.15.0") + + testImplementation("junit:junit:4.13.2") + testImplementation("androidx.test.ext:junit-ktx:1.2.1") + testImplementation("androidx.test:core-ktx:1.6.1") + testImplementation("org.robolectric:robolectric:4.16.1") + testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2") +} + +afterEvaluate { + publishing { + publications { + register("release") { + from(components["release"]) + + groupId = publishGroupId + artifactId = publishArtifactId + version = publishVersion + + pom { + name.set(publishArtifactId) + description.set(pomDescription) + url.set(pomUrl) + + licenses { + license { + name.set(pomLicenseName) + url.set(pomLicenseUrl) + } + } + + developers { + developer { + id.set(pomDeveloperId) + name.set(pomDeveloperName) + email.set(pomDeveloperEmail) + } + } + + scm { + connection.set(githubScmConnection) + url.set(pomScmUrl) + } + } + } + } + } + + signing { + sign(publishing.publications) + } +} diff --git a/templates/android/library/build.gradle.twig b/templates/android/library/build.gradle.twig deleted file mode 100644 index 9be37d2806..0000000000 --- a/templates/android/library/build.gradle.twig +++ /dev/null @@ -1,80 +0,0 @@ -plugins { - id("com.android.library") - id("kotlin-android") -} - -ext { - PUBLISH_GROUP_ID = '{{ sdk.namespace | caseDot }}' - PUBLISH_ARTIFACT_ID = '{{ sdk.gitRepoName | caseDash }}' - PUBLISH_VERSION = System.getenv('SDK_VERSION') - POM_URL = 'https://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}' - POM_SCM_URL = 'https://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}' - POM_ISSUE_URL = 'https://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}/issues' - POM_DESCRIPTION = '{{ sdk.description }}' - POM_LICENSE_URL = 'https://opensource.org/licenses/GPL-3.0' - POM_LICENSE_NAME = "GPL-3.0" - POM_DEVELOPER_ID = '{{ sdk.gitUserName }}' - POM_DEVELOPER_NAME = '{{ spec.contactName }}' - POM_DEVELOPER_EMAIL = '{{ spec.contactEmail }}' - GITHUB_SCM_CONNECTION = 'scm:git:git://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}.git' -} - -version PUBLISH_VERSION - -android { - namespace PUBLISH_GROUP_ID - - compileSdkVersion(34) - - buildFeatures { - buildConfig true - } - - defaultConfig { - minSdkVersion(21) - targetSdkVersion(34) - versionCode = 1 - versionName = "1.0" - buildConfigField "String", "SDK_VERSION", "\"${PUBLISH_VERSION}\"" - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - } - - buildTypes { - release { - minifyEnabled false - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" - ) - } - } - kotlinOptions { - jvmTarget = "1.8" - } -} - -dependencies { - implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version") - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1") - api("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1") - - implementation("com.squareup.okhttp3:okhttp:4.12.0") - implementation("com.google.code.gson:gson:2.10.1") - - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") - implementation("androidx.lifecycle:lifecycle-common-java8:2.7.0") - implementation("androidx.appcompat:appcompat:1.6.1") - implementation("androidx.fragment:fragment-ktx:1.6.2") - implementation("androidx.activity:activity-ktx:1.8.2") - implementation("androidx.browser:browser:1.7.0") - implementation("androidx.core:core-ktx:1.12.0") - - testImplementation("junit:junit:4.13.2") - testImplementation("androidx.test.ext:junit-ktx:1.1.5") - testImplementation("androidx.test:core-ktx:1.5.0") - testImplementation("org.robolectric:robolectric:4.11.1") - testApi("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.1") -} - -apply from: "${rootProject.projectDir}/scripts/publish-module.gradle" diff --git a/templates/android/library/src/main/java/io/package/cookies/ListenableCookieJar.kt.twig b/templates/android/library/src/main/java/io/package/cookies/ListenableCookieJar.kt.twig index 863eb42e1c..e12e145014 100644 --- a/templates/android/library/src/main/java/io/package/cookies/ListenableCookieJar.kt.twig +++ b/templates/android/library/src/main/java/io/package/cookies/ListenableCookieJar.kt.twig @@ -3,14 +3,14 @@ package io.appwrite.cookies import okhttp3.Cookie import okhttp3.CookieJar import okhttp3.HttpUrl -import okhttp3.internal.cookieToString -import okhttp3.internal.delimiterOffset import okhttp3.internal.platform.Platform -import okhttp3.internal.trimSubstring import java.io.IOException import java.net.CookieHandler -import java.net.HttpCookie +import java.text.SimpleDateFormat import java.util.Collections +import java.util.Date +import java.util.Locale +import java.util.TimeZone typealias CookieListener = (existing: List, new: List) -> Unit @@ -29,7 +29,7 @@ class ListenableCookieJar(private val cookieHandler: CookieHandler) : CookieJar val cookieStrings = mutableListOf() for (cookie in cookies) { - cookieStrings.add(cookieToString(cookie, true)) + cookieStrings.add(cookieToString(cookie)) } val multimap = mapOf("Set-Cookie" to cookieStrings) try { @@ -75,10 +75,6 @@ class ListenableCookieJar(private val cookieHandler: CookieHandler) : CookieJar } } - /** - * Convert a request header to OkHttp's cookies via [HttpCookie]. That extra step handles - * multiple cookies in a single request header, which [Cookie.parse] doesn't support. - */ private fun decodeHeaderAsJavaNetCookies(url: HttpUrl, header: String): List { val result = mutableListOf() var pos = 0 @@ -93,14 +89,12 @@ class ListenableCookieJar(private val cookieHandler: CookieHandler) : CookieJar continue } - // We have either name=value or just a name. var value = if (equalsSign < pairEnd) { header.trimSubstring(equalsSign + 1, pairEnd) } else { "" } - // If the value is "quoted", drop the quotes. if (value.startsWith("\"") && value.endsWith("\"")) { value = value.substring(1, value.length - 1) } @@ -116,4 +110,54 @@ class ListenableCookieJar(private val cookieHandler: CookieHandler) : CookieJar } return result } -} \ No newline at end of file + + private fun cookieToString(cookie: Cookie): String = buildString { + append(cookie.name) + append('=') + append(cookie.value) + + if (cookie.persistent) { + if (cookie.expiresAt == Long.MIN_VALUE) { + append("; Max-Age=0") + } else { + append("; Expires=").append(formatHttpDate(cookie.expiresAt)) + } + } + + if (!cookie.hostOnly) { + append("; Domain=").append(cookie.domain) + } + + append("; Path=").append(cookie.path) + + if (cookie.secure) append("; Secure") + if (cookie.httpOnly) append("; HttpOnly") + } + + private fun formatHttpDate(epochMillis: Long): String = + SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US).apply { + timeZone = TimeZone.getTimeZone("GMT") + }.format(Date(epochMillis)) + + private fun String.delimiterOffset(delimiters: String, startIndex: Int, endIndex: Int): Int { + for (i in startIndex until endIndex) { + if (this[i] in delimiters) return i + } + return endIndex + } + + private fun String.delimiterOffset(delimiter: Char, startIndex: Int, endIndex: Int): Int { + for (i in startIndex until endIndex) { + if (this[i] == delimiter) return i + } + return endIndex + } + + private fun String.trimSubstring(startIndex: Int, endIndex: Int): String { + var start = startIndex + var end = endIndex + while (start < end && this[start].isWhitespace()) start++ + while (end > start && this[end - 1].isWhitespace()) end-- + return substring(start, end) + } +} diff --git a/templates/android/library/src/main/java/io/package/models/Model.kt.twig b/templates/android/library/src/main/java/io/package/models/Model.kt.twig index 2f71cedc0a..84056b4ea8 100644 --- a/templates/android/library/src/main/java/io/package/models/Model.kt.twig +++ b/templates/android/library/src/main/java/io/package/models/Model.kt.twig @@ -32,7 +32,7 @@ import {{ sdk.namespace | caseDot }}.enums.{{ property.enumName | caseUcfirst }} ) { fun toMap(): Map = mapOf( {%~ for property in definition.properties %} - "{{ property.name | escapeDollarSign }}" to {% if property.sub_schema %}{% if property.type == 'array' %}{{property.name | escapeKeyword | removeDollarSign}}.map { it.toMap() }{% else %}{{property.name | escapeKeyword | removeDollarSign}}.toMap(){% endif %}{% elseif property.enum %}{{property.name | escapeKeyword | removeDollarSign}}{% if not property.required %}?{% endif %}.value{% else %}{{property.name | escapeKeyword | removeDollarSign}}{% endif %} as Any, + "{{ property.name | escapeDollarSign }}" to {% if property.sub_schema %}{% if property.type == 'array' %}{{property.name | escapeKeyword | removeDollarSign}}{% if not property.required %}?{% endif %}.map { it.toMap() }{% else %}{{property.name | escapeKeyword | removeDollarSign}}{% if not property.required %}?{% endif %}.toMap(){% endif %}{% elseif property.enum %}{{property.name | escapeKeyword | removeDollarSign}}{% if not property.required %}?{% endif %}.value{% else %}{{property.name | escapeKeyword | removeDollarSign}}{% endif %} as Any, {%~ endfor %} {%~ if definition.additionalProperties %} "data" to data!!.jsonCast(to = Map::class.java) diff --git a/templates/android/library/src/main/java/io/package/services/Realtime.kt.twig b/templates/android/library/src/main/java/io/package/services/Realtime.kt.twig index 888d0fa6e2..318ad8824c 100644 --- a/templates/android/library/src/main/java/io/package/services/Realtime.kt.twig +++ b/templates/android/library/src/main/java/io/package/services/Realtime.kt.twig @@ -84,7 +84,8 @@ class Realtime(client: Client) : Service(client), CoroutineScope { random = Random(), pingIntervalMillis = client.http.pingIntervalMillis.toLong(), extensions = null, - minimumDeflateSize = client.http.minWebSocketMessageToCompress + minimumDeflateSize = client.http.minWebSocketMessageToCompress, + webSocketCloseTimeout = client.http.webSocketCloseTimeout.toLong() ) socket = newSocket } diff --git a/templates/android/scripts/publish-config.gradle b/templates/android/scripts/publish-config.gradle deleted file mode 100644 index 5934f92036..0000000000 --- a/templates/android/scripts/publish-config.gradle +++ /dev/null @@ -1,37 +0,0 @@ -// Create variables with empty default values -ext["signing.keyId"] = '' -ext["signing.password"] = '' -ext["signing.secretKeyRingFile"] = '' -ext["ossrhUsername"] = '' -ext["ossrhPassword"] = '' -ext["sonatypeStagingProfileId"] = '' - -File secretPropsFile = project.rootProject.file('local.properties') -if (secretPropsFile.exists()) { - // Read local.properties file first if it exists - Properties p = new Properties() - new FileInputStream(secretPropsFile).withCloseable { is -> p.load(is) } - p.each { name, value -> ext[name] = value } -} - -// Use system environment variables -ext["ossrhUsername"] = System.getenv('OSSRH_USERNAME') ?: ext["ossrhUsername"] -ext["ossrhPassword"] = System.getenv('OSSRH_PASSWORD') ?: ext["ossrhPassword"] -ext["sonatypeStagingProfileId"] = System.getenv('SONATYPE_STAGING_PROFILE_ID') ?: ext["sonatypeStagingProfileId"] -ext["signing.keyId"] = System.getenv('SIGNING_KEY_ID') ?: ext["signing.keyId"] -ext["signing.password"] = System.getenv('SIGNING_PASSWORD') ?: ext["signing.password"] -ext["signing.secretKeyRingFile"] = System.getenv('SIGNING_SECRET_KEY_RING_FILE') ?: ext["signing.secretKeyRingFile"] - - -// Set up Sonatype repository -nexusPublishing { - repositories { - sonatype { - stagingProfileId = sonatypeStagingProfileId - username = ossrhUsername - password = ossrhPassword - nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/")) - snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/")) - } - } -} \ No newline at end of file diff --git a/templates/android/scripts/publish-module.gradle b/templates/android/scripts/publish-module.gradle deleted file mode 100644 index ca97b164b3..0000000000 --- a/templates/android/scripts/publish-module.gradle +++ /dev/null @@ -1,88 +0,0 @@ -apply(plugin: "maven-publish") -apply(plugin: "signing") - -tasks.register("sourcesJar", Jar) { - archiveClassifier.set("sources") - from(android.sourceSets.getByName("main").java.srcDirs) -} - -tasks.register("javadoc", Javadoc) { - source = android.sourceSets.getByName("main").java.srcDirs - setDestinationDir(file("../javadoc/")) - failOnError false -} - -tasks.register("javadocJar", Jar) { - dependsOn(javadoc) - archiveClassifier.set("javadoc") - from(javadoc) -} - -afterEvaluate { - tasks.javadoc.classpath += files(project.android.getBootClasspath()) -} - -publishing { - publications { - release(MavenPublication) { - groupId PUBLISH_GROUP_ID - artifactId PUBLISH_ARTIFACT_ID - version PUBLISH_VERSION - - artifacts { - artifact(sourcesJar) - artifact(javadocJar) - artifact("$buildDir/outputs/aar/${project.name}-release.aar") - } - - pom { - name = PUBLISH_ARTIFACT_ID - description = POM_DESCRIPTION - url = POM_URL - - licenses { - license { - name = POM_LICENSE_NAME - url = POM_LICENSE_URL - } - } - - developers { - developer { - id = POM_DEVELOPER_ID - name = POM_DEVELOPER_NAME - email = POM_DEVELOPER_EMAIL - } - } - - scm { - connection = GITHUB_SCM_CONNECTION - url = POM_SCM_URL - } - - withXml { - def dependencies = asNode().appendNode("dependencies") - - configurations - .getByName("releaseCompileClasspath") - .resolvedConfiguration - .firstLevelModuleDependencies - .forEach { - def dependency = dependencies.appendNode("dependency") - dependency.appendNode("groupId", it.moduleGroup) - dependency.appendNode("artifactId", it.moduleName) - dependency.appendNode("version", it.moduleVersion) - } - } - } - } - } -} - -ext["signing.keyId"] = rootProject.ext["signing.keyId"] -ext["signing.password"] = rootProject.ext["signing.password"] -ext["signing.secretKeyRingFile"] = rootProject.ext["signing.secretKeyRingFile"] - -signing { - sign publishing.publications -} \ No newline at end of file diff --git a/templates/android/settings.gradle b/templates/android/settings.gradle deleted file mode 100644 index 423c64efea..0000000000 --- a/templates/android/settings.gradle +++ /dev/null @@ -1,3 +0,0 @@ -rootProject.name = "Appwrite Android SDK" -include ':example' -include ':library' \ No newline at end of file diff --git a/templates/android/settings.gradle.kts b/templates/android/settings.gradle.kts new file mode 100644 index 0000000000..e023795fbc --- /dev/null +++ b/templates/android/settings.gradle.kts @@ -0,0 +1,19 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = "Appwrite Android SDK" +include(":example") +include(":library") diff --git a/templates/apple/Package.swift.twig b/templates/apple/Package.swift.twig index b8d3e4008b..41f4e821de 100644 --- a/templates/apple/Package.swift.twig +++ b/templates/apple/Package.swift.twig @@ -1,4 +1,4 @@ -// swift-tools-version:5.1 +// swift-tools-version:6.0 import PackageDescription @@ -6,9 +6,9 @@ let package = Package( name: "{{spec.title | caseUcfirst}}", platforms: [ .iOS("15.0"), - .macOS("11.0"), - .watchOS("7.0"), - .tvOS("13.0"), + .macOS("12.0"), + .watchOS("8.0"), + .tvOS("15.0"), ], products: [ .library( @@ -22,8 +22,8 @@ let package = Package( ), ], dependencies: [ - .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.19.0"), - .package(url: "https://github.com/apple/swift-nio.git", from: "2.58.0"), + .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.33.0"), + .package(url: "https://github.com/apple/swift-nio.git", from: "2.94.0"), ], targets: [ .target( @@ -67,4 +67,4 @@ let package = Package( ) ], swiftLanguageVersions: [.v5] -) \ No newline at end of file +) diff --git a/templates/kotlin/build.gradle.kts.twig b/templates/kotlin/build.gradle.kts.twig new file mode 100644 index 0000000000..ce8e4b4ea0 --- /dev/null +++ b/templates/kotlin/build.gradle.kts.twig @@ -0,0 +1,140 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import java.util.Properties + +plugins { + kotlin("jvm") version "2.3.20" + `java-library` + `maven-publish` + signing + id("io.github.gradle-nexus.publish-plugin") version "2.0.0" +} + +val publishGroupId = "{{ sdk.namespace | caseDot }}" +val publishArtifactId = "{{ sdk.gitRepoName | caseDash }}" +val publishVersion: String = System.getenv("SDK_VERSION") ?: "0.0.0" +val pomUrl = "https://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}" +val pomScmUrl = "https://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}" +val pomDescription = "{{ sdk.description }}" +val pomLicenseUrl = "https://opensource.org/licenses/GPL-3.0" +val pomLicenseName = "GPL-3.0" +val pomDeveloperId = "{{ sdk.gitUserName }}" +val pomDeveloperName = "{{ spec.contactName }}" +val pomDeveloperEmail = "{{ spec.contactEmail }}" +val githubScmConnection = "scm:git:git://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}.git" + +version = publishVersion + +repositories { + mavenCentral() +} + +dependencies { + api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2") + + api(platform("com.squareup.okhttp3:okhttp-bom:5.3.2")) + api("com.squareup.okhttp3:okhttp") + + implementation("com.squareup.okhttp3:okhttp-urlconnection") + implementation("com.squareup.okhttp3:logging-interceptor") + implementation("com.google.code.gson:gson:2.11.0") + + testImplementation(kotlin("test-junit")) +} + +tasks.test { + useJUnit() +} + +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_11) + } +} + +val signingKeyId: String = System.getenv("SIGNING_KEY_ID") ?: "" +val signingPassword: String = System.getenv("SIGNING_PASSWORD") ?: "" +val signingSecretKeyRingFile: String = System.getenv("SIGNING_SECRET_KEY_RING_FILE") ?: "" +val ossrhUsername: String = System.getenv("OSSRH_USERNAME") ?: "" +val ossrhPassword: String = System.getenv("OSSRH_PASSWORD") ?: "" +val sonatypeStagingProfileId: String = System.getenv("SONATYPE_STAGING_PROFILE_ID") ?: "" + +val secretPropsFile = project.rootProject.file("local.properties") +val localProperties = Properties().apply { + if (secretPropsFile.exists()) { + secretPropsFile.inputStream().use { load(it) } + } +} + +extra["signing.keyId"] = signingKeyId.ifEmpty { localProperties.getProperty("signing.keyId", "") } +extra["signing.password"] = signingPassword.ifEmpty { localProperties.getProperty("signing.password", "") } +extra["signing.secretKeyRingFile"] = signingSecretKeyRingFile.ifEmpty { localProperties.getProperty("signing.secretKeyRingFile", "") } + +nexusPublishing { + repositories { + sonatype { + stagingProfileId.set(sonatypeStagingProfileId.ifEmpty { localProperties.getProperty("sonatypeStagingProfileId", "") }) + username.set(ossrhUsername.ifEmpty { localProperties.getProperty("ossrhUsername", "") }) + password.set(ossrhPassword.ifEmpty { localProperties.getProperty("ossrhPassword", "") }) + nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/")) + snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/")) + } + } +} + +java { + withJavadocJar() + withSourcesJar() + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 +} + +publishing { + publications { + register("mavenJava") { + from(components["java"]) + + groupId = publishGroupId + artifactId = publishArtifactId + version = publishVersion + + versionMapping { + usage("java-api") { + fromResolutionOf("runtimeClasspath") + } + usage("java-runtime") { + fromResolutionResult() + } + } + + pom { + name.set(publishArtifactId) + description.set(pomDescription) + url.set(pomUrl) + + licenses { + license { + name.set(pomLicenseName) + url.set(pomLicenseUrl) + } + } + + developers { + developer { + id.set(pomDeveloperId) + name.set(pomDeveloperName) + email.set(pomDeveloperEmail) + } + } + + scm { + connection.set(githubScmConnection) + url.set(pomScmUrl) + } + } + } + } +} + +signing { + sign(publishing.publications) +} diff --git a/templates/kotlin/build.gradle.twig b/templates/kotlin/build.gradle.twig deleted file mode 100644 index b5feaed620..0000000000 --- a/templates/kotlin/build.gradle.twig +++ /dev/null @@ -1,58 +0,0 @@ -plugins { - id "org.jetbrains.kotlin.jvm" version '1.9.10' - id "java-library" - id "io.github.gradle-nexus.publish-plugin" version "1.3.0" -} - -apply from: "${rootDir}/scripts/configure.gradle" - -ext { - PUBLISH_GROUP_ID = '{{ sdk.namespace | caseDot }}' - PUBLISH_ARTIFACT_ID = '{{ sdk.gitRepoName | caseDash }}' - PUBLISH_VERSION = System.getenv('SDK_VERSION') - POM_URL = 'https://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}' - POM_SCM_URL = 'https://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}' - POM_ISSUE_URL = 'https://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}/issues' - POM_DESCRIPTION = '{{ sdk.description }}' - POM_LICENSE_URL = 'https://opensource.org/licenses/GPL-3.0' - POM_LICENSE_NAME = "GPL-3.0" - POM_DEVELOPER_ID = '{{ sdk.gitUserName }}' - POM_DEVELOPER_NAME = '{{ spec.contactName }}' - POM_DEVELOPER_EMAIL = '{{ spec.contactEmail }}' - GITHUB_SCM_CONNECTION = 'scm:git:git://github.com/{{ sdk.gitUserName }}/{{ sdk.gitRepoName }}.git' -} - -version PUBLISH_VERSION - -repositories { - mavenCentral() -} - -dependencies { - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1") - - api(platform("com.squareup.okhttp3:okhttp-bom:4.12.0")) - api("com.squareup.okhttp3:okhttp") - - implementation("com.squareup.okhttp3:okhttp-urlconnection") - implementation("com.squareup.okhttp3:logging-interceptor") - implementation("com.google.code.gson:gson:2.9.0") - - testImplementation("org.jetbrains.kotlin:kotlin-test-junit") -} - -test { - useJUnit() -} - -compileKotlin { - dependsOn createBuildConfig - kotlinOptions.jvmTarget = '1.8' -} - -compileTestKotlin { - kotlinOptions.jvmTarget = '1.8' -} - -apply from: "${rootDir}/scripts/setup.gradle" -apply from: "${rootDir}/scripts/publish.gradle" diff --git a/templates/kotlin/gradle/wrapper/gradle-wrapper.properties b/templates/kotlin/gradle/wrapper/gradle-wrapper.properties index 60c76b3408..d706aba609 100644 --- a/templates/kotlin/gradle/wrapper/gradle-wrapper.properties +++ b/templates/kotlin/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists \ No newline at end of file +zipStorePath=wrapper/dists diff --git a/templates/kotlin/scripts/configure.gradle b/templates/kotlin/scripts/configure.gradle deleted file mode 100644 index ff38c1076e..0000000000 --- a/templates/kotlin/scripts/configure.gradle +++ /dev/null @@ -1,14 +0,0 @@ -task createBuildConfig() { - doLast { - def file = new File("${buildDir.path}/generated/BuildConfig.java") - file.getParentFile().mkdirs() - file.createNewFile() - file.text = """ - public class BuildConfig { - public static String SDK_VERSION = "${System.getenv("SDK_VERSION") ?: "0.0.0"}"; - } - """.stripIndent().trim() - } -} - -sourceSets.main.java.srcDirs += ["${buildDir.path}/generated"] \ No newline at end of file diff --git a/templates/kotlin/scripts/publish.gradle b/templates/kotlin/scripts/publish.gradle deleted file mode 100644 index c8c511010a..0000000000 --- a/templates/kotlin/scripts/publish.gradle +++ /dev/null @@ -1,65 +0,0 @@ -apply(plugin: "maven-publish") -apply(plugin: "signing") - -java { - withJavadocJar() - withSourcesJar() - toolchain { - languageVersion = JavaLanguageVersion.of(8) - } -} - -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - - groupId = PUBLISH_GROUP_ID - artifactId = PUBLISH_ARTIFACT_ID - version = PUBLISH_VERSION - - versionMapping { - usage('java-api') { - fromResolutionOf('runtimeClasspath') - } - usage('java-runtime') { - fromResolutionResult() - } - } - - pom { - name = PUBLISH_ARTIFACT_ID - description = POM_DESCRIPTION - url = POM_URL - - licenses { - license { - name = POM_LICENSE_NAME - url = POM_LICENSE_URL - } - } - - developers { - developer { - id = POM_DEVELOPER_ID - name = POM_DEVELOPER_NAME - email = POM_DEVELOPER_EMAIL - } - } - - scm { - connection = GITHUB_SCM_CONNECTION - url = POM_SCM_URL - } - } - } - } -} - -ext["signing.keyId"] = rootProject.ext["signing.keyId"] -ext["signing.password"] = rootProject.ext["signing.password"] -ext["signing.secretKeyRingFile"] = rootProject.ext["signing.secretKeyRingFile"] - -signing { - sign publishing.publications -} \ No newline at end of file diff --git a/templates/kotlin/scripts/setup.gradle b/templates/kotlin/scripts/setup.gradle deleted file mode 100644 index cd94c1dd60..0000000000 --- a/templates/kotlin/scripts/setup.gradle +++ /dev/null @@ -1,36 +0,0 @@ -// Create variables with empty default values -ext["signing.keyId"] = '' -ext["signing.password"] = '' -ext["signing.secretKeyRingFile"] = '' -ext["ossrhUsername"] = '' -ext["ossrhPassword"] = '' -ext["sonatypeStagingProfileId"] = '' - -File secretPropsFile = project.rootProject.file('local.properties') -if (secretPropsFile.exists()) { - // Read local.properties file first if it exists - Properties p = new Properties() - new FileInputStream(secretPropsFile).withCloseable { is -> p.load(is) } - p.each { name, value -> ext[name] = value } -} - -// Use system environment variables -ext["ossrhUsername"] = System.getenv('OSSRH_USERNAME') ?: ext["ossrhUsername"] -ext["ossrhPassword"] = System.getenv('OSSRH_PASSWORD') ?: ext["ossrhPassword"] -ext["sonatypeStagingProfileId"] = System.getenv('SONATYPE_STAGING_PROFILE_ID') ?: ext["sonatypeStagingProfileId"] -ext["signing.keyId"] = System.getenv('SIGNING_KEY_ID') ?: ext["signing.keyId"] -ext["signing.password"] = System.getenv('SIGNING_PASSWORD') ?: ext["signing.password"] -ext["signing.secretKeyRingFile"] = System.getenv('SIGNING_SECRET_KEY_RING_FILE') ?: ext["signing.secretKeyRingFile"] - -// Set up Sonatype repository using OSSRH Staging API -nexusPublishing { - repositories { - sonatype { - stagingProfileId = sonatypeStagingProfileId - username = ossrhUsername - password = ossrhPassword - nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/")) - snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/")) - } - } -} \ No newline at end of file diff --git a/templates/kotlin/settings.gradle.kts.twig b/templates/kotlin/settings.gradle.kts.twig new file mode 100644 index 0000000000..d630a3b93b --- /dev/null +++ b/templates/kotlin/settings.gradle.kts.twig @@ -0,0 +1 @@ +rootProject.name = "{{ sdk.gitRepoName | caseDash }}" diff --git a/templates/kotlin/settings.gradle.twig b/templates/kotlin/settings.gradle.twig deleted file mode 100644 index fe5085a161..0000000000 --- a/templates/kotlin/settings.gradle.twig +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = '{{ sdk.gitRepoName | caseDash }}' - diff --git a/templates/kotlin/src/main/kotlin/io/appwrite/models/Model.kt.twig b/templates/kotlin/src/main/kotlin/io/appwrite/models/Model.kt.twig index 2f71cedc0a..84056b4ea8 100644 --- a/templates/kotlin/src/main/kotlin/io/appwrite/models/Model.kt.twig +++ b/templates/kotlin/src/main/kotlin/io/appwrite/models/Model.kt.twig @@ -32,7 +32,7 @@ import {{ sdk.namespace | caseDot }}.enums.{{ property.enumName | caseUcfirst }} ) { fun toMap(): Map = mapOf( {%~ for property in definition.properties %} - "{{ property.name | escapeDollarSign }}" to {% if property.sub_schema %}{% if property.type == 'array' %}{{property.name | escapeKeyword | removeDollarSign}}.map { it.toMap() }{% else %}{{property.name | escapeKeyword | removeDollarSign}}.toMap(){% endif %}{% elseif property.enum %}{{property.name | escapeKeyword | removeDollarSign}}{% if not property.required %}?{% endif %}.value{% else %}{{property.name | escapeKeyword | removeDollarSign}}{% endif %} as Any, + "{{ property.name | escapeDollarSign }}" to {% if property.sub_schema %}{% if property.type == 'array' %}{{property.name | escapeKeyword | removeDollarSign}}{% if not property.required %}?{% endif %}.map { it.toMap() }{% else %}{{property.name | escapeKeyword | removeDollarSign}}{% if not property.required %}?{% endif %}.toMap(){% endif %}{% elseif property.enum %}{{property.name | escapeKeyword | removeDollarSign}}{% if not property.required %}?{% endif %}.value{% else %}{{property.name | escapeKeyword | removeDollarSign}}{% endif %} as Any, {%~ endfor %} {%~ if definition.additionalProperties %} "data" to data!!.jsonCast(to = Map::class.java) diff --git a/templates/swift/Package.swift.twig b/templates/swift/Package.swift.twig index b8d3e4008b..41f4e821de 100644 --- a/templates/swift/Package.swift.twig +++ b/templates/swift/Package.swift.twig @@ -1,4 +1,4 @@ -// swift-tools-version:5.1 +// swift-tools-version:6.0 import PackageDescription @@ -6,9 +6,9 @@ let package = Package( name: "{{spec.title | caseUcfirst}}", platforms: [ .iOS("15.0"), - .macOS("11.0"), - .watchOS("7.0"), - .tvOS("13.0"), + .macOS("12.0"), + .watchOS("8.0"), + .tvOS("15.0"), ], products: [ .library( @@ -22,8 +22,8 @@ let package = Package( ), ], dependencies: [ - .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.19.0"), - .package(url: "https://github.com/apple/swift-nio.git", from: "2.58.0"), + .package(url: "https://github.com/swift-server/async-http-client.git", from: "1.33.0"), + .package(url: "https://github.com/apple/swift-nio.git", from: "2.94.0"), ], targets: [ .target( @@ -67,4 +67,4 @@ let package = Package( ) ], swiftLanguageVersions: [.v5] -) \ No newline at end of file +) diff --git a/tests/Android14Java11Test.php b/tests/Android14Java11Test.php deleted file mode 100644 index 0be9d0edca..0000000000 --- a/tests/Android14Java11Test.php +++ /dev/null @@ -1,40 +0,0 @@ -&2 && cat library/result.txt"'; protected array $expectedOutput = [ ...Base::PING_RESPONSE, diff --git a/tests/Android14Java8Test.php b/tests/Android14Java8Test.php deleted file mode 100644 index 4eea753c2f..0000000000 --- a/tests/Android14Java8Test.php +++ /dev/null @@ -1,40 +0,0 @@ -&2 && cat library/result.txt"'; protected array $expectedOutput = [ ...Base::PING_RESPONSE, diff --git a/tests/AppleSwift56Test.php b/tests/AppleSwift56Test.php index cc062dba11..b193468e10 100644 --- a/tests/AppleSwift56Test.php +++ b/tests/AppleSwift56Test.php @@ -16,7 +16,7 @@ class AppleSwift56Test extends Base 'cp tests/languages/apple/Tests.swift tests/sdks/apple/Tests/AppwriteTests/Tests.swift', ]; protected string $command = - 'docker run --network="mockapi" --rm -v $(pwd):/app -w /app/tests/sdks/apple swift:5.6-focal swift test'; + 'docker run --network="mockapi" --rm -v $(pwd):/app -w /app/tests/sdks/apple swift:6.0-jammy swift test'; protected array $expectedOutput = [ ...Base::PING_RESPONSE, diff --git a/tests/KotlinJava11Test.php b/tests/KotlinJava11Test.php deleted file mode 100644 index 5a2e76ef67..0000000000 --- a/tests/KotlinJava11Test.php +++ /dev/null @@ -1,37 +0,0 @@ -