From e493ca805900e0df027dea9af2ec4efcec0bf2bd Mon Sep 17 00:00:00 2001 From: Alec Kazakova Date: Fri, 1 Dec 2023 13:17:31 -0500 Subject: [PATCH 001/304] Prepare next development version. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 87c6522fd80..09c5423dcc4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=1g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 GROUP=app.cash.sqldelight -VERSION_NAME=2.0.1 +VERSION_NAME=2.1.0-SNAPSHOT POM_URL=https://github.com/cashapp/sqldelight/ POM_SCM_URL=https://github.com/cashapp/sqldelight/ From 232d77241abcedb06e7c49050fdc3320d431091b Mon Sep 17 00:00:00 2001 From: Alec Kazakova <1675456+AlecKazakova@users.noreply.github.com> Date: Fri, 1 Dec 2023 14:46:51 -0500 Subject: [PATCH 002/304] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1362b33d6c6..b25218404f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## [2.0.1] - 2023-01-01 +## [2.0.1] - 2023-12-01 ### Added - [Compiler] Add support multi-column-expr when doing a SELECT (#4453 by [Adriel Martinez][Adriel-M]) From cd2d1a38c430ac9e77440b99fb9f525473d3039f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 08:17:00 -0500 Subject: [PATCH 003/304] Update plugin spotless to v6.23.3 (#4876) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 04bdf87346a..33551d5ea57 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -104,7 +104,7 @@ dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } intellij = { id = "org.jetbrains.intellij", version = "1.16.1" } grammarKitComposer = { id = "com.alecstrong.grammar.kit.composer", version = "0.1.12" } publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } -spotless = { id = "com.diffplug.spotless", version = "6.23.2" } +spotless = { id = "com.diffplug.spotless", version = "6.23.3" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } ksp = { id = "com.google.devtools.ksp", version = "1.9.21-1.0.15" } From 891aca1a96d2466e37003c5c122857fcf56d6621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 4 Dec 2023 13:24:42 +0000 Subject: [PATCH 004/304] Fix postgresql alter table alter column (#4868) * Fix multiple tables in migration Matches the correct table if there are more than one table in the migration Removes the null check as one table is expected to be available in the alter table clause * Tests include two tables Shows that two tables can be migrated --- .../mixins/AlterTableAlterColumnMixin.kt | 9 +++++---- .../com/example/1.sqm | 6 +++++- .../com/example/2.sqm | 7 ++++--- .../com/example/3.sqm | 3 ++- .../com/example/Data.sq | 5 ++++- .../output/com/example/DataQueries.kt | 20 ++++++++++++++----- .../output/com/example/Test_1.kt | 7 +++++++ .../output/com/example/{Test.kt => Test_2.kt} | 2 +- 8 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_1.kt rename sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/{Test.kt => Test_2.kt} (89%) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt index f833922a122..db84ef86b90 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt @@ -22,10 +22,10 @@ internal abstract class AlterTableAlterColumnMixin( AlterTableApplier { override fun getColumnConstraintList(): MutableList { - return alterStmt.tablesAvailable(this).first() - .query.columns.firstOrNull { it.element.textMatches(columnName) }?.element?.let { + return alterStmt.tablesAvailable(this).first { it.tableName.textMatches(alterStmt.tableName) } + .query.columns.first { it.element.textMatches(columnName) }.element.let { (it.parent as SqlColumnDef).columnConstraintList - } ?: mutableListOf() + } } override fun getColumnName(): SqlColumnName { @@ -37,7 +37,8 @@ internal abstract class AlterTableAlterColumnMixin( if (sqlColumnType != null) return sqlColumnType val columnName = columnName - val element = tablesAvailable(this).first().query.columns.first { it.element.textMatches(columnName) }.element + val element = tablesAvailable(this).first { it.tableName.textMatches(alterStmt.tableName) } + .query.columns.first { it.element.textMatches(columnName) }.element return (element.parent as ColumnDefMixin).columnType } diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/1.sqm b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/1.sqm index c9371889562..e57a9d9d1a3 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/1.sqm +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/1.sqm @@ -1,4 +1,8 @@ -CREATE TABLE test ( +CREATE TABLE test_1 ( + first INTEGER +); + +CREATE TABLE test_2 ( first TEXT NOT NULL, second INTEGER, third TEXT NOT NULL, diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/2.sqm b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/2.sqm index ba63fcf937d..bb768b370cd 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/2.sqm +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/2.sqm @@ -1,3 +1,4 @@ -ALTER TABLE test ALTER COLUMN first DROP NOT NULL; -ALTER TABLE test ALTER COLUMN second SET NOT NULL; -ALTER TABLE test ALTER COLUMN fifth DROP NOT NULL; +ALTER TABLE test_1 ALTER COLUMN first SET NOT NULL; +ALTER TABLE test_2 ALTER COLUMN first DROP NOT NULL; +ALTER TABLE test_2 ALTER COLUMN second SET NOT NULL; +ALTER TABLE test_2 ALTER COLUMN fifth DROP NOT NULL; diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/3.sqm b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/3.sqm index ce7274899be..eb6de13f38d 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/3.sqm +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/3.sqm @@ -1 +1,2 @@ -ALTER TABLE test ALTER COLUMN fifth TYPE BIGINT; +ALTER TABLE test_1 ALTER COLUMN first TYPE BIGINT; +ALTER TABLE test_2 ALTER COLUMN fifth TYPE BIGINT; diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/Data.sq b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/Data.sq index 0b7b7438929..61c7961d6c9 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/Data.sq +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/Data.sq @@ -1,2 +1,5 @@ insertFirst: -INSERT INTO test (first, second, third, fourth, fifth) VALUES (?, ?, ?, ?, ?); +INSERT INTO test_1 (first) VALUES (?); + +insertSecond: +INSERT INTO test_2 (first, second, third, fourth, fifth) VALUES (?, ?, ?, ?, ?); diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt index 70e89cfff42..cf94dbb908c 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt @@ -10,15 +10,25 @@ import kotlin.String public class DataQueries( driver: SqlDriver, ) : TransacterImpl(driver) { - public fun insertFirst( + public fun insertFirst(first: Long) { + driver.execute(-2_134_278_654, """INSERT INTO test_1 (first) VALUES (?)""", 1) { + check(this is JdbcPreparedStatement) + bindLong(0, first) + } + notifyQueries(-2_134_278_654) { emit -> + emit("test_1") + } + } + + public fun insertSecond( first: String?, second: Int, third: String, fourth: Int?, fifth: Long?, ) { - driver.execute(-2_134_278_654, - """INSERT INTO test (first, second, third, fourth, fifth) VALUES (?, ?, ?, ?, ?)""", 5) { + driver.execute(-1_370_094_750, + """INSERT INTO test_2 (first, second, third, fourth, fifth) VALUES (?, ?, ?, ?, ?)""", 5) { check(this is JdbcPreparedStatement) bindString(0, first) bindInt(1, second) @@ -26,8 +36,8 @@ public class DataQueries( bindInt(3, fourth) bindLong(4, fifth) } - notifyQueries(-2_134_278_654) { emit -> - emit("test") + notifyQueries(-1_370_094_750) { emit -> + emit("test_2") } } } diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_1.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_1.kt new file mode 100644 index 00000000000..1a3a9a0fb71 --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_1.kt @@ -0,0 +1,7 @@ +package com.example + +import kotlin.Long + +public data class Test_1( + public val first: Long, +) diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_2.kt similarity index 89% rename from sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test.kt rename to sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_2.kt index ea17af9c815..1d8fb6a9202 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test.kt +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_2.kt @@ -4,7 +4,7 @@ import kotlin.Int import kotlin.Long import kotlin.String -public data class Test( +public data class Test_2( public val first: String?, public val second: Int, public val third: String, From 7d0ec0039723506a5b37f2d4b6ddc1a7a49524d9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 13:52:39 +0000 Subject: [PATCH 005/304] Update dependency com.squareup:kotlinpoet to v1.15.3 (#4878) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 33551d5ea57..41fca5a664d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -35,7 +35,7 @@ androidx-paging3-runtime = { module = "androidx.paging:paging-runtime", version. androidx-recyclerView = { module = "androidx.recyclerview:recyclerview", version = "1.3.2" } android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp" } -kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.15.2" } +kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.15.3" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } truth = { module = "com.google.truth:truth", version = "1.1.5" } From b558dd6ca573334c1456b47daa44c1893c822c36 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 15:49:16 -0500 Subject: [PATCH 006/304] Update actions/configure-pages action to v4 (#4881) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/Publish-Website.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Publish-Website.yml b/.github/workflows/Publish-Website.yml index 77963225b34..f93e49173d9 100644 --- a/.github/workflows/Publish-Website.yml +++ b/.github/workflows/Publish-Website.yml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout the repo uses: actions/checkout@v4 - - uses: actions/configure-pages@v3 + - uses: actions/configure-pages@v4 - name: Set up Java uses: actions/setup-java@v4.0.0 with: From 89343c9e63340a186804b74f4860f841295700e9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 15:49:36 -0500 Subject: [PATCH 007/304] Update dependency co.touchlab:stately-concurrency to v2.0.6 (#4874) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 41fca5a664d..054d6a33e44 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -76,7 +76,7 @@ schemaCrawler-sqlite = { module = "us.fatehi:schemacrawler-sqlite", version.ref objectDiff = { module = "de.danielbechler:java-object-diff", version = "0.95" } sqliter = { module = "co.touchlab:sqliter-driver", version.ref = "sqliter" } -stately-concurrency = { module = "co.touchlab:stately-concurrency", version = "2.0.5" } +stately-concurrency = { module = "co.touchlab:stately-concurrency", version = "2.0.6" } testhelp = { module = "co.touchlab:testhelp", version = "0.6.11" } burst = { module = "com.squareup.burst:burst-junit4", version = "1.2.0" } From a7fd7b03e0b90c3ea0799c8009db4fe476221065 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Dec 2023 14:27:14 -0500 Subject: [PATCH 008/304] Update plugin com.gradle.enterprise to v3.16 (#4887) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index eeba256dd22..03eb8ce75dc 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.15.1" + id "com.gradle.enterprise" version "3.16" id "org.gradle.toolchains.foojay-resolver-convention" version "0.7.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index 1ddea716450..1d6497bed21 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.15.1" + id "com.gradle.enterprise" version "3.16" id "org.gradle.toolchains.foojay-resolver-convention" version "0.7.0" } diff --git a/settings.gradle b/settings.gradle index f21e843b4cc..64902135bd0 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.15.1" + id "com.gradle.enterprise" version "3.16" id "org.gradle.toolchains.foojay-resolver-convention" version "0.7.0" } From b2b93a20fe5b2f3b82cc178255db11e85776a932 Mon Sep 17 00:00:00 2001 From: Eliezer Graber Date: Tue, 5 Dec 2023 14:31:24 -0500 Subject: [PATCH 009/304] Allow overriding the type nullability in encapsulatingType (#4882) - For preferKotlinType in the homogeneous types case, the first type is selected - For a function like coalesce that's not correct since any non null arg makes the return not nullable - The previous behavior is maintained by making the nullability parameter null (which is the default) --- .../dialects/hsql/HsqlTypeResolver.kt | 4 +++- .../dialects/mysql/MySqlTypeResolver.kt | 9 +++++++-- .../postgresql/PostgreSqlTypeResolver.kt | 9 +++++++-- .../sqldelight/dialect/api/TypeResolver.kt | 20 ++++++++++--------- .../sqldelight/core/lang/util/ExprUtil.kt | 12 ++++++----- .../sqldelight/core/queries/ExpressionTest.kt | 10 ++++++++-- 6 files changed, 43 insertions(+), 21 deletions(-) diff --git a/dialects/hsql/src/main/kotlin/app/cash/sqldelight/dialects/hsql/HsqlTypeResolver.kt b/dialects/hsql/src/main/kotlin/app/cash/sqldelight/dialects/hsql/HsqlTypeResolver.kt index 58dc83a894e..9a03a0a15ea 100644 --- a/dialects/hsql/src/main/kotlin/app/cash/sqldelight/dialects/hsql/HsqlTypeResolver.kt +++ b/dialects/hsql/src/main/kotlin/app/cash/sqldelight/dialects/hsql/HsqlTypeResolver.kt @@ -42,7 +42,9 @@ class HsqlTypeResolver(private val parentResolver: TypeResolver) : TypeResolver } private fun SqlFunctionExpr.hsqlFunctionType() = when (functionName.text.lowercase()) { - "coalesce", "ifnull" -> encapsulatingTypePreferringKotlin(exprList, TINY_INT, SMALL_INT, HsqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB) + "coalesce", "ifnull" -> encapsulatingTypePreferringKotlin(exprList, TINY_INT, SMALL_INT, HsqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB, nullability = { exprListNullability -> + exprListNullability.all { it } + }) "greatest" -> encapsulatingTypePreferringKotlin( exprList, TINY_INT, diff --git a/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/MySqlTypeResolver.kt b/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/MySqlTypeResolver.kt index fe4ae5ded95..859fd401911 100644 --- a/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/MySqlTypeResolver.kt +++ b/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/MySqlTypeResolver.kt @@ -60,7 +60,10 @@ class MySqlTypeResolver( } else { encapsulatingType( exprList = expr.getExprList(), - nullableIfAny = (expr is SqlBinaryAddExpr || expr is SqlBinaryMultExpr || expr is SqlBinaryPipeExpr), + nullability = { exprListNullability -> + (expr is SqlBinaryAddExpr || expr is SqlBinaryMultExpr || expr is SqlBinaryPipeExpr) && + exprListNullability.any { it } + }, TINY_INT, SMALL_INT, MySqlType.INTEGER, @@ -131,7 +134,9 @@ class MySqlTypeResolver( INTEGER, ) "sin", "cos", "tan" -> IntermediateType(REAL) - "coalesce", "ifnull" -> encapsulatingTypePreferringKotlin(exprList, TINY_INT, SMALL_INT, MySqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB) + "coalesce", "ifnull" -> encapsulatingTypePreferringKotlin(exprList, TINY_INT, SMALL_INT, MySqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB, nullability = { exprListNullability -> + exprListNullability.all { it } + }) "max" -> encapsulatingTypePreferringKotlin( exprList, TINY_INT, diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index ed7f882f2b8..b4da5d60e36 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -119,7 +119,9 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "concat" -> encapsulatingType(exprList, TEXT) "substring", "replace" -> IntermediateType(TEXT).nullableIf(resolvedType(exprList[0]).javaType.isNullable) "starts_with" -> IntermediateType(BOOLEAN) - "coalesce", "ifnull" -> encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB) + "coalesce", "ifnull" -> encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB, nullability = { exprListNullability -> + exprListNullability.all { it } + }) "max" -> encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() "min" -> encapsulatingTypePreferringKotlin(exprList, BLOB, TEXT, SMALL_INT, INTEGER, PostgreSqlType.INTEGER, BIG_INT, REAL, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() "sum" -> { @@ -216,7 +218,10 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes } else { encapsulatingType( exprList = getExprList(), - nullableIfAny = this is SqlBinaryAddExpr || this is SqlBinaryMultExpr || this is SqlBinaryPipeExpr, + nullability = { exprListNullability -> + (this is SqlBinaryAddExpr || this is SqlBinaryMultExpr || this is SqlBinaryPipeExpr) && + exprListNullability.any { it } + }, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, diff --git a/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/TypeResolver.kt b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/TypeResolver.kt index 1398773a5ba..a3b16d36de1 100644 --- a/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/TypeResolver.kt +++ b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/TypeResolver.kt @@ -44,7 +44,7 @@ interface TypeResolver { fun TypeResolver.encapsulatingType( exprList: List, vararg typeOrder: DialectType, -) = encapsulatingType(exprList = exprList, nullableIfAny = false, typeOrder = typeOrder) +) = encapsulatingType(exprList = exprList, nullability = null, typeOrder = typeOrder) /** * @return the type from the expr list which is the highest order in the typeOrder list @@ -52,15 +52,15 @@ fun TypeResolver.encapsulatingType( fun TypeResolver.encapsulatingTypePreferringKotlin( exprList: List, vararg typeOrder: DialectType, - nullableIfAny: Boolean = false, -) = encapsulatingType(exprList = exprList, nullableIfAny = nullableIfAny, preferKotlinType = true, typeOrder = typeOrder) + nullability: ((List) -> Boolean)? = null, +) = encapsulatingType(exprList = exprList, nullability = nullability, preferKotlinType = true, typeOrder = typeOrder) /** * @return the type from the expr list which is the highest order in the typeOrder list */ fun TypeResolver.encapsulatingType( exprList: List, - nullableIfAny: Boolean, + nullability: ((List) -> Boolean)?, vararg typeOrder: DialectType, preferKotlinType: Boolean = false, ): IntermediateType { @@ -86,10 +86,12 @@ fun TypeResolver.encapsulatingType( IntermediateType(typeOrder.last { it in sqlTypes }) } - if (!nullableIfAny && types.all { it.javaType.isNullable } || - nullableIfAny && types.any { it.javaType.isNullable } - ) { - return type.asNullable() + val exprListNullability = types.map { it.javaType.isNullable } + return when (nullability) { + null -> when { + exprListNullability.all { it } -> type.asNullable() + else -> type + } + else -> type.nullableIf(nullability(exprListNullability)) } - return type } diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/ExprUtil.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/ExprUtil.kt index bf9b04d60f3..3fb9078a615 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/ExprUtil.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/ExprUtil.kt @@ -138,7 +138,9 @@ internal object AnsiSqlTypeResolver : TypeResolver { "avg" -> IntermediateType(REAL).asNullable() "abs" -> encapsulatingType(exprList, INTEGER, REAL) "iif" -> exprList[1].type() - "coalesce", "ifnull" -> encapsulatingTypePreferringKotlin(exprList, INTEGER, REAL, TEXT, BLOB) + "coalesce", "ifnull" -> encapsulatingTypePreferringKotlin(exprList, INTEGER, REAL, TEXT, BLOB, nullability = { exprListNullability -> + exprListNullability.all { it } + }) "nullif" -> exprList[0].type().asNullable() "max" -> encapsulatingTypePreferringKotlin(exprList, INTEGER, REAL, TEXT, BLOB, BOOLEAN).asNullable() "min" -> encapsulatingTypePreferringKotlin(exprList, BLOB, TEXT, INTEGER, REAL, BOOLEAN).asNullable() @@ -233,10 +235,10 @@ private fun SqlExpr.ansiType(): IntermediateType = when (this) { } else { typeResolver.encapsulatingType( exprList = getExprList(), - nullableIfAny = ( - this is SqlBinaryAddExpr || this is SqlBinaryMultExpr || - this is SqlBinaryPipeExpr - ), + nullability = { exprListNullability -> + (this is SqlBinaryAddExpr || this is SqlBinaryMultExpr || this is SqlBinaryPipeExpr) && + exprListNullability.any { it } + }, INTEGER, REAL, TEXT, diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/ExpressionTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/ExpressionTest.kt index f37deca76d4..046688612f0 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/ExpressionTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/ExpressionTest.kt @@ -392,7 +392,8 @@ class ExpressionTest { |someSelect: |SELECT coalesce(foo, bar), | coalesce(bar, bar), - | coalesce(foo, bar) + | coalesce(foo, bar), + | coalesce(bar, foo) |FROM test; """.trimMargin(), tempFolder, @@ -404,6 +405,7 @@ class ExpressionTest { ClassName("com.example", "Foo"), ClassName("com.example", "Foo").copy(nullable = true), ClassName("com.example", "Foo"), + ClassName("com.example", "Foo"), ).inOrder() } @@ -430,7 +432,9 @@ class ExpressionTest { | coalesce(foo, foo2), | coalesce(foo, baz), | coalesce(bar, baz), - | coalesce(foo, bar, baz) + | coalesce(bar, foo), + | coalesce(foo, bar, baz), + | coalesce(baz, bar, foo) |FROM test; """.trimMargin(), tempFolder, @@ -448,6 +452,8 @@ class ExpressionTest { DOUBLE, STRING, STRING.copy(nullable = true), + integerKotlinType, + STRING, STRING, ).inOrder() } From 7d12f88afb148a4ddf74a093304ca80721236c23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 5 Dec 2023 19:32:01 +0000 Subject: [PATCH 010/304] Fix 4448 missing import for table model (#4885) * Update ReturningQueryable.kt Change the result to use tableName * add MigrationQueryTest for ReturningQueryable a fixture where the migration sqm files and query sq files are in varying packages. This tests that the Queries interface imports the Data tables using the migration package name when ReturningQueryable is used --- .../dialect/api/ReturningQueryable.kt | 2 +- .../core/migrations/MigrationQueryTest.kt | 4 + .../com/example/migrations/1.sqm | 4 + .../com/example/queries/Data.sq | 12 ++ .../output/com/example/migrations/Test.kt | 9 ++ .../output/com/example/queries/DataQueries.kt | 135 ++++++++++++++++++ 6 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/com/example/migrations/1.sqm create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/com/example/queries/Data.sq create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/migrations/Test.kt create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/queries/DataQueries.kt diff --git a/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/ReturningQueryable.kt b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/ReturningQueryable.kt index 0b22f09b7c3..f105935c314 100644 --- a/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/ReturningQueryable.kt +++ b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/ReturningQueryable.kt @@ -29,7 +29,7 @@ class ReturningQueryable( ?: return@lazy null val requestedColumnsAreIdenticalToTable = table.query.columns.flattenCompounded() == pureColumns if (requestedColumnsAreIdenticalToTable) { - tableName + table.tableName } else { null } diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt index c7b5c130363..84ff401b30d 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt @@ -25,6 +25,10 @@ class MigrationQueryTest { checkFixtureCompiles("alter-table-alter-column", PostgreSqlDialect()) } + @Test fun `varying query migration packages`() { + checkFixtureCompiles("varying-query-migration-packages", PostgreSqlDialect()) + } + private fun checkFixtureCompiles(fixtureRoot: String, dialect: SqlDelightDialect = SqliteDialect()) { val result = FixtureCompiler.compileFixture( overrideDialect = dialect, diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/com/example/migrations/1.sqm b/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/com/example/migrations/1.sqm new file mode 100644 index 00000000000..f3bafaf9fbf --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/com/example/migrations/1.sqm @@ -0,0 +1,4 @@ +CREATE TABLE test ( + first TEXT NOT NULL, + second INT NOT NULL +); diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/com/example/queries/Data.sq b/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/com/example/queries/Data.sq new file mode 100644 index 00000000000..39b407749bc --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/com/example/queries/Data.sq @@ -0,0 +1,12 @@ +migrationSelect: +SELECT * +FROM test; + +migrationInsert: +INSERT INTO test(first, second) VALUES (?, ?) RETURNING *; + +migrationDelete: +DELETE FROM test WHERE first = ? RETURNING *; + +migrationUpdate: +UPDATE test SET first = ? RETURNING *; diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/migrations/Test.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/migrations/Test.kt new file mode 100644 index 00000000000..7bb05ad8d1e --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/migrations/Test.kt @@ -0,0 +1,9 @@ +package com.example.migrations + +import kotlin.Int +import kotlin.String + +public data class Test( + public val first: String, + public val second: Int, +) diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/queries/DataQueries.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/queries/DataQueries.kt new file mode 100644 index 00000000000..a7d79d84bea --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/queries/DataQueries.kt @@ -0,0 +1,135 @@ +package com.example.queries + +import app.cash.sqldelight.ExecutableQuery +import app.cash.sqldelight.Query +import app.cash.sqldelight.TransacterImpl +import app.cash.sqldelight.db.QueryResult +import app.cash.sqldelight.db.SqlCursor +import app.cash.sqldelight.db.SqlDriver +import app.cash.sqldelight.driver.jdbc.JdbcCursor +import app.cash.sqldelight.driver.jdbc.JdbcPreparedStatement +import com.example.migrations.Test +import kotlin.Any +import kotlin.Int +import kotlin.String + +public class DataQueries( + driver: SqlDriver, +) : TransacterImpl(driver) { + public fun migrationSelect(mapper: (first: String, second: Int) -> T): Query = + Query(-1_568_224_787, arrayOf("test"), driver, "Data.sq", "migrationSelect", """ + |SELECT * + |FROM test + """.trimMargin()) { cursor -> + check(cursor is JdbcCursor) + mapper( + cursor.getString(0)!!, + cursor.getInt(1)!! + ) + } + + public fun migrationSelect(): Query = migrationSelect { first, second -> + Test( + first, + second + ) + } + + public fun migrationInsert( + first: String, + second: Int, + mapper: (first: String, second: Int) -> T, + ): ExecutableQuery = MigrationInsertQuery(first, second) { cursor -> + check(cursor is JdbcCursor) + mapper( + cursor.getString(0)!!, + cursor.getInt(1)!! + ) + } + + public fun migrationInsert(first: String, second: Int): ExecutableQuery = + migrationInsert(first, second) { first_, second_ -> + Test( + first_, + second_ + ) + } + + public fun migrationDelete(first: String, mapper: (first: String, second: Int) -> T): + ExecutableQuery = MigrationDeleteQuery(first) { cursor -> + check(cursor is JdbcCursor) + mapper( + cursor.getString(0)!!, + cursor.getInt(1)!! + ) + } + + public fun migrationDelete(first: String): ExecutableQuery = migrationDelete(first) { + first_, second -> + Test( + first_, + second + ) + } + + public fun migrationUpdate(first: String, mapper: (first: String, second: Int) -> T): + ExecutableQuery = MigrationUpdateQuery(first) { cursor -> + check(cursor is JdbcCursor) + mapper( + cursor.getString(0)!!, + cursor.getInt(1)!! + ) + } + + public fun migrationUpdate(first: String): ExecutableQuery = migrationUpdate(first) { + first_, second -> + Test( + first_, + second + ) + } + + private inner class MigrationInsertQuery( + public val first: String, + public val second: Int, + mapper: (SqlCursor) -> T, + ) : ExecutableQuery(mapper) { + override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = + driver.executeQuery(-1_845_995_606, + """INSERT INTO test(first, second) VALUES (?, ?) RETURNING *""", mapper, 2) { + check(this is JdbcPreparedStatement) + bindString(0, first) + bindInt(1, second) + } + + override fun toString(): String = "Data.sq:migrationInsert" + } + + private inner class MigrationDeleteQuery( + public val first: String, + mapper: (SqlCursor) -> T, + ) : ExecutableQuery(mapper) { + override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = + driver.executeQuery(-1_997_661_540, """DELETE FROM test WHERE first = ? RETURNING *""", + mapper, 1) { + check(this is JdbcPreparedStatement) + bindString(0, first) + } + + override fun toString(): String = "Data.sq:migrationDelete" + } + + private inner class MigrationUpdateQuery( + public val first: String, + mapper: (SqlCursor) -> T, + ) : ExecutableQuery(mapper) { + override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = + driver.executeQuery(-1_501_049_414, """UPDATE test SET first = ? RETURNING *""", mapper, 1) + { + check(this is JdbcPreparedStatement) + bindString(0, first) + } + + override fun toString(): String = "Data.sq:migrationUpdate" + } +} From bf2eab451bfcad8abe11c341dc37d04c0ec15be3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 7 Dec 2023 07:12:58 -0500 Subject: [PATCH 011/304] Update dependency org.postgresql:postgresql to v42.7.1 (#4895) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 054d6a33e44..715beab9ffc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -68,7 +68,7 @@ robolectric = { module = "org.robolectric:robolectric", version = "4.11.1" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.44.1.0" } -postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.0" } +postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.1" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } schemaCrawler-tools = { module = "us.fatehi:schemacrawler-tools", version.ref = "schemaCrawler" } From ff46cb256bc0d8b43b6d22b26366c27a57bc0463 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 13:09:07 -0500 Subject: [PATCH 012/304] Update actions/setup-python action to v5 (#4893) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/Publish-Website.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Publish-Website.yml b/.github/workflows/Publish-Website.yml index f93e49173d9..e96e5f3a689 100644 --- a/.github/workflows/Publish-Website.yml +++ b/.github/workflows/Publish-Website.yml @@ -38,7 +38,7 @@ jobs: gradle-home-cache-cleanup: true - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: 3.11 # See the pinned version in renovate.json too From 5088d8c63479ccf529c4c76d43cbd93e4a10dfda Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 13:09:21 -0500 Subject: [PATCH 013/304] Update dependency mkdocs-material to v9.5.2 (#4896) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/requirements.in | 2 +- .github/workflows/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/requirements.in b/.github/workflows/requirements.in index b46052a7859..3b17a1da983 100644 --- a/.github/workflows/requirements.in +++ b/.github/workflows/requirements.in @@ -1,5 +1,5 @@ mike==1.1.2 mkdocs==1.5.3 mkdocs-macros-plugin==1.0.5 -mkdocs-material==9.4.14 +mkdocs-material==9.5.2 mkdocs-material-extensions==1.3.1 \ No newline at end of file diff --git a/.github/workflows/requirements.txt b/.github/workflows/requirements.txt index 07b6c3f460b..08d99eba91a 100644 --- a/.github/workflows/requirements.txt +++ b/.github/workflows/requirements.txt @@ -45,7 +45,7 @@ mkdocs==1.5.3 # mkdocs-material mkdocs-macros-plugin==1.0.5 # via -r requirements.in -mkdocs-material==9.4.14 +mkdocs-material==9.5.2 # via -r requirements.in mkdocs-material-extensions==1.3.1 # via From a9349ae884254c0ae68b5193b7214e2e53d721b0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 11:30:09 -0500 Subject: [PATCH 014/304] Update dependency org.postgresql:r2dbc-postgresql to v1.0.3.RELEASE (#4907) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../src/test/integration-postgresql-async/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle b/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle index 807b87edbb4..52c831be623 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle @@ -17,7 +17,7 @@ dependencies { implementation libs.postgresJdbc implementation libs.testContainers.postgres implementation libs.testContainers.r2dbc - implementation "org.postgresql:r2dbc-postgresql:1.0.2.RELEASE" + implementation "org.postgresql:r2dbc-postgresql:1.0.3.RELEASE" implementation "app.cash.sqldelight:r2dbc-driver:${app.cash.sqldelight.VersionKt.VERSION}" implementation "app.cash.sqldelight:async-extensions:${app.cash.sqldelight.VersionKt.VERSION}" implementation libs.truth From 6fe5db182f11515c1d716a8ee16376fd8ebfd364 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 12 Dec 2023 21:35:12 +0000 Subject: [PATCH 015/304] Update MigrationQueryTest.kt to show compiler error (#4903) * Update MigrationQueryTest.kt to show compiler error A test can succeed event if there is a compiler error. Ensure test fails when there is a compiler error and show errors. For example - an invalid column in Data.sq must show the error "Data.sq: (6, 58): No column found with name x " * Update MigrationQueryTest.kt --- .../app/cash/sqldelight/core/migrations/MigrationQueryTest.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt index 84ff401b30d..011d5fc581e 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt @@ -36,6 +36,9 @@ class MigrationQueryTest { generateDb = false, deriveSchemaFromMigrations = true, ) + + if (result.errors.isNotEmpty()) assertWithMessage(result.errors.joinToString("\n")).fail() + for ((expectedFile, actualOutput) in result.compilerOutput) { assertWithMessage("No file with name $expectedFile").that(expectedFile.exists()).isTrue() assertWithMessage(expectedFile.name).that(actualOutput.toString()) From f398ccc4615a39a32048dfbb770201ead929ddf3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 20:22:40 +0000 Subject: [PATCH 016/304] Update plugin ksp to v1.9.21-1.0.16 (#4914) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 715beab9ffc..05f796ffa33 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -107,5 +107,5 @@ publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.23.3" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } -ksp = { id = "com.google.devtools.ksp", version = "1.9.21-1.0.15" } +ksp = { id = "com.google.devtools.ksp", version = "1.9.21-1.0.16" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.13.2" } From 4a1643ceaba4389e646053ba134677a7294aa540 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 20:40:21 +0000 Subject: [PATCH 017/304] Update plugin com.gradle.enterprise to v3.16.1 (#4913) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index 03eb8ce75dc..c88b5a1a61c 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.16" + id "com.gradle.enterprise" version "3.16.1" id "org.gradle.toolchains.foojay-resolver-convention" version "0.7.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index 1d6497bed21..bc68c11dded 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.16" + id "com.gradle.enterprise" version "3.16.1" id "org.gradle.toolchains.foojay-resolver-convention" version "0.7.0" } diff --git a/settings.gradle b/settings.gradle index 64902135bd0..44295f5ac62 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.16" + id "com.gradle.enterprise" version "3.16.1" id "org.gradle.toolchains.foojay-resolver-convention" version "0.7.0" } From 2afe99ccd92610ea2cb9636416298ed3ee9e8de7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 18:39:29 -0500 Subject: [PATCH 018/304] Update dependency com.google.truth:truth to v1.2.0 (#4924) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 05f796ffa33..f1f75a6719e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -38,7 +38,7 @@ android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.15.3" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } -truth = { module = "com.google.truth:truth", version = "1.1.5" } +truth = { module = "com.google.truth:truth", version = "1.2.0" } turbine = { module = "app.cash.turbine:turbine", version = "1.0.0" } bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.1" } picnic = { module = "com.jakewharton.picnic:picnic", version = "0.7.0" } From e9c57dd92d9bbbde4ce98693f1fc6bf9ce6f5bed Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 26 Dec 2023 11:55:32 +0100 Subject: [PATCH 019/304] Update kotlin monorepo (#4928) * Update kotlin monorepo to v1.9.22-703 * Update libs.versions.toml --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jake Wharton --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f1f75a6719e..fc7cffa8f7c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlin = "1.9.21" +kotlin = "1.9.22" dokka = "1.9.10" kotlinCoroutines = "1.7.3" idea = "222.4459.24" # Flamingo | 2022.2.1 (see https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html) From a188d6afb52afce9a736047206ed08405bd8cc3d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 26 Dec 2023 11:55:47 +0100 Subject: [PATCH 020/304] Update plugin ksp to v1.9.22-1.0.16 (#4939) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fc7cffa8f7c..670be617497 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -107,5 +107,5 @@ publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.23.3" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } -ksp = { id = "com.google.devtools.ksp", version = "1.9.21-1.0.16" } +ksp = { id = "com.google.devtools.ksp", version = "1.9.22-1.0.16" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.13.2" } From 181b6a14fb0172ae60f4a1609d3543254d103331 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 23:13:52 +0000 Subject: [PATCH 021/304] Update agp to v8.2.1 (#4951) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 670be617497..07a01be0180 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.0.1" -agp = "8.2.0" +agp = "8.2.1" compileSdk = "34" minSdk = "16" sqlPsi = "0.4.8" From e195dd5a632df2a4b0123114daa1ad06eb2f9bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Danielsson?= Date: Fri, 5 Jan 2024 03:22:43 -0800 Subject: [PATCH 022/304] Add PostgreSQL STRING_AGG function (#4950) --- .../dialects/postgresql/PostgreSqlTypeResolver.kt | 1 + .../cash/sqldelight/postgresql/integration/Dog.sq | 7 +++++++ .../postgresql/integration/PostgreSqlTest.kt | 13 +++++++++++++ 3 files changed, 21 insertions(+) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index b4da5d60e36..fd2b09f3a0a 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -167,6 +167,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "json_typeof", "jsonb_typeof", "json_agg", "jsonb_agg", "json_object_agg", "jsonb_object_agg", -> IntermediateType(TEXT) + "string_agg" -> IntermediateType(TEXT) "json_array_length", "jsonb_array_length" -> IntermediateType(INTEGER) "jsonb_path_exists", "jsonb_path_match", "jsonb_path_exists_tz", "jsonb_path_match_tz" -> IntermediateType(BOOLEAN) "currval", "lastval", "nextval", "setval" -> IntermediateType(BIG_INT) diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dog.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dog.sq index a123037290f..a94e0628c42 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dog.sq +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dog.sq @@ -64,3 +64,10 @@ deleteAndReturnAll: DELETE FROM dog WHERE name = ? RETURNING *; + +selectDogsStringAggName: +SELECT breed, + STRING_AGG(name, ',') +FROM dog +GROUP BY breed +ORDER BY breed; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index 595c2de0b7a..a62686a1128 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -273,6 +273,19 @@ class PostgreSqlTest { } } + @Test fun testStringAgg() { + database.dogQueries.insertDog("Tilda", "Pomeranian") + database.dogQueries.insertDog("Bruno", "Pomeranian") + database.dogQueries.insertDog("Mads", "Broholmer") + + database.dogQueries.selectDogsStringAggName().executeAsList().let { + assertThat(it).containsExactly( + SelectDogsStringAggName("Broholmer", "Mads"), + SelectDogsStringAggName("Pomeranian", "Tilda,Bruno"), + ) + } + } + @Test fun testSerial() { database.run { oneEntityQueries.transaction { From bf0005cee22334aa9b29068abc9b4b22f32ac37a Mon Sep 17 00:00:00 2001 From: Bastien de Luca Date: Fri, 5 Jan 2024 12:24:41 +0100 Subject: [PATCH 023/304] Add SET statement to pg dialect (#4927) * Add SET statement to pg dialect * Fix statement name --- .../postgresql/grammar/PostgreSql.bnf | 17 ++++++++++-- .../resources/fixtures_postgresql/set/Test.s | 26 +++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/set/Test.s diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 5d46a625e49..f5eb406996c 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -369,7 +369,7 @@ json_expression ::= {column_name} ( jsona_binary_operator | jsonb_binary_operato jsona_binary_operator ::= '->' | '->>' | '#>' jsonb_binary_operator ::= '@>' | '<@' | '?|' | '?&' | '?' | '#-' -extension_stmt ::= create_sequence_stmt | copy_stdin | truncate_stm { +extension_stmt ::= create_sequence_stmt | copy_stdin | truncate_stmt | set_stmt { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionStmtImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionStmt" override = true @@ -406,9 +406,22 @@ copy_option_force_not_null ::= 'FORCE_NOT_NULL' LP {column_name} ( COMMA {column copy_option_force_null ::= 'FORCE_NULL' LP {column_name} ( COMMA {column_name}) * RP copy_option_encoding ::= 'ENCODING' string_literal -truncate_stm ::= 'TRUNCATE' [ 'TABLE' ] ( truncate_only | truncate_descendant ) [ truncate_option * ] +truncate_stmt ::= 'TRUNCATE' [ 'TABLE' ] ( truncate_only | truncate_descendant ) [ truncate_option * ] truncate_only ::= 'ONLY' {table_name} ( COMMA {table_name} ) * truncate_descendant ::= {table_name} ['*'] ( COMMA {table_name} ['*'] ) * truncate_option ::= truncate_option_identity | truncate_option_cascade truncate_option_identity ::= ( 'RESTART' | 'CONTINUE' ) 'IDENTITY' truncate_option_cascade ::= 'CASCADE' | 'RESTRICT' + +set_stmt ::= 'SET' [ ('SESSION' | 'LOCAL') ] ( set_config | set_timezone | set_schema | set_names | set_seed ) +set_value ::= literal_value | {identifier} | DEFAULT +set_config ::= {identifier} ( TO | EQ ) set_value +set_schema ::= 'SCHEMA' string_literal +set_names ::= 'NAMES' set_value +set_seed ::= 'SEED' TO ( set_value | [PLUS | MINUS]{numeric_literal} ) +set_timezone ::= 'TIME' 'ZONE' +( [PLUS | MINUS]{numeric_literal} +| interval_expression ['HOUR' TO 'MINUTE'] +| 'LOCAL' +| set_value +) diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/set/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/set/Test.s new file mode 100644 index 00000000000..de6848c3e39 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/set/Test.s @@ -0,0 +1,26 @@ +SET test = yes; +SET test = 'yes'; +SET test = DEFAULT; +SET test TO yes; +SET test TO 'yes'; +SET test TO DEFAULT; + +SET SESSION test = yes; +SET LOCAL test = yes; + +SET TIME ZONE 'PST8PDT'; +SET TIME ZONE 'Europe/Paris'; +SET TIME ZONE +1; +SET TIME ZONE -7; +SET TIME ZONE INTERVAL '-08:00' HOUR TO MINUTE; +SET TIME ZONE LOCAL; +SET TIME ZONE DEFAULT; + +SET SCHEMA 'postgres'; + +SET NAMES 'utf8'; +SET NAMES DEFAULT; + +SET SEED TO 0.1; +SET SEED TO -0.5; +SET SEED TO DEFAULT; From 517c604f961e96fe9029bad2a01530bdb2641554 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 12:12:18 +0000 Subject: [PATCH 024/304] Update dependency org.postgresql:r2dbc-postgresql to v1.0.4.RELEASE (#4957) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../src/test/integration-postgresql-async/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle b/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle index 52c831be623..6ac609cda6d 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle @@ -17,7 +17,7 @@ dependencies { implementation libs.postgresJdbc implementation libs.testContainers.postgres implementation libs.testContainers.r2dbc - implementation "org.postgresql:r2dbc-postgresql:1.0.3.RELEASE" + implementation "org.postgresql:r2dbc-postgresql:1.0.4.RELEASE" implementation "app.cash.sqldelight:r2dbc-driver:${app.cash.sqldelight.VersionKt.VERSION}" implementation "app.cash.sqldelight:async-extensions:${app.cash.sqldelight.VersionKt.VERSION}" implementation libs.truth From 1a702fb7b9d9a78122cd565c13daf9b67758caae Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 12 Jan 2024 19:39:52 +0000 Subject: [PATCH 025/304] Update plugin org.gradle.toolchains.foojay-resolver-convention to v0.8.0 (#4960) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index c88b5a1a61c..50115b3101f 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -18,7 +18,7 @@ pluginManagement { plugins { id "com.gradle.enterprise" version "3.16.1" - id "org.gradle.toolchains.foojay-resolver-convention" version "0.7.0" + id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } gradleEnterprise { diff --git a/sample/settings.gradle b/sample/settings.gradle index bc68c11dded..a5d16a35b9f 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -18,7 +18,7 @@ pluginManagement { plugins { id "com.gradle.enterprise" version "3.16.1" - id "org.gradle.toolchains.foojay-resolver-convention" version "0.7.0" + id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } gradleEnterprise { diff --git a/settings.gradle b/settings.gradle index 44295f5ac62..4851e443a5e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,7 +10,7 @@ pluginManagement { plugins { id "com.gradle.enterprise" version "3.16.1" - id "org.gradle.toolchains.foojay-resolver-convention" version "0.7.0" + id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } gradleEnterprise { From 177a91b197453de5f34e24a73807aefa54b568f8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 14 Jan 2024 21:20:04 -0500 Subject: [PATCH 026/304] Update plugin spotless to v6.24.0 (#4964) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 07a01be0180..8a1936dda84 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -104,7 +104,7 @@ dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } intellij = { id = "org.jetbrains.intellij", version = "1.16.1" } grammarKitComposer = { id = "com.alecstrong.grammar.kit.composer", version = "0.1.12" } publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } -spotless = { id = "com.diffplug.spotless", version = "6.23.3" } +spotless = { id = "com.diffplug.spotless", version = "6.24.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } ksp = { id = "com.google.devtools.ksp", version = "1.9.22-1.0.16" } From 6ec0ca53f77fbc0cbde1de089c6803cc769e7864 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 15:40:04 +0000 Subject: [PATCH 027/304] Update dependency com.google.testparameterinjector:test-parameter-injector to v1.15 (#4967) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8a1936dda84..3723cc07f63 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -80,7 +80,7 @@ stately-concurrency = { module = "co.touchlab:stately-concurrency", version = "2 testhelp = { module = "co.touchlab:testhelp", version = "0.6.11" } burst = { module = "com.squareup.burst:burst-junit4", version = "1.2.0" } -testParameterInjector = { module = "com.google.testparameterinjector:test-parameter-injector", version = "1.14" } +testParameterInjector = { module = "com.google.testparameterinjector:test-parameter-injector", version = "1.15" } r2dbc = { module = "io.r2dbc:r2dbc-spi", version = "1.0.0.RELEASE" } testContainers-mysql = { module = "org.testcontainers:mysql", version.ref = "testContainers" } From fd8e808d4c7cef9564937c8607ae8a86c240df0d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 12:32:59 -0500 Subject: [PATCH 028/304] Update dependency com.squareup:kotlinpoet to v1.16.0 (#4969) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3723cc07f63..9d32c8e4a81 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -35,7 +35,7 @@ androidx-paging3-runtime = { module = "androidx.paging:paging-runtime", version. androidx-recyclerView = { module = "androidx.recyclerview:recyclerview", version = "1.3.2" } android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp" } -kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.15.3" } +kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.16.0" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } truth = { module = "com.google.truth:truth", version = "1.2.0" } From c73efb7a72206555f2120c9b596272e7308cb954 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 02:04:09 +0000 Subject: [PATCH 029/304] Update plugin ksp to v1.9.22-1.0.17 (#4971) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9d32c8e4a81..37436a403de 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -107,5 +107,5 @@ publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.24.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } -ksp = { id = "com.google.devtools.ksp", version = "1.9.22-1.0.16" } +ksp = { id = "com.google.devtools.ksp", version = "1.9.22-1.0.17" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.13.2" } From 3abf9496e273237b76909333fcf9ed3c28795bda Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 06:32:12 -0500 Subject: [PATCH 030/304] Update dependency org.xerial:sqlite-jdbc to v3.45.0.0 (#4972) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 37436a403de..e582d5068da 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -67,7 +67,7 @@ sqlPsi = { module = "com.alecstrong.sql.psi:core", version.ref = "sqlPsi" } robolectric = { module = "org.robolectric:robolectric", version = "4.11.1" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } -sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.44.1.0" } +sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.0.0" } postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.1" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } From c0cdc57dba6bfe2d6c2e276f6e7248d265462ac8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 22:45:51 +0000 Subject: [PATCH 031/304] Update dependency com.google.truth:truth to v1.3.0 (#4973) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e582d5068da..1db405bfc61 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -38,7 +38,7 @@ android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.16.0" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } -truth = { module = "com.google.truth:truth", version = "1.2.0" } +truth = { module = "com.google.truth:truth", version = "1.3.0" } turbine = { module = "app.cash.turbine:turbine", version = "1.0.0" } bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.1" } picnic = { module = "com.jakewharton.picnic:picnic", version = "0.7.0" } From 8503eaef6233f8775e508a4f7cc14a1f9399e421 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 16:56:23 +0000 Subject: [PATCH 032/304] Update dependency org.jetbrains.kotlinx:kotlinx-html-js to v0.11.0 (#4977) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample-web/build.gradle b/sample-web/build.gradle index 6506c06edfe..4c6b7e96732 100644 --- a/sample-web/build.gradle +++ b/sample-web/build.gradle @@ -26,7 +26,7 @@ kotlin { dependencies { implementation "app.cash.sqldelight:web-worker-driver" implementation "app.cash.sqldelight:primitive-adapters" - implementation "org.jetbrains.kotlinx:kotlinx-html-js:0.10.1" + implementation "org.jetbrains.kotlinx:kotlinx-html-js:0.11.0" implementation devNpm("copy-webpack-plugin", "9.1.0") implementation npm('dateformat', '3.0.3') implementation npm("sql.js", libs.versions.sqljs.get()) From ea6fca535a202a84fb3f6afc081256423c093f24 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Jan 2024 07:04:16 -0500 Subject: [PATCH 033/304] Update plugin spotless to v6.25.0 (#4978) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1db405bfc61..8cf7c8b627e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -104,7 +104,7 @@ dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } intellij = { id = "org.jetbrains.intellij", version = "1.16.1" } grammarKitComposer = { id = "com.alecstrong.grammar.kit.composer", version = "0.1.12" } publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } -spotless = { id = "com.diffplug.spotless", version = "6.24.0" } +spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } ksp = { id = "com.google.devtools.ksp", version = "1.9.22-1.0.17" } From e35338330d5e44983053a346c435ef8a2136721d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Jan 2024 19:46:43 +0000 Subject: [PATCH 034/304] Update agp to v8.2.2 (#4979) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8cf7c8b627e..56a4b7300d0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.0.1" -agp = "8.2.1" +agp = "8.2.2" compileSdk = "34" minSdk = "16" sqlPsi = "0.4.8" From c7257374663c039c7d350324d4e1ed714b1ec27e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Jan 2024 21:00:40 +0000 Subject: [PATCH 035/304] Update testcontainers-java monorepo to v1.19.4 (#4982) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 56a4b7300d0..bcfe85279b6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ agp = "8.2.2" compileSdk = "34" minSdk = "16" sqlPsi = "0.4.8" -testContainers = "1.19.3" +testContainers = "1.19.4" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } From eb8da2ee64f0cf9af537bd494fc945eed907ff50 Mon Sep 17 00:00:00 2001 From: Alexander Perfilyev Date: Mon, 29 Jan 2024 17:00:05 +0300 Subject: [PATCH 036/304] Fix error handler crash (#4988) #4983 will take some time, so let's fix it separately --- sqldelight-idea-plugin/build.gradle | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sqldelight-idea-plugin/build.gradle b/sqldelight-idea-plugin/build.gradle index be24d2f48e1..d56dd811702 100644 --- a/sqldelight-idea-plugin/build.gradle +++ b/sqldelight-idea-plugin/build.gradle @@ -83,9 +83,7 @@ dependencies { implementation projects.sqldelightCompiler implementation libs.sqliteJdbc - implementation(libs.bugsnag) { - exclude group: "org.slf4j" - } + implementation libs.bugsnag implementation libs.picnic implementation libs.moshi @@ -94,6 +92,10 @@ dependencies { testImplementation projects.dialects.sqlite318 } +configurations.named("implementation") { + exclude group: "org.slf4j" +} + def bugsnagKey = tasks.register('bugsnagKey', BugsnagKey) sourceSets.main { kotlin.srcDir(bugsnagKey) From 1aa06a3ead306291db4202e82d8e924e00579598 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 09:00:26 -0500 Subject: [PATCH 037/304] Update gradle/gradle-build-action action to v3 (#4987) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/PR.yml | 6 +++--- .github/workflows/Publish-Website.yml | 2 +- .github/workflows/Release.yml | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index 3c0e22501d4..7ad82feef2a 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -48,7 +48,7 @@ jobs: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - name: Setup gradle - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v3 with: gradle-home-cache-cleanup: true @@ -95,7 +95,7 @@ jobs: # Build the samples - name: Build the mobile sample if: matrix.os == 'macOS-latest' && matrix.job == 'test' - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v3 with: arguments: build --stacktrace --parallel build-root-directory: sample @@ -103,7 +103,7 @@ jobs: - name: Build the web sample if: matrix.os == 'macOS-latest' && matrix.job == 'test' - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v3 with: arguments: kotlinUpgradeYarnLock build --stacktrace --parallel build-root-directory: sample-web diff --git a/.github/workflows/Publish-Website.yml b/.github/workflows/Publish-Website.yml index e96e5f3a689..6cdc66c2c07 100644 --- a/.github/workflows/Publish-Website.yml +++ b/.github/workflows/Publish-Website.yml @@ -33,7 +33,7 @@ jobs: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - name: Setup gradle - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v3 with: gradle-home-cache-cleanup: true diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index 7266146d957..3f6278518e7 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -31,7 +31,7 @@ jobs: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - name: Setup gradle - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v3 with: gradle-home-cache-cleanup: true @@ -82,7 +82,7 @@ jobs: cd ~/.gradle echo "org.gradle.java.installations.paths=${{ steps.setup-java.outputs.path }}" >> gradle.properties - name: Setup gradle - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v3 with: gradle-home-cache-cleanup: true @@ -120,7 +120,7 @@ jobs: cd ~/.gradle echo "org.gradle.java.installations.paths=${{ steps.setup-java.outputs.path }}" >> gradle.properties - name: Setup gradle - uses: gradle/gradle-build-action@v2 + uses: gradle/gradle-build-action@v3 with: gradle-home-cache-cleanup: true From a9de43763dc27a92d4f624fd3025bf2085b8c1c0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 09:00:37 -0500 Subject: [PATCH 038/304] Update plugin com.gradle.enterprise to v3.16.2 (#4985) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index 50115b3101f..91d87b4dd87 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.16.1" + id "com.gradle.enterprise" version "3.16.2" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index a5d16a35b9f..bfca70d65d0 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.16.1" + id "com.gradle.enterprise" version "3.16.2" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/settings.gradle b/settings.gradle index 4851e443a5e..28c90b125eb 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.16.1" + id "com.gradle.enterprise" version "3.16.2" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } From 69d6ef4858136a22da024f5a3e5a21f3bcd5f254 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 09:00:50 -0500 Subject: [PATCH 039/304] Update plugin intellij to v1.17.0 (#4970) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bcfe85279b6..296b27916e2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -101,7 +101,7 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-android-extensions = { id = "org.jetbrains.kotlin.android.extensions", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } -intellij = { id = "org.jetbrains.intellij", version = "1.16.1" } +intellij = { id = "org.jetbrains.intellij", version = "1.17.0" } grammarKitComposer = { id = "com.alecstrong.grammar.kit.composer", version = "0.1.12" } publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } From 947084dc10b14060054309e1f7e6d0c3c4cc16c6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 09:01:02 -0500 Subject: [PATCH 040/304] Update dependency mkdocs-material to v9.5.6 (#4937) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/requirements.in | 2 +- .github/workflows/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/requirements.in b/.github/workflows/requirements.in index 3b17a1da983..e7534abc5b7 100644 --- a/.github/workflows/requirements.in +++ b/.github/workflows/requirements.in @@ -1,5 +1,5 @@ mike==1.1.2 mkdocs==1.5.3 mkdocs-macros-plugin==1.0.5 -mkdocs-material==9.5.2 +mkdocs-material==9.5.6 mkdocs-material-extensions==1.3.1 \ No newline at end of file diff --git a/.github/workflows/requirements.txt b/.github/workflows/requirements.txt index 08d99eba91a..5c53c94ba2b 100644 --- a/.github/workflows/requirements.txt +++ b/.github/workflows/requirements.txt @@ -45,7 +45,7 @@ mkdocs==1.5.3 # mkdocs-material mkdocs-macros-plugin==1.0.5 # via -r requirements.in -mkdocs-material==9.5.2 +mkdocs-material==9.5.6 # via -r requirements.in mkdocs-material-extensions==1.3.1 # via From 33d6a61793638de557cdbc706d0283942c89d0aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 29 Jan 2024 14:05:28 +0000 Subject: [PATCH 041/304] fixes 4897 sqlite alter table rename column (#4899) * fixes for Sqlite alter column AlterTableColumnAliasMixin AlterTableRenameColumnMixin implement as SqlColumnDef * Add MigrationQueryTest Add alter-table-rename-column-sqlite Needs as sqlite doesn't use JDBCPreparedStatement so test cannot be shared with `alter-table-rename-column` * Add inherited alter_table_rename_column rule alter_table_rename_column is imported into sqlite_3_35 as the alter_table_rules are overridden and need to include the alter_table_rename_column rules as well. This appears to be cleaner than trying to reimplement alter_table_rename_column * Update AlterTableRenameColumnMixin Use singleOrNull as potentially if the columnName is renamed already the predicate may return null Therefore the annotation should be displayed as a compiler message "No column found to modify with name " --- .../mixins/AlterTableColumnAliasMixin.kt | 19 +++++++++ .../mixins/AlterTableRenameColumnMixin.kt | 40 +++++++++++++++---- .../dialects/sqlite_3_25/grammar/sqlite.bnf | 12 +++++- .../dialects/sqlite_3_35/grammar/sqlite.bnf | 12 +++--- .../core/migrations/MigrationQueryTest.kt | 4 ++ .../com/example/1.sqm | 3 ++ .../com/example/2.sqm | 1 + .../com/example/Data.sq | 6 +++ .../output/com/example/DataQueries.kt | 27 +++++++++++++ .../output/com/example/Test.kt | 7 ++++ 10 files changed, 115 insertions(+), 16 deletions(-) create mode 100644 dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/AlterTableColumnAliasMixin.kt create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/1.sqm create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/2.sqm create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/Data.sq create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/DataQueries.kt create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/Test.kt diff --git a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/AlterTableColumnAliasMixin.kt b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/AlterTableColumnAliasMixin.kt new file mode 100644 index 00000000000..14c8e06bad5 --- /dev/null +++ b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/AlterTableColumnAliasMixin.kt @@ -0,0 +1,19 @@ +package app.cash.sqldelight.dialects.sqlite_3_25.grammar.mixins + +import app.cash.sqldelight.dialects.sqlite_3_25.grammar.SqliteParser +import app.cash.sqldelight.dialects.sqlite_3_25.grammar.psi.SqliteAlterTableRenameColumn +import com.alecstrong.sql.psi.core.psi.SqlColumnAlias +import com.alecstrong.sql.psi.core.psi.SqlColumnName +import com.alecstrong.sql.psi.core.psi.impl.SqlColumnAliasImpl +import com.intellij.lang.ASTNode +import com.intellij.lang.PsiBuilder +import com.intellij.psi.util.PsiTreeUtil + +internal abstract class AlterTableColumnAliasMixin( + node: ASTNode, +) : SqlColumnAliasImpl(node), + SqlColumnAlias { + override val parseRule: (PsiBuilder, Int) -> Boolean = SqliteParser::alter_table_column_alias_real + + override fun source() = PsiTreeUtil.getChildOfType(parent as SqliteAlterTableRenameColumn, SqlColumnName::class.java)!! +} diff --git a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/AlterTableRenameColumnMixin.kt b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/AlterTableRenameColumnMixin.kt index ecb30eb893e..5a79d4ed075 100644 --- a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/AlterTableRenameColumnMixin.kt +++ b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/AlterTableRenameColumnMixin.kt @@ -4,20 +4,44 @@ import app.cash.sqldelight.dialects.sqlite_3_25.grammar.psi.SqliteAlterTableRena import com.alecstrong.sql.psi.core.SqlAnnotationHolder import com.alecstrong.sql.psi.core.psi.AlterTableApplier import com.alecstrong.sql.psi.core.psi.LazyQuery +import com.alecstrong.sql.psi.core.psi.NamedElement import com.alecstrong.sql.psi.core.psi.QueryElement import com.alecstrong.sql.psi.core.psi.SqlColumnAlias +import com.alecstrong.sql.psi.core.psi.SqlColumnConstraint +import com.alecstrong.sql.psi.core.psi.SqlColumnDef import com.alecstrong.sql.psi.core.psi.SqlColumnName -import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlColumnType import com.alecstrong.sql.psi.core.psi.alterStmt +import com.alecstrong.sql.psi.core.psi.impl.SqlColumnDefImpl +import com.alecstrong.sql.psi.core.psi.mixins.ColumnDefMixin import com.intellij.lang.ASTNode -internal abstract class AlterTableRenameColumnMixin( +abstract class AlterTableRenameColumnMixin( node: ASTNode, -) : SqlCompositeElementImpl(node), +) : SqlColumnDefImpl(node), SqliteAlterTableRenameColumn, AlterTableApplier { - private val columnName - get() = children.filterIsInstance().single() + + override fun getColumnConstraintList(): MutableList { + return alterStmt.tablesAvailable(this).first { it.tableName.textMatches(alterStmt.tableName) } + .query.columns.first { it.element.textMatches(columnName) }.element.let { + (it.parent as SqlColumnDef).columnConstraintList + } + } + + override fun getColumnName(): SqlColumnName { + return children.filterIsInstance().first() + } + + override fun getColumnType(): SqlColumnType { + val sqlColumnType = children.filterIsInstance().firstOrNull() + if (sqlColumnType != null) return sqlColumnType + + val columnName = columnName + val element = tablesAvailable(this).first { it.tableName.textMatches(alterStmt.tableName) } + .query.columns.first { it.element.textMatches(columnName) }.element + return (element.parent as ColumnDefMixin).columnType + } private val columnAlias get() = children.filterIsInstance().single() @@ -27,9 +51,9 @@ internal abstract class AlterTableRenameColumnMixin( tableName = lazyQuery.tableName, query = { val columns = lazyQuery.query.columns - val column = QueryElement.QueryColumn(element = columnAlias) + val column: QueryElement.QueryColumn = QueryElement.QueryColumn(element = columnAlias) val replace = columns.singleOrNull { - (it.element as SqlColumnName).textMatches(columnName) + (it.element as NamedElement).textMatches(columnName) } lazyQuery.query.copy( columns = lazyQuery.query.columns.map { if (it == replace) column else it }, @@ -44,7 +68,7 @@ internal abstract class AlterTableRenameColumnMixin( if (tablesAvailable(this) .filter { it.tableName.textMatches(alterStmt.tableName) } .flatMap { it.query.columns } - .none { (it.element as? SqlColumnName)?.textMatches(columnName) == true } + .none { (it.element as? NamedElement)?.textMatches(columnName) == true } ) { annotationHolder.createErrorAnnotation( element = columnName, diff --git a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/sqlite.bnf b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/sqlite.bnf index 5e0678f4bd9..c9fa43a0c88 100644 --- a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/sqlite.bnf +++ b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/sqlite.bnf @@ -61,11 +61,21 @@ select_stmt ::= SELECT [ DISTINCT | ALL ] {result_column} ( COMMA {result_column pin = 1 } -alter_table_rename_column ::= RENAME [ COLUMN ] {column_name} TO {column_alias} { +alter_table_rename_column ::= RENAME [ COLUMN ] {column_name} TO alter_table_column_alias { mixin = "app.cash.sqldelight.dialects.sqlite_3_25.grammar.mixins.AlterTableRenameColumnMixin" pin = 1 } +alter_table_column_alias ::= id | string { + mixin = "app.cash.sqldelight.dialects.sqlite_3_25.grammar.mixins.AlterTableColumnAliasMixin" + implements = [ + "com.alecstrong.sql.psi.core.psi.AliasElement"; + "com.alecstrong.sql.psi.core.psi.NamedElement"; + "com.alecstrong.sql.psi.core.psi.SqlCompositeElement" + "com.alecstrong.sql.psi.core.psi.SqlColumnName" + ] +} + window_function_invocation ::= window_func LP [ MULTIPLY | ( <> ( COMMA <> ) * ) ] RP [ 'FILTER' LP WHERE <> RP] 'OVER' ( window_defn | window_name ) { pin = 6 diff --git a/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/grammar/sqlite.bnf b/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/grammar/sqlite.bnf index bda4e96014c..5a98db70f67 100644 --- a/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/grammar/sqlite.bnf +++ b/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/grammar/sqlite.bnf @@ -39,6 +39,8 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.TO" "static com.alecstrong.sql.psi.core.psi.SqlTypes.UPDATE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.WHERE" + "static app.cash.sqldelight.dialects.sqlite_3_25.grammar.SqliteParserUtil.alterTableRenameColumnExt" + "static app.cash.sqldelight.dialects.sqlite_3_25.grammar.SqliteParser.alter_table_rename_column_real" ] } overrides ::= alter_table_rules @@ -51,7 +53,7 @@ overrides ::= alter_table_rules alter_table_rules ::= ( {alter_table_add_column} | {alter_table_rename_table} - | alter_table_rename_column + | alter_table_rename_column_inherited | alter_table_drop_column ) { extends = "app.cash.sqldelight.dialects.sqlite_3_25.grammar.psi.impl.SqliteAlterTableRulesImpl" @@ -59,12 +61,6 @@ alter_table_rules ::= ( override = true } -alter_table_rename_column ::= RENAME [ COLUMN ] {column_name} TO {column_alias} { - mixin = "app.cash.sqldelight.dialects.sqlite_3_25.grammar.mixins.AlterTableRenameColumnMixin" - implements = "app.cash.sqldelight.dialects.sqlite_3_25.grammar.psi.SqliteAlterTableRenameColumn" - pin = 1 -} - alter_table_drop_column ::= DROP COLUMN {column_name} { mixin = "app.cash.sqldelight.dialects.sqlite_3_35.grammar.mixins.AlterTableDropColumnMixin" pin = 1 @@ -120,3 +116,5 @@ returning_clause ::= 'RETURNING' {result_column} ( COMMA {result_column} ) * { mixin = "app.cash.sqldelight.dialects.sqlite_3_35.grammar.mixins.ReturningClauseMixin" implements = "com.alecstrong.sql.psi.core.psi.QueryElement" } + +private alter_table_rename_column_inherited ::= <>>> diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt index 011d5fc581e..cf36955ed70 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt @@ -21,6 +21,10 @@ class MigrationQueryTest { checkFixtureCompiles("alter-table-rename-column", PostgreSqlDialect()) } + @Test fun `alter table rename column statements with sqlite`() { + checkFixtureCompiles("alter-table-rename-column-sqlite", app.cash.sqldelight.dialects.sqlite_3_25.SqliteDialect()) + } + @Test fun `alter table alter column statement`() { checkFixtureCompiles("alter-table-alter-column", PostgreSqlDialect()) } diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/1.sqm b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/1.sqm new file mode 100644 index 00000000000..7be753fea4a --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/1.sqm @@ -0,0 +1,3 @@ +CREATE TABLE test ( + first TEXT NOT NULL +); \ No newline at end of file diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/2.sqm b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/2.sqm new file mode 100644 index 00000000000..308877c99a4 --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/2.sqm @@ -0,0 +1 @@ +ALTER TABLE test RENAME COLUMN first TO alpha; diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/Data.sq b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/Data.sq new file mode 100644 index 00000000000..32cbe123158 --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/com/example/Data.sq @@ -0,0 +1,6 @@ +insert: +INSERT INTO test (alpha) VALUES (?); + +select: + SELECT * + FROM test; diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/DataQueries.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/DataQueries.kt new file mode 100644 index 00000000000..93131ebc5f5 --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/DataQueries.kt @@ -0,0 +1,27 @@ +package com.example + +import app.cash.sqldelight.Query +import app.cash.sqldelight.TransacterImpl +import app.cash.sqldelight.db.SqlDriver +import kotlin.String + +public class DataQueries( + driver: SqlDriver, +) : TransacterImpl(driver) { + public fun select(): Query = Query(-1_042_942_063, arrayOf("test"), driver, "Data.sq", + "select", """ + |SELECT * + | FROM test + """.trimMargin()) { cursor -> + cursor.getString(0)!! + } + + public fun insert(alpha: String) { + driver.execute(-1_320_712_882, """INSERT INTO test (alpha) VALUES (?)""", 1) { + bindString(0, alpha) + } + notifyQueries(-1_320_712_882) { emit -> + emit("test") + } + } +} diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/Test.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/Test.kt new file mode 100644 index 00000000000..8aca8e8715c --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/Test.kt @@ -0,0 +1,7 @@ +package com.example + +import kotlin.String + +public data class Test( + public val alpha: String, +) From 3d59a81335e97032ac450dd461df93ce339523e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 29 Jan 2024 14:05:57 +0000 Subject: [PATCH 042/304] Fixes 4932 postgresql default constraint functions (#4934) * Support functions in default column definition e.g CREATE TABLE t1 ( c1 UUID DEFAULT gen_random_uuid(), c2 INTEGER DEFAULT nextval('some_seq') ); * Add simple fixture test --- .../sqldelight/dialects/postgresql/grammar/PostgreSql.bnf | 1 + .../resources/fixtures_postgresql/column_types/Sample.s | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index f5eb406996c..2c3258faccd 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -121,6 +121,7 @@ default_constraint ::= [ NOT NULL | NULL ] DEFAULT ( current_timestamp_with_optional_interval | {signed_number} | {literal_value} | + {function_expr} | LP <> RP ) { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlDefaultConstraintImpl" diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/column_types/Sample.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/column_types/Sample.s index 682a90b3bd6..60dc3ef04b7 100644 --- a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/column_types/Sample.s +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/column_types/Sample.s @@ -70,7 +70,11 @@ CREATE TABLE all_types( some_interval_d TIMESTAMP NOT NULL DEFAULT NOW() - INTERVAL '5 days', - some_interval_e INTERVAL DEFAULT INTERVAL '3h' + INTERVAL '20m' + some_interval_e INTERVAL DEFAULT INTERVAL '3h' + INTERVAL '20m', + + some_default_uuid UUID DEFAULT gen_random_uuid(), + + some_default_sequence INTEGER DEFAULT nextval('some_seq') ); From 96f4329c8d8d572102b4abe6492bcd6b75a61bb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 29 Jan 2024 14:06:12 +0000 Subject: [PATCH 043/304] Add PostgreSql alter column sequence parameters (#4916) * Add PostgreSql alter column sequence parameters Adds the missing sequence parameters to identity coloumns * Add SET for identity columns ALTER COLUMN allows multiple sequential SET clauses for identity columns The grammar seems very tricky so this is a best effort to have it working Add more fixture tests to show syntax * Update PostgreSql.bnf sequence_parameters Change sequence_parameters to use pin=2 Do this seems to allow the sequence_parameters to be declared in any order --- .../postgresql/grammar/PostgreSql.bnf | 17 ++++--- .../alter-table-alter-column/1.s | 48 +++++++++++++++++++ 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 2c3258faccd..c9177396a42 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -173,7 +173,7 @@ create_index_stmt ::= CREATE [ UNIQUE ] INDEX [ 'CONCURRENTLY' ] [ IF NOT EXISTS pin = 6 } -identity_clause ::= 'IDENTITY' +identity_clause ::= 'IDENTITY' [ LP [ 'SEQUENCE' 'NAME' sequence_name ] [ sequence_parameters* ] RP ] generated_clause ::= GENERATED ( (ALWAYS AS LP <> RP 'STORED') | ( (ALWAYS | BY DEFAULT) AS identity_clause ) ) { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlGeneratedClauseImpl" @@ -325,7 +325,7 @@ alter_table_alter_column ::= ALTER [COLUMN] {column_name} ( [ SET data_clause ] type_clause {column_type} [USING {column_name}'::'{column_type}] | column_not_null_clause | SET DEFAULT <> | DROP DEFAULT | DROP identity_clause [ IF EXISTS ] | ADD {generated_clause} -| SET GENERATED (ALWAYS | BY DEFAULT ) +| ( SET GENERATED (ALWAYS | BY DEFAULT) | SET sequence_parameters | 'RESTART' [ WITH {signed_number} ] ) * ) { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.AlterTableAlterColumnMixin" pin = 1 @@ -387,14 +387,17 @@ sequence_data_type ::= ( small_int_data_type | big_int_data_type ) create_sequence_stmt ::= CREATE [ (TEMPORARY | TEMP) | 'UNLOGGED' ] 'SEQUENCE' [ IF NOT EXISTS ] sequence_name - [ AS sequence_data_type ] - [ 'INCREMENT' [ BY ] {signed_number} ] - [ 'MINVALUE' {signed_number} | NO 'MINVALUE' ] [ 'MAXVALUE' {signed_number} | NO 'MAXVALUE' ] - [ 'START' [ WITH ] {signed_number} ] [ 'CACHE' {signed_number} ] [ [ NO ] 'CYCLE' ] - [ 'OWNED' BY ( {table_name} DOT {column_name} ) | 'NONE' ] { + [ AS sequence_data_type ] (sequence_parameters) * { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.CreateSequenceMixin" } +sequence_parameters ::= 'INCREMENT' [ BY ] {signed_number} + | 'MINVALUE' {signed_number} | NO 'MINVALUE' | 'MAXVALUE' {signed_number} | NO 'MAXVALUE' + | 'START' [ WITH ] {signed_number} | 'CACHE' {signed_number} | [ NO ] 'CYCLE' + | 'OWNED' BY ( {table_name} DOT {column_name} ) | 'NONE' { + pin=2 + } + copy_option ::= copy_option_format | copy_option_freeze | copy_option_delimiter | copy_option_null | copy_option_header | copy_option_quote | copy_option_escape | copy_option_force_not_null | copy_option_force_null | copy_option_encoding copy_option_format ::= 'FORMAT' ('TEXT' | 'CSV' | 'BINARY') copy_option_freeze ::= 'FREEZE' [ (boolean_literal) ] diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-alter-column/1.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-alter-column/1.s index c67aaafaffb..9a233372115 100644 --- a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-alter-column/1.s +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-alter-column/1.s @@ -1,3 +1,20 @@ +CREATE TABLE t2 ( + c1 INTEGER GENERATED ALWAYS AS IDENTITY ( + SEQUENCE NAME t2_seq + MAXVALUE 44444 + MINVALUE 11 + START 11 + INCREMENT BY 10 + CACHE 20 + NO CYCLE + ), + c2 INTEGER DEFAULT 0, + c3 VARCHAR(25), + c4 TEXT, + c5 NUMERIC(10, 2) +); + + CREATE TABLE t1 ( c1 INTEGER, c2 INTEGER DEFAULT 0, @@ -26,3 +43,34 @@ ALTER TABLE t1 ALTER COLUMN c4 SET DEFAULT 'Test'; ALTER TABLE t1 ALTER COLUMN c1 SET GENERATED BY DEFAULT; ALTER TABLE t1 ALTER COLUMN c1 SET GENERATED ALWAYS; +ALTER TABLE t1 + ALTER COLUMN c1 ADD GENERATED ALWAYS AS IDENTITY ( + SEQUENCE NAME t1_seq + INCREMENT BY 10 + MINVALUE 100 + MAXVALUE 9223372 + START 1 + CACHE 20 + NO CYCLE + ); + +ALTER TABLE t1 + ALTER COLUMN c1 ADD GENERATED BY DEFAULT AS IDENTITY ( + START 101 + CACHE 1 + NO CYCLE + ); + +ALTER TABLE t1 ALTER COLUMN c1_id +SET GENERATED BY DEFAULT +SET INCREMENT 1 +SET MINVALUE 1 +SET MAXVALUE 11 +SET START WITH 1 +SET CACHE 111 +SET NO CYCLE +RESTART WITH 1; + +ALTER TABLE t1 ALTER COLUMN c1_id +SET GENERATED BY DEFAULT +RESTART WITH 1; From 36f2979ff84f3801c3acc72d9d07256a0a7e4714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 29 Jan 2024 14:11:08 +0000 Subject: [PATCH 044/304] Update Postgresql AlterTableAlterColumnMixin (#4902) * Update AlterTableAlterColumnMixin Add annotate for compiler message for missing column name * Update AlterTableAlterColumnMixin.kt Support several migrations - individually or as a group Check if nullableColumn exists to use the nullableColumn value Check if a SqlColumnType exists to use the alter column SqlColumn ALTER TABLE test1 ALTER COLUMN alpha SET NOT NULL; -- set the nullable on the QueryColumn element ALTER TABLE test1 ALTER COLUMN alpha TYPE BIGINT; -- set the element to columnName ALTER TABLE test1 ALTER COLUMN alpha DROP IDENTITY; -- keep current element and nullable --- .../mixins/AlterTableAlterColumnMixin.kt | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt index db84ef86b90..3a6e96ec81e 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt @@ -1,8 +1,10 @@ package app.cash.sqldelight.dialects.postgresql.grammar.mixins import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlAlterTableAlterColumn +import com.alecstrong.sql.psi.core.SqlAnnotationHolder import com.alecstrong.sql.psi.core.psi.AlterTableApplier import com.alecstrong.sql.psi.core.psi.LazyQuery +import com.alecstrong.sql.psi.core.psi.NamedElement import com.alecstrong.sql.psi.core.psi.SqlColumnConstraint import com.alecstrong.sql.psi.core.psi.SqlColumnDef import com.alecstrong.sql.psi.core.psi.SqlColumnName @@ -33,10 +35,9 @@ internal abstract class AlterTableAlterColumnMixin( } override fun getColumnType(): SqlColumnType { - val sqlColumnType = children.filterIsInstance().firstOrNull() + val sqlColumnType = children.filterIsInstance().singleOrNull() if (sqlColumnType != null) return sqlColumnType - val columnName = columnName val element = tablesAvailable(this).first { it.tableName.textMatches(alterStmt.tableName) } .query.columns.first { it.element.textMatches(columnName) }.element return (element.parent as ColumnDefMixin).columnType @@ -55,15 +56,37 @@ internal abstract class AlterTableAlterColumnMixin( } } - val alterColumnTable = getColumnName() return LazyQuery( tableName = lazyQuery.tableName, query = { - val columns = lazyQuery.query.columns.map { queryColumn -> - if (queryColumn.element.textMatches(alterColumnTable)) queryColumn.copy(element = alterColumnTable, nullable = nullableColumn ?: queryColumn.nullable) else queryColumn + val columns = lazyQuery.query.columns + val alterColumn = columns.singleOrNull { + (it.element as NamedElement).textMatches(columnName) } - lazyQuery.query.copy(columns = columns) + + val sqlColumnName = children.filterIsInstance().singleOrNull()?.run { columnName } + + lazyQuery.query.copy( + columns = columns.map { + if (it == alterColumn) it.copy(element = sqlColumnName ?: it.element, nullable = nullableColumn ?: it.nullable) else it + }, + ) }, ) } + + override fun annotate(annotationHolder: SqlAnnotationHolder) { + super.annotate(annotationHolder) + + if (tablesAvailable(this) + .filter { it.tableName.textMatches(alterStmt.tableName) } + .flatMap { it.query.columns } + .none { (it.element as? NamedElement)?.textMatches(columnName) == true } + ) { + annotationHolder.createErrorAnnotation( + element = columnName, + message = "No column found to alter with name ${columnName.text}", + ) + } + } } From a0823b4d275aaaf06db6a367908fbd89510084bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 30 Jan 2024 14:17:36 +0000 Subject: [PATCH 045/304] Add postgresql alter column default support for insert statement (#4912) * Allow ColumnDefMixin to be inherited add open class as we want to call the inherited hasDefaultValue() * Update PostgreSql.bnf We want a column_not_null_clause rule to read SET or DROP DEFAULT * AlterTableAlterColumnMixin to inherit ColumnDefMixin hasDefaultValue implemented by checking for a DEFAULT has SET or DROP, otherwise call inherited hasDefaultValue InsertStmtValuesMixin in the compiler use the result of ColumnDefMixin.hasDefaultValue * Fix test Rename to correct column name --- .../dialects/postgresql/grammar/PostgreSql.bnf | 3 ++- .../grammar/mixins/AlterTableAlterColumnMixin.kt | 16 +++++++++++++--- .../postgresql/grammar/mixins/ColumnDefMixin.kt | 2 +- .../alter-table-alter-column/1.s | 4 ++-- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index c9177396a42..d5f917d1bff 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -320,11 +320,12 @@ type_clause ::= 'TYPE' data_clause ::= 'DATA' column_not_null_clause ::= (SET | DROP) NOT NULL +column_default_clause ::= SET {default_constraint} | DROP DEFAULT alter_table_alter_column ::= ALTER [COLUMN] {column_name} ( [ SET data_clause ] type_clause {column_type} [USING {column_name}'::'{column_type}] | column_not_null_clause -| SET DEFAULT <> | DROP DEFAULT | DROP identity_clause [ IF EXISTS ] | ADD {generated_clause} +| column_default_clause | DROP identity_clause [ IF EXISTS ] | ADD {generated_clause} | ( SET GENERATED (ALWAYS | BY DEFAULT) | SET sequence_parameters | 'RESTART' [ WITH {signed_number} ] ) * ) { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.AlterTableAlterColumnMixin" diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt index 3a6e96ec81e..99b1c5258c0 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAlterColumnMixin.kt @@ -11,15 +11,13 @@ import com.alecstrong.sql.psi.core.psi.SqlColumnName import com.alecstrong.sql.psi.core.psi.SqlColumnType import com.alecstrong.sql.psi.core.psi.SqlTypes import com.alecstrong.sql.psi.core.psi.alterStmt -import com.alecstrong.sql.psi.core.psi.impl.SqlColumnDefImpl -import com.alecstrong.sql.psi.core.psi.mixins.ColumnDefMixin import com.intellij.lang.ASTNode import com.intellij.psi.PsiElement import com.intellij.psi.util.elementType internal abstract class AlterTableAlterColumnMixin( node: ASTNode, -) : SqlColumnDefImpl(node), +) : ColumnDefMixin(node), PostgreSqlAlterTableAlterColumn, AlterTableApplier { @@ -30,6 +28,18 @@ internal abstract class AlterTableAlterColumnMixin( } } + override fun hasDefaultValue(): Boolean { + val defaultColumn: Boolean? = columnDefaultClause?.let { + when (it.firstChild.elementType) { + SqlTypes.DROP -> false + SqlTypes.SET -> true + else -> null + } + } + + return defaultColumn ?: super.hasDefaultValue() + } + override fun getColumnName(): SqlColumnName { return children.filterIsInstance().first() } diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ColumnDefMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ColumnDefMixin.kt index f5abbf0497b..fdc2b40143b 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ColumnDefMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ColumnDefMixin.kt @@ -5,7 +5,7 @@ import com.alecstrong.sql.psi.core.psi.SqlColumnDef import com.alecstrong.sql.psi.core.psi.impl.SqlColumnDefImpl import com.intellij.lang.ASTNode -internal class ColumnDefMixin(node: ASTNode) : SqlColumnDefImpl(node), SqlColumnDef { +internal open class ColumnDefMixin(node: ASTNode) : SqlColumnDefImpl(node), SqlColumnDef { override fun hasDefaultValue(): Boolean { return isSerial() || super.hasDefaultValue() diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-alter-column/1.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-alter-column/1.s index 9a233372115..ed6b50a4790 100644 --- a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-alter-column/1.s +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-alter-column/1.s @@ -61,7 +61,7 @@ ALTER TABLE t1 NO CYCLE ); -ALTER TABLE t1 ALTER COLUMN c1_id +ALTER TABLE t1 ALTER COLUMN c1 SET GENERATED BY DEFAULT SET INCREMENT 1 SET MINVALUE 1 @@ -71,6 +71,6 @@ SET CACHE 111 SET NO CYCLE RESTART WITH 1; -ALTER TABLE t1 ALTER COLUMN c1_id +ALTER TABLE t1 ALTER COLUMN c1 SET GENERATED BY DEFAULT RESTART WITH 1; From 539363205700c28be1ac3027093eeb7f11b3a96e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 30 Jan 2024 14:18:48 +0000 Subject: [PATCH 046/304] Add PostgreSql alter sequence and drop sequence (#4920) * Add postgresql alter sequence and drop sequence Add test fixtures Add AlterSequenceMixin to handle OWNED BY table.column references * Update PostgreSql.bnf Change grammar on sequence_parameters to use pin=2 The ordering of the sequence_parameters can be changed * Resolve Merge Conflicts * FIX test column name c1_id -> c1 --- .../postgresql/grammar/PostgreSql.bnf | 15 +++++++-- .../grammar/mixins/AlterSequenceMixin.kt | 16 ++++++++++ .../alter-sequence/Sample.s | 32 +++++++++++++++++++ .../drop-sequence/Sample.s | 14 ++++++++ 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterSequenceMixin.kt create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-sequence/Sample.s create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/drop-sequence/Sample.s diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index d5f917d1bff..92b418d188b 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -371,7 +371,7 @@ json_expression ::= {column_name} ( jsona_binary_operator | jsonb_binary_operato jsona_binary_operator ::= '->' | '->>' | '#>' jsonb_binary_operator ::= '@>' | '<@' | '?|' | '?&' | '?' | '#-' -extension_stmt ::= create_sequence_stmt | copy_stdin | truncate_stmt | set_stmt { +extension_stmt ::= create_sequence_stmt | copy_stdin | truncate_stmt | set_stmt | drop_sequence_stmt | alter_sequence_stmt { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionStmtImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionStmt" override = true @@ -392,12 +392,23 @@ create_sequence_stmt ::= CREATE [ (TEMPORARY | TEMP) | 'UNLOGGED' ] 'SEQUENCE' [ mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.CreateSequenceMixin" } +alter_sequence_stmt ::= ALTER 'SEQUENCE' [ IF EXISTS ] sequence_name + ( 'OWNER' TO ( id | 'CURRENT_USER' | 'SESSION_USER' ) + | RENAME TO sequence_name + | SET 'SCHEMA' id + | ( [ AS sequence_data_type ] (sequence_parameters) * ) ) + { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.AlterSequenceMixin" +} + +drop_sequence_stmt ::= DROP 'SEQUENCE' [ IF EXISTS ] sequence_name ( COMMA sequence_name ) * [ 'CASCADE' | 'RESTRICT' ] + sequence_parameters ::= 'INCREMENT' [ BY ] {signed_number} | 'MINVALUE' {signed_number} | NO 'MINVALUE' | 'MAXVALUE' {signed_number} | NO 'MAXVALUE' | 'START' [ WITH ] {signed_number} | 'CACHE' {signed_number} | [ NO ] 'CYCLE' | 'OWNED' BY ( {table_name} DOT {column_name} ) | 'NONE' { pin=2 - } +} copy_option ::= copy_option_format | copy_option_freeze | copy_option_delimiter | copy_option_null | copy_option_header | copy_option_quote | copy_option_escape | copy_option_force_not_null | copy_option_force_null | copy_option_encoding copy_option_format ::= 'FORMAT' ('TEXT' | 'CSV' | 'BINARY') diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterSequenceMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterSequenceMixin.kt new file mode 100644 index 00000000000..5163fa9ea26 --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterSequenceMixin.kt @@ -0,0 +1,16 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlAlterSequenceStmt +import com.alecstrong.sql.psi.core.psi.QueryElement +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.intellij.lang.ASTNode +import com.intellij.psi.PsiElement + +internal abstract class AlterSequenceMixin(node: ASTNode) : + SqlCompositeElementImpl(node), + PostgreSqlAlterSequenceStmt { + // Query any OWNED BY tableName element to allow the columnName to be resolved + override fun queryAvailable(child: PsiElement): Collection { + return tablesAvailable(child).map { it.query } + } +} diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-sequence/Sample.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-sequence/Sample.s new file mode 100644 index 00000000000..9de392a72c3 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-sequence/Sample.s @@ -0,0 +1,32 @@ +CREATE TABLE abc ( + id INTEGER PRIMARY KEY +); + +CREATE SEQUENCE integers_01; + +ALTER SEQUENCE integers_01 AS INTEGER + INCREMENT 10 + MINVALUE 100 + MAXVALUE 250000 + START 101 + CACHE 1 + NO CYCLE; + +ALTER SEQUENCE IF EXISTS integers_01 + INCREMENT BY 2 + NO MINVALUE + NO MAXVALUE + START WITH 3 + CYCLE; + +ALTER SEQUENCE integers_01 START 31 + OWNED BY abc.id; + +ALTER SEQUENCE IF EXISTS integers_01 RENAME TO integers_02; + +ALTER SEQUENCE integers_01 OWNER TO other_role; + +ALTER SEQUENCE integers_01 SET SCHEMA other_schema; + +ALTER SEQUENCE IF EXISTS integers_01 SET SCHEMA CURRENT_USER; + diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/drop-sequence/Sample.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/drop-sequence/Sample.s new file mode 100644 index 00000000000..d442f25291d --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/drop-sequence/Sample.s @@ -0,0 +1,14 @@ +CREATE TABLE abc ( + id INTEGER PRIMARY KEY +); + +CREATE SEQUENCE integers_01; + +CREATE SEQUENCE integers_02; + +DROP SEQUENCE integers_01; + +DROP SEQUENCE integers_01, integers_02 RESTRICT; + +DROP SEQUENCE IF EXISTS integers_01 CASCADE; + From dd1f11d145577b2def4362240858baaee4e49bf9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 14:47:14 +0000 Subject: [PATCH 047/304] Update gradle/wrapper-validation-action action to v2 (#4992) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/gradleWrapper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradleWrapper.yml b/.github/workflows/gradleWrapper.yml index ad5a741d24c..097dc824c54 100644 --- a/.github/workflows/gradleWrapper.yml +++ b/.github/workflows/gradleWrapper.yml @@ -15,4 +15,4 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: gradle/wrapper-validation-action@v1 + - uses: gradle/wrapper-validation-action@v2 From ff60bab5a17237ed8447368712de38f184c3074d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 15:03:41 +0000 Subject: [PATCH 048/304] Update plugin binaryCompatibilityValidator to v0.14.0 (#4991) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Alec Kazakova <1675456+AlecKazakova@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 296b27916e2..1acc5e79841 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -108,4 +108,4 @@ spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } ksp = { id = "com.google.devtools.ksp", version = "1.9.22-1.0.17" } -binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.13.2" } +binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.14.0" } From b313013c4cf3352c15dc9f3defbe956b6cbc1c3b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 15:48:57 -0500 Subject: [PATCH 049/304] Update dependency com.pinterest.ktlint:ktlint-cli to v1.1.1 (#4923) * Update dependency com.pinterest.ktlint:ktlint-cli to v1.1.1 * Fix spotless issues --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Alec Kazakova <1675456+AlecKazakova@users.noreply.github.com> Co-authored-by: Alec Kazakova --- .../drivers/native/connectionpool/BaseConcurrencyTest.kt | 8 ++++---- .../kotlin/app/cash/sqldelight/coroutines/MappingTest.kt | 4 ++-- .../src/test/kotlin/app/cash/sqldelight/rx2/QueryTest.kt | 8 ++++---- .../src/test/kotlin/app/cash/sqldelight/rx3/QueryTest.kt | 4 ++-- gradle/libs.versions.toml | 2 +- .../dialect/src/main/kotlin/timber/log/Timber.kt | 6 ++++-- .../intellij/SqlDelightTreeStructureProvider.kt | 4 +++- .../intellij/refactoring/SqlDelightSignatureBuilder.kt | 3 ++- 8 files changed, 22 insertions(+), 17 deletions(-) diff --git a/drivers/native-driver/src/nativeTest/kotlin/com/squareup/sqldelight/drivers/native/connectionpool/BaseConcurrencyTest.kt b/drivers/native-driver/src/nativeTest/kotlin/com/squareup/sqldelight/drivers/native/connectionpool/BaseConcurrencyTest.kt index 4d33f3782c4..0f23040610a 100644 --- a/drivers/native-driver/src/nativeTest/kotlin/com/squareup/sqldelight/drivers/native/connectionpool/BaseConcurrencyTest.kt +++ b/drivers/native-driver/src/nativeTest/kotlin/com/squareup/sqldelight/drivers/native/connectionpool/BaseConcurrencyTest.kt @@ -28,10 +28,10 @@ abstract class BaseConcurrencyTest { ).value } - private var _driver: SqlDriver? = null + private var backingDriver: SqlDriver? = null private var dbName: String? = null internal val driver: SqlDriver - get() = _driver!! + get() = backingDriver!! internal inner class ConcurrentContext { private val myWorkers = arrayListOf() @@ -161,12 +161,12 @@ abstract class BaseConcurrencyTest { } fun initDriver(dbType: DbType) { - _driver = createDriver(dbType) + backingDriver = createDriver(dbType) } @AfterTest fun tearDown() { - _driver?.close() + backingDriver?.close() dbName?.let { DatabaseFileContext.deleteDatabase(it) } } diff --git a/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/MappingTest.kt b/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/MappingTest.kt index 88a54d30223..b1adc818ec1 100644 --- a/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/MappingTest.kt +++ b/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/MappingTest.kt @@ -145,8 +145,8 @@ class MappingTest : DbTest { .test { assertEquals( listOf( - Employee("alice", "Alice Allison"), // - Employee("bob", "Bob Bobberson"), // + Employee("alice", "Alice Allison"), + Employee("bob", "Bob Bobberson"), Employee("eve", "Eve Evenson"), ), awaitItem(), diff --git a/extensions/rxjava2-extensions/src/test/kotlin/app/cash/sqldelight/rx2/QueryTest.kt b/extensions/rxjava2-extensions/src/test/kotlin/app/cash/sqldelight/rx2/QueryTest.kt index 021b3dbd1dc..a6fa961cfcf 100644 --- a/extensions/rxjava2-extensions/src/test/kotlin/app/cash/sqldelight/rx2/QueryTest.kt +++ b/extensions/rxjava2-extensions/src/test/kotlin/app/cash/sqldelight/rx2/QueryTest.kt @@ -40,7 +40,7 @@ class QueryTest { } @Test fun `mapToOneOrDefault throws on multiple rows`() { - db.createQuery(TABLE_EMPLOYEE, "$SELECT_EMPLOYEES LIMIT 2", MAPPER) // + db.createQuery(TABLE_EMPLOYEE, "$SELECT_EMPLOYEES LIMIT 2", MAPPER) .asObservable(Schedulers.trampoline()) .mapToOneOrDefault(Employee("fred", "Fred Frederson")) .test() @@ -50,7 +50,7 @@ class QueryTest { @Test fun `mapToOneOrDefault returns default when no results`() { val defaultEmployee = Employee("fred", "Fred Frederson") - db.createQuery(TABLE_EMPLOYEE, "$SELECT_EMPLOYEES LIMIT 0", MAPPER) // + db.createQuery(TABLE_EMPLOYEE, "$SELECT_EMPLOYEES LIMIT 0", MAPPER) .asObservable(Schedulers.trampoline()) .mapToOneOrDefault(Employee("fred", "Fred Frederson")) .test() @@ -64,8 +64,8 @@ class QueryTest { .test() .assertValue( listOf( - Employee("alice", "Alice Allison"), // - Employee("bob", "Bob Bobberson"), // + Employee("alice", "Alice Allison"), + Employee("bob", "Bob Bobberson"), Employee("eve", "Eve Evenson"), ), ) diff --git a/extensions/rxjava3-extensions/src/test/kotlin/app/cash/sqldelight/rx3/QueryTest.kt b/extensions/rxjava3-extensions/src/test/kotlin/app/cash/sqldelight/rx3/QueryTest.kt index 838a6d25e2f..2e437eced2f 100644 --- a/extensions/rxjava3-extensions/src/test/kotlin/app/cash/sqldelight/rx3/QueryTest.kt +++ b/extensions/rxjava3-extensions/src/test/kotlin/app/cash/sqldelight/rx3/QueryTest.kt @@ -64,8 +64,8 @@ class QueryTest { .test() .assertValue( listOf( - Employee("alice", "Alice Allison"), // - Employee("bob", "Bob Bobberson"), // + Employee("alice", "Alice Allison"), + Employee("bob", "Bob Bobberson"), Employee("eve", "Eve Evenson"), ), ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1acc5e79841..67ac0c7dde2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ sqliter = "1.3.1" sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" -ktlint = "1.0.1" +ktlint = "1.1.1" agp = "8.2.2" compileSdk = "34" minSdk = "16" diff --git a/sqldelight-compiler/dialect/src/main/kotlin/timber/log/Timber.kt b/sqldelight-compiler/dialect/src/main/kotlin/timber/log/Timber.kt index 099881c75f5..2d85c5c7fa2 100644 --- a/sqldelight-compiler/dialect/src/main/kotlin/timber/log/Timber.kt +++ b/sqldelight-compiler/dialect/src/main/kotlin/timber/log/Timber.kt @@ -258,8 +258,10 @@ class Timber private constructor() { * instance rather than using static methods or to facilitate testing. */ @Suppress( - "NOTHING_TO_INLINE", // Kotlin users should reference `Tree.Forest` directly. - "NON_FINAL_MEMBER_IN_OBJECT", // For japicmp check. + // Kotlin users should reference `Tree.Forest` directly. + "NOTHING_TO_INLINE", + // For japicmp check. + "NON_FINAL_MEMBER_IN_OBJECT", ) @JvmStatic open inline fun asTree(): Tree = this diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightTreeStructureProvider.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightTreeStructureProvider.kt index c489f5b67dd..7c045ae00b4 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightTreeStructureProvider.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightTreeStructureProvider.kt @@ -107,7 +107,9 @@ internal class SqlDelightTreeStructureProvider( selected.forEach { if (it is SqlDelightPackageNode) { addAll(it.elements) - } else if (it.value is PsiElement) add(it.value as PsiElement) + } else if (it.value is PsiElement) { + add(it.value as PsiElement) + } } }.toTypedArray() diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/refactoring/SqlDelightSignatureBuilder.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/refactoring/SqlDelightSignatureBuilder.kt index bc0d4738ec8..8db7e53bb9d 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/refactoring/SqlDelightSignatureBuilder.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/refactoring/SqlDelightSignatureBuilder.kt @@ -13,7 +13,8 @@ internal class SqlDelightSignatureBuilder { name = tableName, type = null, parameters = columns, - additionalData = null, // TODO: support table constraints + // TODO: support table constraints + additionalData = null, ) } } From 5c96d65cf62377e41ffbe44f404569a73efcb56a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 21:08:27 +0000 Subject: [PATCH 050/304] Update dependency com.squareup.moshi:moshi-kotlin-codegen to v1.15.1 (#4995) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 67ac0c7dde2..5cd5f83424c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -43,7 +43,7 @@ turbine = { module = "app.cash.turbine:turbine", version = "1.0.0" } bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.1" } picnic = { module = "com.jakewharton.picnic:picnic", version = "0.7.0" } moshi = { module = "com.squareup.moshi:moshi", version = "1.15.0" } -moshiCodegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version = "1.15.0" } +moshiCodegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version = "1.15.1" } intellij-core = { module = "com.jetbrains.intellij.platform:core", version.ref = "idea" } intellij-coreImpl = { module = "com.jetbrains.intellij.platform:core-impl", version.ref = "idea" } From 3ad3f705765d5b8447e8e7f444eb19b877ae07a3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 21:58:50 +0000 Subject: [PATCH 051/304] Update dependency com.squareup.moshi:moshi to v1.15.1 (#4994) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5cd5f83424c..56be796e5be 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -42,7 +42,7 @@ truth = { module = "com.google.truth:truth", version = "1.3.0" } turbine = { module = "app.cash.turbine:turbine", version = "1.0.0" } bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.1" } picnic = { module = "com.jakewharton.picnic:picnic", version = "0.7.0" } -moshi = { module = "com.squareup.moshi:moshi", version = "1.15.0" } +moshi = { module = "com.squareup.moshi:moshi", version = "1.15.1" } moshiCodegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version = "1.15.1" } intellij-core = { module = "com.jetbrains.intellij.platform:core", version.ref = "idea" } From a00aab520924175b7ad26e741573644ab3f53dc2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:06:07 +0000 Subject: [PATCH 052/304] Update dependency org.xerial:sqlite-jdbc to v3.45.1.0 (#4996) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 56be796e5be..6ede278721a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -67,7 +67,7 @@ sqlPsi = { module = "com.alecstrong.sql.psi:core", version.ref = "sqlPsi" } robolectric = { module = "org.robolectric:robolectric", version = "4.11.1" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } -sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.0.0" } +sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.1.0" } postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.1" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } From d1c912f4d4ab29ecd7d7a2a4b0b560a7f0e80da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Wed, 31 Jan 2024 13:07:33 +0000 Subject: [PATCH 053/304] fixes 4879 postgresql class-cast error in alter table rename column during migrations (#4880) * Add failure test case for rename Rename in migration files Caused by: java.lang.ClassCastException: class app.cash.sqldelight.dialects.postgresql.grammar.psi.impl.PostgreSqlAlterTableRenameColumnImpl cannot be cast to class com.alecstrong.sql.psi.core.psi.mixins.ColumnDefMixin (app.cash.sqldelight.dialects.postgresql.grammar.psi.impl.PostgreSqlAlterTableRenameColumnImpl and com.alecstrong.sql.psi.core.psi.mixins.ColumnDefMixin are in unnamed module of loader 'app') `at com.alecstrong.sql.psi.core.psi.mixins.InsertStmtValuesMixin.annotate(InsertStmtValuesMixin.kt:58)` * Update AlterTableRenameColumnMixin to inherit SqlColumnDefImpl This fixes the class cast exception so that the correct compiler annotation error messages are displayed SqlColumnAlias needs to have a parent element that implements SqlColumnDef. The renamed column must also copy the nullable state from the renamed column so that the correct nullable type is maintained after renaming * Now add the migrated property name first migrated to alpha remains a Long not null type * Update AlterTableRenameColumnMixin Revert to singleOrNulll copy the original column (nullable) and set the new NamedElement from the columnAlias * AlterTableAlterColumnMixin fixes for AlterTableAlterColumnMixin * AlterTableRenameColumnMixin extends AlterTableRenameColumnMixin open AlterTableRenameColumnMixin, ideally we should be using this PostgreSql implementation This is for consistency with other PR changes * update test * Rebase changes --- .../mixins/AlterTableRenameColumnMixin.kt | 35 +++++++++--- .../com/example/1.sqm | 12 +--- .../com/example/2.sqm | 6 +- .../com/example/3.sqm | 4 +- .../com/example/Data.sq | 9 +-- .../output/com/example/DataQueries.kt | 57 ++++++++++--------- .../output/com/example/Test3.kt | 7 +++ .../output/com/example/Test_1.kt | 7 --- .../output/com/example/Test_2.kt | 13 ----- 9 files changed, 74 insertions(+), 76 deletions(-) create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test3.kt delete mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_1.kt delete mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_2.kt diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableRenameColumnMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableRenameColumnMixin.kt index e44956cf5d3..098c0e19442 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableRenameColumnMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableRenameColumnMixin.kt @@ -5,20 +5,40 @@ import com.alecstrong.sql.psi.core.SqlAnnotationHolder import com.alecstrong.sql.psi.core.psi.AlterTableApplier import com.alecstrong.sql.psi.core.psi.LazyQuery import com.alecstrong.sql.psi.core.psi.NamedElement -import com.alecstrong.sql.psi.core.psi.QueryElement import com.alecstrong.sql.psi.core.psi.SqlColumnAlias +import com.alecstrong.sql.psi.core.psi.SqlColumnConstraint +import com.alecstrong.sql.psi.core.psi.SqlColumnDef import com.alecstrong.sql.psi.core.psi.SqlColumnName -import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlColumnType import com.alecstrong.sql.psi.core.psi.alterStmt import com.intellij.lang.ASTNode internal abstract class AlterTableRenameColumnMixin( node: ASTNode, -) : SqlCompositeElementImpl(node), +) : ColumnDefMixin(node), PostgreSqlAlterTableRenameColumn, AlterTableApplier { - private val columnName - get() = children.filterIsInstance().first() + + override fun getColumnConstraintList(): MutableList { + return alterStmt.tablesAvailable(this).first { it.tableName.textMatches(alterStmt.tableName) } + .query.columns.first { it.element.textMatches(columnName) }.element.let { + (it.parent as SqlColumnDef).columnConstraintList + } + } + + override fun getColumnName(): SqlColumnName { + return children.filterIsInstance().first() + } + + override fun getColumnType(): SqlColumnType { + val sqlColumnType = children.filterIsInstance().firstOrNull() + if (sqlColumnType != null) return sqlColumnType + + val columnName = columnName + val element = tablesAvailable(this).first { it.tableName.textMatches(alterStmt.tableName) } + .query.columns.first { it.element.textMatches(columnName) }.element + return (element.parent as ColumnDefMixin).columnType + } private val columnAlias get() = children.filterIsInstance().single() @@ -28,12 +48,11 @@ internal abstract class AlterTableRenameColumnMixin( tableName = lazyQuery.tableName, query = { val columns = lazyQuery.query.columns - val column = QueryElement.QueryColumn(element = columnAlias) val replace = columns.singleOrNull { (it.element as NamedElement).textMatches(columnName) } lazyQuery.query.copy( - columns = lazyQuery.query.columns.map { if (it == replace) column else it }, + columns = columns.map { if (it == replace) it.copy(columnAlias) else it }, ) }, ) @@ -45,7 +64,7 @@ internal abstract class AlterTableRenameColumnMixin( if (tablesAvailable(this) .filter { it.tableName.textMatches(alterStmt.tableName) } .flatMap { it.query.columns } - .none { (it.element as? SqlColumnName)?.textMatches(columnName) == true } + .none { (it.element as? NamedElement)?.textMatches(columnName) == true } ) { annotationHolder.createErrorAnnotation( element = columnName, diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/1.sqm b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/1.sqm index e57a9d9d1a3..1d10158697c 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/1.sqm +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/1.sqm @@ -1,11 +1,3 @@ -CREATE TABLE test_1 ( - first INTEGER -); - -CREATE TABLE test_2 ( - first TEXT NOT NULL, - second INTEGER, - third TEXT NOT NULL, - fourth INTEGER, - fifth INTEGER NOT NULL +CREATE TABLE test_3 ( + first TEXT ); diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/2.sqm b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/2.sqm index bb768b370cd..f4bf9c4f9fd 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/2.sqm +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/2.sqm @@ -1,4 +1,2 @@ -ALTER TABLE test_1 ALTER COLUMN first SET NOT NULL; -ALTER TABLE test_2 ALTER COLUMN first DROP NOT NULL; -ALTER TABLE test_2 ALTER COLUMN second SET NOT NULL; -ALTER TABLE test_2 ALTER COLUMN fifth DROP NOT NULL; +ALTER TABLE test_3 RENAME TO test3; +ALTER TABLE test3 RENAME COLUMN first TO alpha; diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/3.sqm b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/3.sqm index eb6de13f38d..733319c55f4 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/3.sqm +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/3.sqm @@ -1,2 +1,2 @@ -ALTER TABLE test_1 ALTER COLUMN first TYPE BIGINT; -ALTER TABLE test_2 ALTER COLUMN fifth TYPE BIGINT; +ALTER TABLE test3 ALTER COLUMN alpha DROP IDENTITY; +ALTER TABLE test3 ALTER COLUMN alpha SET NOT NULL; diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/Data.sq b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/Data.sq index 61c7961d6c9..3edcc6bb58d 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/Data.sq +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/com/example/Data.sq @@ -1,5 +1,6 @@ -insertFirst: -INSERT INTO test_1 (first) VALUES (?); +select: +SELECT * +FROM test3; -insertSecond: -INSERT INTO test_2 (first, second, third, fourth, fifth) VALUES (?, ?, ?, ?, ?); +insert: +INSERT INTO test3 VALUES ? RETURNING *; diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt index cf94dbb908c..fac30fff96c 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt @@ -1,43 +1,44 @@ package com.example +import app.cash.sqldelight.ExecutableQuery +import app.cash.sqldelight.Query import app.cash.sqldelight.TransacterImpl +import app.cash.sqldelight.db.QueryResult +import app.cash.sqldelight.db.SqlCursor import app.cash.sqldelight.db.SqlDriver +import app.cash.sqldelight.driver.jdbc.JdbcCursor import app.cash.sqldelight.driver.jdbc.JdbcPreparedStatement -import kotlin.Int -import kotlin.Long +import kotlin.Any import kotlin.String public class DataQueries( driver: SqlDriver, ) : TransacterImpl(driver) { - public fun insertFirst(first: Long) { - driver.execute(-2_134_278_654, """INSERT INTO test_1 (first) VALUES (?)""", 1) { - check(this is JdbcPreparedStatement) - bindLong(0, first) - } - notifyQueries(-2_134_278_654) { emit -> - emit("test_1") - } + public fun select(): Query = Query(-1_042_942_063, arrayOf("test3"), driver, "Data.sq", + "select", """ + |SELECT * + |FROM test3 + """.trimMargin()) { cursor -> + check(cursor is JdbcCursor) + cursor.getString(0)!! + } + + public fun insert(test3: Test3): ExecutableQuery = InsertQuery(test3) { cursor -> + check(cursor is JdbcCursor) + cursor.getString(0)!! } - public fun insertSecond( - first: String?, - second: Int, - third: String, - fourth: Int?, - fifth: Long?, - ) { - driver.execute(-1_370_094_750, - """INSERT INTO test_2 (first, second, third, fourth, fifth) VALUES (?, ?, ?, ?, ?)""", 5) { - check(this is JdbcPreparedStatement) - bindString(0, first) - bindInt(1, second) - bindString(2, third) - bindInt(3, fourth) - bindLong(4, fifth) - } - notifyQueries(-1_370_094_750) { emit -> - emit("test_2") + private inner class InsertQuery( + public val test3: Test3, + mapper: (SqlCursor) -> T, + ) : ExecutableQuery(mapper) { + override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = + driver.executeQuery(-1_320_712_882, """INSERT INTO test3 (alpha) VALUES (?) RETURNING *""", + mapper, 1) { + check(this is JdbcPreparedStatement) + bindString(0, test3.alpha) } + + override fun toString(): String = "Data.sq:insert" } } diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test3.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test3.kt new file mode 100644 index 00000000000..d34bdda3041 --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test3.kt @@ -0,0 +1,7 @@ +package com.example + +import kotlin.String + +public data class Test3( + public val alpha: String, +) diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_1.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_1.kt deleted file mode 100644 index 1a3a9a0fb71..00000000000 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_1.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.example - -import kotlin.Long - -public data class Test_1( - public val first: Long, -) diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_2.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_2.kt deleted file mode 100644 index 1d8fb6a9202..00000000000 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/Test_2.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.example - -import kotlin.Int -import kotlin.Long -import kotlin.String - -public data class Test_2( - public val first: String?, - public val second: Int, - public val third: String, - public val fourth: Int?, - public val fifth: Long?, -) From 1ed79dc3ded7ed00237e9326922bf657285d48cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:03:04 +0000 Subject: [PATCH 054/304] Fix 4474 PostgreSql create extension (#4541) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * PostgreSql create extension fixup Support CREATE EXTENSION … Overrides the extension_stmt to add unsupported CREATE EXTENSION * Grammar for create_extension_stmt drop_extension_stmt alter_extension_stmt Extensions with fixture tests for supported syntax CreateExtensionTests removed as not needed in this change --- .../dialects/postgresql/grammar/PostgreSql.bnf | 13 ++++++++++++- .../fixtures_postgresql/extensions/Sample.s | 13 +++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/extensions/Sample.s diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 92b418d188b..6e726c86cfc 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -16,6 +16,7 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.AS" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ASC" "static com.alecstrong.sql.psi.core.psi.SqlTypes.BY" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.CASCADE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.COLLATE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.COLUMN" "static com.alecstrong.sql.psi.core.psi.SqlTypes.COMMA" @@ -371,12 +372,22 @@ json_expression ::= {column_name} ( jsona_binary_operator | jsonb_binary_operato jsona_binary_operator ::= '->' | '->>' | '#>' jsonb_binary_operator ::= '@>' | '<@' | '?|' | '?&' | '?' | '#-' -extension_stmt ::= create_sequence_stmt | copy_stdin | truncate_stmt | set_stmt | drop_sequence_stmt | alter_sequence_stmt { +extension_stmt ::= create_sequence_stmt | copy_stdin | truncate_stmt | set_stmt | drop_sequence_stmt | alter_sequence_stmt | create_extension_stmt | drop_extension_stmt | alter_extension_stmt { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionStmtImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionStmt" override = true } +extension_name ::= id | string + +extension_version ::= id | string + +create_extension_stmt ::= CREATE 'EXTENSION' [ IF NOT EXISTS ] extension_name [ WITH ] [ 'SCHEMA' id ] [ 'VERSION' extension_version ] [ CASCADE ] + +drop_extension_stmt ::= DROP 'EXTENSION' [ IF EXISTS ] extension_name [ ( COMMA extension_name ) * ] [ CASCADE | 'RESTRICT' ] + +alter_extension_stmt ::= ALTER 'EXTENSION' [ IF EXISTS ] extension_name ( UPDATE [ TO extension_version ] | SET 'SCHEMA' id ) + copy_stdin ::= 'COPY' [ {database_name} DOT ] {table_name} [ AS {table_alias} ] [ LP {column_name} ( COMMA {column_name} ) * RP ] FROM 'STDIN' [ [ WITH ] LP copy_option ( COMMA copy_option) * RP ] [ WHERE <> ] { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.CopyMixin" } diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/extensions/Sample.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/extensions/Sample.s new file mode 100644 index 00000000000..300faf912f8 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/extensions/Sample.s @@ -0,0 +1,13 @@ +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; +CREATE EXTENSION pg_trgm; +CREATE EXTENSION pg_stat_statements WITH SCHEMA pgss; +CREATE EXTENSION bool_plperlu CASCADE; +CREATE EXTENSION citext WITH VERSION '1.1'; + +ALTER EXTENSION hstore UPDATE TO '1.3'; +ALTER EXTENSION IF EXISTS hstore UPDATE; +ALTER EXTENSION IF EXISTS hstore SET SCHEMA public; + +DROP EXTENSION citext; +DROP EXTENSION hstore CASCADE; +DROP EXTENSION IF EXISTS hstore, pg_trgm, citext RESTRICT; From 465e4a440c380c54f2393164f08ce079020ba9ec Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:51:35 +0000 Subject: [PATCH 055/304] Update dependency gradle to v8.6 (#5003) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/wrapper/gradle-wrapper.properties | 2 +- sample-web/gradle/wrapper/gradle-wrapper.properties | 2 +- sample/gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1af9e0930b8..a80b22ce5cf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample-web/gradle/wrapper/gradle-wrapper.properties b/sample-web/gradle/wrapper/gradle-wrapper.properties index 1af9e0930b8..a80b22ce5cf 100644 --- a/sample-web/gradle/wrapper/gradle-wrapper.properties +++ b/sample-web/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample/gradle/wrapper/gradle-wrapper.properties b/sample/gradle/wrapper/gradle-wrapper.properties index 1af9e0930b8..a80b22ce5cf 100644 --- a/sample/gradle/wrapper/gradle-wrapper.properties +++ b/sample/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 329ce61ab13afa970f34b4465caae80d020fb149 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 3 Feb 2024 01:36:28 +0000 Subject: [PATCH 056/304] Update dependency com.google.truth:truth to v1.4.0 (#5004) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6ede278721a..141eb8a8d37 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -38,7 +38,7 @@ android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.16.0" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } -truth = { module = "com.google.truth:truth", version = "1.3.0" } +truth = { module = "com.google.truth:truth", version = "1.4.0" } turbine = { module = "app.cash.turbine:turbine", version = "1.0.0" } bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.1" } picnic = { module = "com.jakewharton.picnic:picnic", version = "0.7.0" } From 99eec4d8552d3729a7f749db529ddc371c488090 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 09:27:04 -0500 Subject: [PATCH 057/304] Update dependency mkdocs-material to v9.5.7 (#5005) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/requirements.in | 2 +- .github/workflows/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/requirements.in b/.github/workflows/requirements.in index e7534abc5b7..3a9019afcbf 100644 --- a/.github/workflows/requirements.in +++ b/.github/workflows/requirements.in @@ -1,5 +1,5 @@ mike==1.1.2 mkdocs==1.5.3 mkdocs-macros-plugin==1.0.5 -mkdocs-material==9.5.6 +mkdocs-material==9.5.7 mkdocs-material-extensions==1.3.1 \ No newline at end of file diff --git a/.github/workflows/requirements.txt b/.github/workflows/requirements.txt index 5c53c94ba2b..6670d7de8c9 100644 --- a/.github/workflows/requirements.txt +++ b/.github/workflows/requirements.txt @@ -45,7 +45,7 @@ mkdocs==1.5.3 # mkdocs-material mkdocs-macros-plugin==1.0.5 # via -r requirements.in -mkdocs-material==9.5.6 +mkdocs-material==9.5.7 # via -r requirements.in mkdocs-material-extensions==1.3.1 # via From 0b59fa5307e3978ac9845a56fe2d659136abdfc7 Mon Sep 17 00:00:00 2001 From: Derek Ellis Date: Tue, 13 Feb 2024 23:31:19 -0500 Subject: [PATCH 058/304] Drop Flamingo tests and reduce number of tested IDEA versions (#5021) --- sqldelight-idea-plugin/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqldelight-idea-plugin/build.gradle b/sqldelight-idea-plugin/build.gradle index d56dd811702..ca5eedebdfb 100644 --- a/sqldelight-idea-plugin/build.gradle +++ b/sqldelight-idea-plugin/build.gradle @@ -39,9 +39,9 @@ tasks.named('runIde') { } tasks.named('runPluginVerifier') { + // https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html ideVersions = [ - "IC-2022.2.4", // AS: Flamingo | 2022.2.1 - "IC-2022.3.1", // IC + "IC-2022.3.3", // AS: Giraffe | 2022.3.1 "IC-2023.1", // IC "IC-2023.2", // IC ] From 523728885d20a36edb2e51e353cc22e1949b00ac Mon Sep 17 00:00:00 2001 From: Derek Ellis Date: Wed, 14 Feb 2024 23:31:35 -0500 Subject: [PATCH 059/304] Use a matrix for IDE verification (#5022) * Use a matrix for IDE verification * Add a cumulative check for intellij checks * Add PR-skip equivalent --- .github/workflows/PR-skip.yml | 5 +++++ .github/workflows/PR.yml | 32 ++++++++++++++++++++++++++--- sqldelight-idea-plugin/build.gradle | 11 +++++----- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/.github/workflows/PR-skip.yml b/.github/workflows/PR-skip.yml index c6733ee295a..7c13083b567 100644 --- a/.github/workflows/PR-skip.yml +++ b/.github/workflows/PR-skip.yml @@ -33,3 +33,8 @@ jobs: runs-on: ubuntu-latest steps: - run: 'echo "No build required"' + + verify_intellij_check: + runs-on: ubuntu-latest + steps: + - run: 'echo "No build required"' diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index 7ad82feef2a..b69d431ce87 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -64,9 +64,6 @@ jobs: - name: Run the IntelliJ plugin if: matrix.os == 'ubuntu-latest' && matrix.job == 'instrumentation' run: ./gradlew :sqldelight-idea-plugin:build --stacktrace - - name: Verify IntelliJ plugin - if: matrix.os == 'ubuntu-latest' && matrix.job == 'instrumentation' - run: ./gradlew :sqldelight-idea-plugin:runPluginVerifier # Windows tests - name: Run windows tests @@ -109,5 +106,34 @@ jobs: build-root-directory: sample-web gradle-home-cache-cleanup: true + verify_intellij: + runs-on: ubuntu-latest + + permissions: + contents: read + + strategy: + matrix: + # https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html + idea: + - 'IC-2022.3.3' # AS: Giraffe | 2022.3.1 + - 'IC-2023.1' # IC + - 'IC-2023.2' # IC + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4.0.0 + with: + distribution: 'zulu' + java-version-file: .github/workflows/.ci-java-version + - run: ./gradlew -DideaVersion=${{matrix.idea}} :sqldelight-idea-plugin:runPluginVerifier + + verify_intellij_check: + runs-on: ubuntu-latest + + needs: verify_intellij + steps: + - name: Success! + run: echo "All IntelliJ plugin verification checks passed!" + env: GRADLE_OPTS: -Dorg.gradle.caching=true diff --git a/sqldelight-idea-plugin/build.gradle b/sqldelight-idea-plugin/build.gradle index ca5eedebdfb..42e5f9d0903 100644 --- a/sqldelight-idea-plugin/build.gradle +++ b/sqldelight-idea-plugin/build.gradle @@ -39,12 +39,11 @@ tasks.named('runIde') { } tasks.named('runPluginVerifier') { - // https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html - ideVersions = [ - "IC-2022.3.3", // AS: Giraffe | 2022.3.1 - "IC-2023.1", // IC - "IC-2023.2", // IC - ] + // See: the verify_intellij job in .github/workflows/PR.yml + def version = providers.systemProperty("ideaVersion").getOrElse(null) + if (version != null) { + ideVersions = [version] + } def customFailureLevel = FailureLevel.ALL customFailureLevel.remove(FailureLevel.DEPRECATED_API_USAGES) From 181d26c7bb8c86e78328bf5e87d79f3dad565310 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Feb 2024 21:06:55 -0800 Subject: [PATCH 060/304] Update dependency mkdocs-material to v9.5.9 (#5010) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/requirements.in | 2 +- .github/workflows/requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/requirements.in b/.github/workflows/requirements.in index 3a9019afcbf..18d3c7fc303 100644 --- a/.github/workflows/requirements.in +++ b/.github/workflows/requirements.in @@ -1,5 +1,5 @@ mike==1.1.2 mkdocs==1.5.3 mkdocs-macros-plugin==1.0.5 -mkdocs-material==9.5.7 +mkdocs-material==9.5.9 mkdocs-material-extensions==1.3.1 \ No newline at end of file diff --git a/.github/workflows/requirements.txt b/.github/workflows/requirements.txt index 6670d7de8c9..1f555fae3de 100644 --- a/.github/workflows/requirements.txt +++ b/.github/workflows/requirements.txt @@ -45,7 +45,7 @@ mkdocs==1.5.3 # mkdocs-material mkdocs-macros-plugin==1.0.5 # via -r requirements.in -mkdocs-material==9.5.7 +mkdocs-material==9.5.9 # via -r requirements.in mkdocs-material-extensions==1.3.1 # via From c5c08a98728e774cb0f3921357eb2d4c74a51d4e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Feb 2024 21:07:08 -0800 Subject: [PATCH 061/304] Update testcontainers-java monorepo to v1.19.5 (#5013) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 141eb8a8d37..7138822df09 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ agp = "8.2.2" compileSdk = "34" minSdk = "16" sqlPsi = "0.4.8" -testContainers = "1.19.4" +testContainers = "1.19.5" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } From 3465442fc8d785ff630a0fad1a613e8256aa05b7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Feb 2024 15:49:19 +0000 Subject: [PATCH 062/304] Update kotlinCoroutines to v1.8.0 (#5023) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7138822df09..d5bdca35923 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] kotlin = "1.9.22" dokka = "1.9.10" -kotlinCoroutines = "1.7.3" +kotlinCoroutines = "1.8.0" idea = "222.4459.24" # Flamingo | 2022.2.1 (see https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html) androidxSqlite = "2.4.0" schemaCrawler = "16.19.2" From c8a462a1d75c60a9d43a1d64dd3a345613ae8a12 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 Feb 2024 13:18:00 -0500 Subject: [PATCH 063/304] Update plugin intellij to v1.17.1 (#5008) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d5bdca35923..3dc6009d038 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -101,7 +101,7 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-android-extensions = { id = "org.jetbrains.kotlin.android.extensions", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } -intellij = { id = "org.jetbrains.intellij", version = "1.17.0" } +intellij = { id = "org.jetbrains.intellij", version = "1.17.1" } grammarKitComposer = { id = "com.alecstrong.grammar.kit.composer", version = "0.1.12" } publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } From 76a73f34878dc3adfa9a46f9b845206bb9cfa280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Thu, 15 Feb 2024 18:18:22 +0000 Subject: [PATCH 064/304] Fixes 5018 PostgreSql add Primary Key not nullable types (#5020) * Add mixin to grammar to process rules in AlterTableAddConstraintMixin * Add AlterTableAddConstraintMixin This takes a lazyQuery as input, checks if the table constraint is a primary key, updates any matching columns to not nullable, and returns a new lazyQuery with the transformed columns. This has the effect of propagating primary key nullability constraints to the columns when altering the table. * Add migration test fixtures New test for MigrationQueryTest for Postgresql - not relevant for Sqlite as can't alter table to add primary keys Add tests for compiler generation for single and compound primary keys --- .../postgresql/grammar/PostgreSql.bnf | 4 +- .../mixins/AlterTableAddConstraintMixin.kt | 27 ++++++++++ .../core/migrations/MigrationQueryTest.kt | 4 ++ .../com/example/1.sqm | 9 ++++ .../com/example/2.sqm | 3 ++ .../com/example/Data.sq | 8 +++ .../output/com/example/DataQueries.kt | 51 +++++++++++++++++++ .../output/com/example/TestCompound.kt | 9 ++++ .../output/com/example/TestSingle.kt | 9 ++++ 9 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAddConstraintMixin.kt create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/1.sqm create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/2.sqm create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/Data.sq create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/DataQueries.kt create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/TestCompound.kt create mode 100644 sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/TestSingle.kt diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 6e726c86cfc..690c1fced83 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -314,7 +314,9 @@ alter_table_drop_column ::= DROP [ COLUMN ] {column_name} { pin = 1 } -alter_table_add_constraint ::= ADD table_constraint +alter_table_add_constraint ::= ADD table_constraint { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.AlterTableAddConstraintMixin" +} type_clause ::= 'TYPE' diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAddConstraintMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAddConstraintMixin.kt new file mode 100644 index 00000000000..32abca5f3c6 --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAddConstraintMixin.kt @@ -0,0 +1,27 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlAlterTableAddConstraint +import com.alecstrong.sql.psi.core.psi.AlterTableApplier +import com.alecstrong.sql.psi.core.psi.LazyQuery +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlTypes +import com.intellij.lang.ASTNode + +abstract class AlterTableAddConstraintMixin(node: ASTNode) : + SqlCompositeElementImpl(node), + PostgreSqlAlterTableAddConstraint, + AlterTableApplier { + override fun applyTo(lazyQuery: LazyQuery): LazyQuery = + if (tableConstraint.node.findChildByType(SqlTypes.PRIMARY) != null && + tableConstraint.node.findChildByType(SqlTypes.KEY) != null + ) { + val columns = lazyQuery.query.columns.map { queryCol -> + tableConstraint.indexedColumnList.find { indexedCol -> queryCol.element.textMatches(indexedCol) }.let { + queryCol.copy(nullable = if (it != null) false else queryCol.nullable) + } + } + LazyQuery(lazyQuery.tableName, query = { lazyQuery.query.copy(columns = columns) }) + } else { + lazyQuery + } +} diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt index cf36955ed70..663e7f2ac4e 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/migrations/MigrationQueryTest.kt @@ -29,6 +29,10 @@ class MigrationQueryTest { checkFixtureCompiles("alter-table-alter-column", PostgreSqlDialect()) } + @Test fun `alter table add constraint`() { + checkFixtureCompiles("alter-table-add-constraint", PostgreSqlDialect()) + } + @Test fun `varying query migration packages`() { checkFixtureCompiles("varying-query-migration-packages", PostgreSqlDialect()) } diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/1.sqm b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/1.sqm new file mode 100644 index 00000000000..d1f3f412da4 --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/1.sqm @@ -0,0 +1,9 @@ +CREATE TABLE TestSingle( + first INTEGER, + second TEXT +); + +CREATE TABLE TestCompound ( + first INTEGER, + second TEXT +); diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/2.sqm b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/2.sqm new file mode 100644 index 00000000000..1618ef8e835 --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/2.sqm @@ -0,0 +1,3 @@ +ALTER TABLE TestSingle ADD PRIMARY KEY (first); +ALTER TABLE TestCompound ADD CONSTRAINT pk_first_second PRIMARY KEY (first, second); + diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/Data.sq b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/Data.sq new file mode 100644 index 00000000000..6bc3f66fcb5 --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/com/example/Data.sq @@ -0,0 +1,8 @@ +selectSingle: +SELECT * +FROM TestSingle; + +selectCompound: +SELECT * +FROM TestCompound; + diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/DataQueries.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/DataQueries.kt new file mode 100644 index 00000000000..2efd52acdfb --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/DataQueries.kt @@ -0,0 +1,51 @@ +package com.example + +import app.cash.sqldelight.Query +import app.cash.sqldelight.TransacterImpl +import app.cash.sqldelight.db.SqlDriver +import app.cash.sqldelight.driver.jdbc.JdbcCursor +import kotlin.Any +import kotlin.Int +import kotlin.String + +public class DataQueries( + driver: SqlDriver, +) : TransacterImpl(driver) { + public fun selectSingle(mapper: (first: Int, second: String?) -> T): Query = + Query(-79_317_191, arrayOf("TestSingle"), driver, "Data.sq", "selectSingle", """ + |SELECT * + |FROM TestSingle + """.trimMargin()) { cursor -> + check(cursor is JdbcCursor) + mapper( + cursor.getInt(0)!!, + cursor.getString(1) + ) + } + + public fun selectSingle(): Query = selectSingle { first, second -> + TestSingle( + first, + second + ) + } + + public fun selectCompound(mapper: (first: Int, second: String) -> T): Query = + Query(-19_725_220, arrayOf("TestCompound"), driver, "Data.sq", "selectCompound", """ + |SELECT * + |FROM TestCompound + """.trimMargin()) { cursor -> + check(cursor is JdbcCursor) + mapper( + cursor.getInt(0)!!, + cursor.getString(1)!! + ) + } + + public fun selectCompound(): Query = selectCompound { first, second -> + TestCompound( + first, + second + ) + } +} diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/TestCompound.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/TestCompound.kt new file mode 100644 index 00000000000..01f9f7dea18 --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/TestCompound.kt @@ -0,0 +1,9 @@ +package com.example + +import kotlin.Int +import kotlin.String + +public data class TestCompound( + public val first: Int, + public val second: String, +) diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/TestSingle.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/TestSingle.kt new file mode 100644 index 00000000000..504a227ec72 --- /dev/null +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/TestSingle.kt @@ -0,0 +1,9 @@ +package com.example + +import kotlin.Int +import kotlin.String + +public data class TestSingle( + public val first: Int, + public val second: String?, +) From 007a784f99d914767de2fb76da142cbd99e1ed30 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 16 Feb 2024 19:20:10 +0000 Subject: [PATCH 065/304] Update dependency com.google.truth:truth to v1.4.1 (#5024) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3dc6009d038..b9000f068ab 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -38,7 +38,7 @@ android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.16.0" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } -truth = { module = "com.google.truth:truth", version = "1.4.0" } +truth = { module = "com.google.truth:truth", version = "1.4.1" } turbine = { module = "app.cash.turbine:turbine", version = "1.0.0" } bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.1" } picnic = { module = "com.jakewharton.picnic:picnic", version = "0.7.0" } From 23cf21f95b66af1b7a9e8a7f4c95b2be48077968 Mon Sep 17 00:00:00 2001 From: Marius Volkhart Date: Sun, 18 Feb 2024 11:26:33 -0500 Subject: [PATCH 066/304] Add Postgres Regex function definitions (#5025) It's not unreasonable for someone to use these functions in a SELECT, so we should have return types for them. --- .../sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index fd2b09f3a0a..1256a858dce 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -172,6 +172,9 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "jsonb_path_exists", "jsonb_path_match", "jsonb_path_exists_tz", "jsonb_path_match_tz" -> IntermediateType(BOOLEAN) "currval", "lastval", "nextval", "setval" -> IntermediateType(BIG_INT) "generate_series" -> encapsulatingType(exprList, INTEGER, BIG_INT, REAL, TIMESTAMP_TIMEZONE, TIMESTAMP) + "regexp_count", "regexp_instr" -> IntermediateType(INTEGER) + "regexp_like" -> IntermediateType(BOOLEAN) + "regexp_replace", "regexp_substr" -> IntermediateType(TEXT) else -> null } From fd5b1d0069c9605082f10e34285f912c77e5bf79 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 22 Feb 2024 01:39:44 +0000 Subject: [PATCH 067/304] Update testcontainers-java monorepo to v1.19.6 (#5036) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b9000f068ab..5469436294a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ agp = "8.2.2" compileSdk = "34" minSdk = "16" sqlPsi = "0.4.8" -testContainers = "1.19.5" +testContainers = "1.19.6" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } From b1d67cf6437f1f8b687ac644a06de883bc0c79d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 12:29:21 +0000 Subject: [PATCH 068/304] Update actions/setup-java action to v4.1.0 (#5042) * Update actions/setup-java action to v4.1.0 * Update PR.yml * Update Publish-Website.yml * Update Release.yml --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jake Wharton --- .github/workflows/PR.yml | 6 +++--- .github/workflows/Publish-Website.yml | 2 +- .github/workflows/Release.yml | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index b69d431ce87..937db6dd18f 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -15,7 +15,7 @@ jobs: contents: read steps: - uses: actions/checkout@v4 - - uses: actions/setup-java@v4.0.0 + - uses: actions/setup-java@v4 with: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version @@ -43,7 +43,7 @@ jobs: - name: Checkout the repo uses: actions/checkout@v4 - name: Set up Java - uses: actions/setup-java@v4.0.0 + uses: actions/setup-java@v4 with: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version @@ -121,7 +121,7 @@ jobs: - 'IC-2023.2' # IC steps: - uses: actions/checkout@v4 - - uses: actions/setup-java@v4.0.0 + - uses: actions/setup-java@v4 with: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version diff --git a/.github/workflows/Publish-Website.yml b/.github/workflows/Publish-Website.yml index 6cdc66c2c07..b6c637245d9 100644 --- a/.github/workflows/Publish-Website.yml +++ b/.github/workflows/Publish-Website.yml @@ -28,7 +28,7 @@ jobs: uses: actions/checkout@v4 - uses: actions/configure-pages@v4 - name: Set up Java - uses: actions/setup-java@v4.0.0 + uses: actions/setup-java@v4 with: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index 3f6278518e7..0fbf8412539 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -26,7 +26,7 @@ jobs: - name: Checkout the repo uses: actions/checkout@v4 - name: Set up Java - uses: actions/setup-java@v4.0.0 + uses: actions/setup-java@v4 with: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version @@ -73,7 +73,7 @@ jobs: mkdir -p .gradle/ && touch .gradle/gradle.properties - name: Set up Java id: setup-java - uses: actions/setup-java@v4.0.0 + uses: actions/setup-java@v4 with: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version @@ -108,7 +108,7 @@ jobs: mkdir -p .gradle/ && touch .gradle/gradle.properties - name: Set up Java id: setup-java - uses: actions/setup-java@v4.0.0 + uses: actions/setup-java@v4 with: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version From c70ed020e2236f080e721bb5560f86517c1d9f17 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 07:14:20 -0500 Subject: [PATCH 069/304] Update plugin ksp to v1.9.22-1.0.18 (#5046) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5469436294a..23fe234e12f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -107,5 +107,5 @@ publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } -ksp = { id = "com.google.devtools.ksp", version = "1.9.22-1.0.17" } +ksp = { id = "com.google.devtools.ksp", version = "1.9.22-1.0.18" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.14.0" } From 6bc644413957ee7da7b7f5d72d84e6eb03c1573c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 18:13:03 -0500 Subject: [PATCH 070/304] Update agp to v8.3.0 (#5048) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 23fe234e12f..a4acf4c19c1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.1.1" -agp = "8.2.2" +agp = "8.3.0" compileSdk = "34" minSdk = "16" sqlPsi = "0.4.8" From b12a1074655a1fc3f7ca5875e3bbb49dd1c6efb1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 23:52:13 +0000 Subject: [PATCH 071/304] Update dependency com.google.truth:truth to v1.4.2 (#5049) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a4acf4c19c1..10bcafced35 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -38,7 +38,7 @@ android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.16.0" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } -truth = { module = "com.google.truth:truth", version = "1.4.1" } +truth = { module = "com.google.truth:truth", version = "1.4.2" } turbine = { module = "app.cash.turbine:turbine", version = "1.0.0" } bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.1" } picnic = { module = "com.jakewharton.picnic:picnic", version = "0.7.0" } From b7042cc4b90d7c5a7fd795a3be9382ac5a35320e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 29 Feb 2024 19:02:37 -0500 Subject: [PATCH 072/304] Update dependency com.pinterest.ktlint:ktlint-cli to v1.2.1 (#5045) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 10bcafced35..f1a64619627 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ sqliter = "1.3.1" sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" -ktlint = "1.1.1" +ktlint = "1.2.1" agp = "8.3.0" compileSdk = "34" minSdk = "16" From b044cae23b8e8f39d48e7663590b7087cec0523e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 1 Mar 2024 19:37:34 -0800 Subject: [PATCH 073/304] Update dependency org.mariadb:r2dbc-mariadb to v1.2.0 (#5038) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../src/test/integration-mysql-async/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldelight-gradle-plugin/src/test/integration-mysql-async/build.gradle b/sqldelight-gradle-plugin/src/test/integration-mysql-async/build.gradle index 840a291ac1e..2efdbcfc0e3 100644 --- a/sqldelight-gradle-plugin/src/test/integration-mysql-async/build.gradle +++ b/sqldelight-gradle-plugin/src/test/integration-mysql-async/build.gradle @@ -17,7 +17,7 @@ dependencies { implementation libs.mysqlJdbc implementation libs.testContainers.mysql implementation libs.testContainers.r2dbc - implementation "org.mariadb:r2dbc-mariadb:1.1.4" + implementation "org.mariadb:r2dbc-mariadb:1.2.0" implementation "app.cash.sqldelight:r2dbc-driver:${app.cash.sqldelight.VersionKt.VERSION}" implementation "app.cash.sqldelight:async-extensions:${app.cash.sqldelight.VersionKt.VERSION}" implementation libs.truth From 766f49becee6fe269efc3fecaf00d0713b22645f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 1 Mar 2024 19:37:49 -0800 Subject: [PATCH 074/304] Update dependency org.postgresql:postgresql to v42.7.2 (#5031) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f1a64619627..5f10e2cbc81 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -68,7 +68,7 @@ robolectric = { module = "org.robolectric:robolectric", version = "4.11.1" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.1.0" } -postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.1" } +postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.2" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } schemaCrawler-tools = { module = "us.fatehi:schemacrawler-tools", version.ref = "schemaCrawler" } From 20f33e550b3911350bf4e25dbc6f20064dd5c803 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 16:30:04 +0000 Subject: [PATCH 075/304] Update dependency org.jetbrains.dokka to v1.9.20 (#5053) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5f10e2cbc81..49ad86836af 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] kotlin = "1.9.22" -dokka = "1.9.10" +dokka = "1.9.20" kotlinCoroutines = "1.8.0" idea = "222.4459.24" # Flamingo | 2022.2.1 (see https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html) androidxSqlite = "2.4.0" From 212faf12b67fc458526f81d1770c7be95ecfe83d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 20:47:23 +0000 Subject: [PATCH 076/304] Update testcontainers-java monorepo to v1.19.7 (#5061) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 49ad86836af..0e264b343a1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ agp = "8.3.0" compileSdk = "34" minSdk = "16" sqlPsi = "0.4.8" -testContainers = "1.19.6" +testContainers = "1.19.7" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } From 917cb8e5ee437d37bfdbdcbb3fded09b683fe826 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 6 Mar 2024 18:15:12 +0000 Subject: [PATCH 077/304] Update dependency app.cash.turbine:turbine to v1.1.0 (#5064) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0e264b343a1..8c8927c74aa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,7 +39,7 @@ kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.16.0" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } truth = { module = "com.google.truth:truth", version = "1.4.2" } -turbine = { module = "app.cash.turbine:turbine", version = "1.0.0" } +turbine = { module = "app.cash.turbine:turbine", version = "1.1.0" } bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.1" } picnic = { module = "com.jakewharton.picnic:picnic", version = "0.7.0" } moshi = { module = "com.squareup.moshi:moshi", version = "1.15.1" } From 0e76f86bc1f55b17c9f21909963db8db26ae84d0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 00:57:40 +0000 Subject: [PATCH 078/304] Update kotlin monorepo (#5065) * Update kotlin monorepo * Use correct Kotlin and KSP versions --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Derek Ellis --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8c8927c74aa..7796b1065be 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlin = "1.9.22" +kotlin = "1.9.23" dokka = "1.9.20" kotlinCoroutines = "1.8.0" idea = "222.4459.24" # Flamingo | 2022.2.1 (see https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html) @@ -107,5 +107,5 @@ publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } -ksp = { id = "com.google.devtools.ksp", version = "1.9.22-1.0.18" } +ksp = { id = "com.google.devtools.ksp", version = "1.9.23-1.0.19" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.14.0" } From 9a889f50c34bda86143a2b6d25e820a3311bf5f0 Mon Sep 17 00:00:00 2001 From: Emeka Nwagu Date: Tue, 12 Mar 2024 18:30:18 -0400 Subject: [PATCH 079/304] switch to processIsolation (#5068) --- .../kotlin/app/cash/sqldelight/gradle/SqlDelightWorkerTask.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/SqlDelightWorkerTask.kt b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/SqlDelightWorkerTask.kt index c2d163f31bd..73fa7603759 100644 --- a/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/SqlDelightWorkerTask.kt +++ b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/SqlDelightWorkerTask.kt @@ -22,7 +22,7 @@ abstract class SqlDelightWorkerTask : SourceTask() { abstract val classpath: ConfigurableFileCollection internal fun workQueue(): WorkQueue = - workerExecutor.classLoaderIsolation { + workerExecutor.processIsolation { it.classpath.from(classpath) } } From a38c8e72fea406989a9fa6b9f1dbd71384d6d5ec Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 04:02:51 +0000 Subject: [PATCH 080/304] Update dependency org.xerial:sqlite-jdbc to v3.45.2.0 (#5070) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7796b1065be..2f1bf6ebf5f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -67,7 +67,7 @@ sqlPsi = { module = "com.alecstrong.sql.psi:core", version.ref = "sqlPsi" } robolectric = { module = "org.robolectric:robolectric", version = "4.11.1" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } -sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.1.0" } +sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.2.0" } postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.2" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } From 94d32c19aa0fe3435357ace46aadaf1442cbdbdd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 20:44:36 +0000 Subject: [PATCH 081/304] Update dependency org.postgresql:postgresql to v42.7.3 (#5073) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2f1bf6ebf5f..64e4079335a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -68,7 +68,7 @@ robolectric = { module = "org.robolectric:robolectric", version = "4.11.1" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.2.0" } -postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.2" } +postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.3" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } schemaCrawler-tools = { module = "us.fatehi:schemacrawler-tools", version.ref = "schemaCrawler" } From 91c0c419d32fe22dce4e82f7931c05fd40105360 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 18:32:42 -0400 Subject: [PATCH 082/304] Update agp to v8.3.1 (#5079) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 64e4079335a..b8f1ad6414d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.2.1" -agp = "8.3.0" +agp = "8.3.1" compileSdk = "34" minSdk = "16" sqlPsi = "0.4.8" From 24a14b889f8372337b47e836b4e8818bc761d391 Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Tue, 19 Mar 2024 18:16:26 +0100 Subject: [PATCH 083/304] Use new Gradle setup action (#5080) Co-authored-by: hfhbd --- .github/workflows/PR.yml | 6 +++--- .github/workflows/Publish-Website.yml | 2 +- .github/workflows/Release.yml | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index 937db6dd18f..06890d1b429 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -48,7 +48,7 @@ jobs: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - name: Setup gradle - uses: gradle/gradle-build-action@v3 + uses: gradle/actions/setup-gradle@v3 with: gradle-home-cache-cleanup: true @@ -92,7 +92,7 @@ jobs: # Build the samples - name: Build the mobile sample if: matrix.os == 'macOS-latest' && matrix.job == 'test' - uses: gradle/gradle-build-action@v3 + uses: gradle/actions/setup-gradle@v3 with: arguments: build --stacktrace --parallel build-root-directory: sample @@ -100,7 +100,7 @@ jobs: - name: Build the web sample if: matrix.os == 'macOS-latest' && matrix.job == 'test' - uses: gradle/gradle-build-action@v3 + uses: gradle/actions/setup-gradle@v3 with: arguments: kotlinUpgradeYarnLock build --stacktrace --parallel build-root-directory: sample-web diff --git a/.github/workflows/Publish-Website.yml b/.github/workflows/Publish-Website.yml index b6c637245d9..4d9dff4bd97 100644 --- a/.github/workflows/Publish-Website.yml +++ b/.github/workflows/Publish-Website.yml @@ -33,7 +33,7 @@ jobs: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - name: Setup gradle - uses: gradle/gradle-build-action@v3 + uses: gradle/actions/setup-gradle@v3 with: gradle-home-cache-cleanup: true diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index 0fbf8412539..cbd234fc93e 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -31,7 +31,7 @@ jobs: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - name: Setup gradle - uses: gradle/gradle-build-action@v3 + uses: gradle/actions/setup-gradle@v3 with: gradle-home-cache-cleanup: true @@ -82,7 +82,7 @@ jobs: cd ~/.gradle echo "org.gradle.java.installations.paths=${{ steps.setup-java.outputs.path }}" >> gradle.properties - name: Setup gradle - uses: gradle/gradle-build-action@v3 + uses: gradle/actions/setup-gradle@v3 with: gradle-home-cache-cleanup: true @@ -120,7 +120,7 @@ jobs: cd ~/.gradle echo "org.gradle.java.installations.paths=${{ steps.setup-java.outputs.path }}" >> gradle.properties - name: Setup gradle - uses: gradle/gradle-build-action@v3 + uses: gradle/actions/setup-gradle@v3 with: gradle-home-cache-cleanup: true From 36028336f9b1135b6fc2523fcde3189237895117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 19 Mar 2024 19:27:26 +0000 Subject: [PATCH 084/304] Fixes 4703 aggregate expressions (#5071) * First effort at string_agg grammar * Remove string_agg function not used as requires more complex grammar * Fixture tests for aggregate expressions Complext expressions * Add type resolution string_agg is TEXT Keep existing function as seems to keep it working * make string_agg_stmt the first in order * Fixture test for simple string_agg function call with argument * Add Integration test DISTINCT...ORDER BY * Add grammar for array_agg_stmt TODO - need to revisit * Add array type TODO: need to improve SqlExp code * Add tests for array_agg Fixture and Integration * More tests improve coverage of variations * Try to improve Resolver Move the expr type to mixin * Support coalesce with array type isArrayType is used to determine if a resolved type is an array using String :[ There doesn't appear to be a way to check this in the IntermediateType * Add test for Coalesce Otherwise a String is resolved as the return type, without array support in Coalesce * Improve Order By Use existing ordering_term --- .../postgresql/PostgreSqlTypeResolver.kt | 53 +++++++++---- .../postgresql/grammar/PostgreSql.bnf | 12 ++- .../mixins/AggregateExpressionMixin.kt | 13 ++++ .../aggregate-expressions/Test.s | 61 +++++++++++++++ .../sqldelight/postgresql/integration/Dog.sq | 35 +++++++++ .../postgresql/integration/PostgreSqlTest.kt | 77 +++++++++++++++++++ 6 files changed, 236 insertions(+), 15 deletions(-) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AggregateExpressionMixin.kt create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/aggregate-expressions/Test.s diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index 1256a858dce..2c832a6a850 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -17,6 +17,7 @@ import app.cash.sqldelight.dialects.postgresql.PostgreSqlType.DATE import app.cash.sqldelight.dialects.postgresql.PostgreSqlType.SMALL_INT import app.cash.sqldelight.dialects.postgresql.PostgreSqlType.TIMESTAMP import app.cash.sqldelight.dialects.postgresql.PostgreSqlType.TIMESTAMP_TIMEZONE +import app.cash.sqldelight.dialects.postgresql.grammar.mixins.AggregateExpressionMixin import app.cash.sqldelight.dialects.postgresql.grammar.mixins.WindowFunctionMixin import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlDeleteStmtLimited import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlExtensionExpr @@ -72,17 +73,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes }, ) if (node.getChildren(null).map { it.text }.takeLast(2) == listOf("[", "]")) { - return IntermediateType( - object : DialectType { - override val javaType = Array::class.asTypeName().parameterizedBy(type.javaType) - - override fun prepareStatementBinder(columnIndex: CodeBlock, value: CodeBlock) = - CodeBlock.of("bindObject(%L, %L)\n", columnIndex, value) - - override fun cursorGetter(columnIndex: Int, cursorName: String) = - CodeBlock.of("$cursorName.getArray<%T>($columnIndex)", type.javaType) - }, - ) + return arrayIntermediateType(type) } return type } @@ -119,9 +110,16 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "concat" -> encapsulatingType(exprList, TEXT) "substring", "replace" -> IntermediateType(TEXT).nullableIf(resolvedType(exprList[0]).javaType.isNullable) "starts_with" -> IntermediateType(BOOLEAN) - "coalesce", "ifnull" -> encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB, nullability = { exprListNullability -> - exprListNullability.all { it } - }) + "coalesce", "ifnull" -> { + val exprType = exprList.first().postgreSqlType() + if (isArrayType(exprType)) { + exprType + } else { + encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB, nullability = { exprListNullability -> + exprListNullability.all { it } + }) + } + } "max" -> encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() "min" -> encapsulatingTypePreferringKotlin(exprList, BLOB, TEXT, SMALL_INT, INTEGER, PostgreSqlType.INTEGER, BIG_INT, REAL, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() "sum" -> { @@ -167,6 +165,10 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "json_typeof", "jsonb_typeof", "json_agg", "jsonb_agg", "json_object_agg", "jsonb_object_agg", -> IntermediateType(TEXT) + "array_agg" -> { + val typeForAgg = encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() + arrayIntermediateType(typeForAgg) + } "string_agg" -> IntermediateType(TEXT) "json_array_length", "jsonb_array_length" -> IntermediateType(INTEGER) "jsonb_path_exists", "jsonb_path_match", "jsonb_path_exists_tz", "jsonb_path_match_tz" -> IntermediateType(BOOLEAN) @@ -247,6 +249,13 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes else -> parentResolver.resolvedType(this) } is PostgreSqlExtensionExpr -> when { + arrayAggStmt != null -> { + val typeForArray = (arrayAggStmt as AggregateExpressionMixin).expr.postgreSqlType() // same as resolvedType(expr) + arrayIntermediateType(typeForArray) + } + stringAggStmt != null -> { + IntermediateType(TEXT) + } windowFunctionExpr != null -> { val windowFunctionExpr = windowFunctionExpr as WindowFunctionMixin functionType(windowFunctionExpr.functionExpr)!! @@ -270,5 +279,21 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes SqlTypes.LT, SqlTypes.LTE, ) + + private fun arrayIntermediateType(type: IntermediateType): IntermediateType { + return IntermediateType( + object : DialectType { + override val javaType = Array::class.asTypeName().parameterizedBy(type.javaType) + override fun prepareStatementBinder(columnIndex: CodeBlock, value: CodeBlock) = + CodeBlock.of("bindObject(%L, %L)\n", columnIndex, value) + override fun cursorGetter(columnIndex: Int, cursorName: String) = + CodeBlock.of("$cursorName.getArray<%T>($columnIndex)", type.javaType) + }, + ) + } + + private fun isArrayType(type: IntermediateType): Boolean { + return type.javaType.toString().startsWith("kotlin.Array") + } } } diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 690c1fced83..feab46fd7bd 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -46,6 +46,7 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.HAVING" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ID" "static com.alecstrong.sql.psi.core.psi.SqlTypes.IF" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.IS" "static com.alecstrong.sql.psi.core.psi.SqlTypes.IGNORE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.INDEX" "static com.alecstrong.sql.psi.core.psi.SqlTypes.INSERT" @@ -353,7 +354,7 @@ compound_select_stmt ::= [ {with_clause} ] {select_stmt} ( {compound_operator} override = true } -extension_expr ::= json_expression | boolean_literal | boolean_not_expression | window_function_expr { +extension_expr ::= array_agg_stmt| string_agg_stmt | json_expression | boolean_literal | boolean_not_expression | window_function_expr { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionExprImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionExpr" override = true @@ -442,6 +443,15 @@ truncate_option ::= truncate_option_identity | truncate_option_cascade truncate_option_identity ::= ( 'RESTART' | 'CONTINUE' ) 'IDENTITY' truncate_option_cascade ::= 'CASCADE' | 'RESTRICT' +string_agg_stmt ::= 'string_agg' LP [ ALL | DISTINCT ] <> COMMA string_literal [ ORDER BY {ordering_term} ( COMMA {ordering_term} ) * ] RP +[ 'FILTER' LP WHERE <> RP ] { +} + +array_agg_stmt ::= 'array_agg' LP [ ALL | DISTINCT ] <> [ ORDER BY {ordering_term} ( COMMA {ordering_term} ) * ] RP +[ 'FILTER' LP WHERE <> RP ] { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.AggregateExpressionMixin" +} + set_stmt ::= 'SET' [ ('SESSION' | 'LOCAL') ] ( set_config | set_timezone | set_schema | set_names | set_seed ) set_value ::= literal_value | {identifier} | DEFAULT set_config ::= {identifier} ( TO | EQ ) set_value diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AggregateExpressionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AggregateExpressionMixin.kt new file mode 100644 index 00000000000..a4d3a21b030 --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AggregateExpressionMixin.kt @@ -0,0 +1,13 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlArrayAggStmt +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlExpr +import com.intellij.lang.ASTNode + +internal abstract class AggregateExpressionMixin( + node: ASTNode, +) : SqlCompositeElementImpl(node), + PostgreSqlArrayAggStmt { + val expr get() = children.filterIsInstance().first() +} diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/aggregate-expressions/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/aggregate-expressions/Test.s new file mode 100644 index 00000000000..367b020560f --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/aggregate-expressions/Test.s @@ -0,0 +1,61 @@ +CREATE TABLE users ( + id INTEGER PRIMARY KEY, + username TEXT, + bio TEXT, + image TEXT +); + +CREATE TABLE articles ( + id INTEGER PRIMARY KEY, + slug TEXT, + title TEXT, + description TEXT, + body TEXT, + author_id INTEGER REFERENCES users(id), + createdAt TIMESTAMP, + updatedAt TIMESTAMP +); + +CREATE TABLE tags ( + id INTEGER PRIMARY KEY, + article_id INTEGER REFERENCES articles(id), + tag TEXT +); + +SELECT articles.id, slug, title, description, body, users.username, users.bio, users.image, createdAt, updatedAt, +COALESCE (string_agg (DISTINCT tag, ',' ORDER BY tag DESC) FILTER (WHERE tag IS NOT NULL)) AS articleTags +FROM articles +LEFT JOIN tags ON articles.id = tags.article_id +JOIN users ON articles.author_id = users.id +GROUP BY articles.id, users.id; + +SELECT string_agg (DISTINCT tag, ',') AS articleTags +FROM articles +LEFT JOIN tags ON articles.id = tags.article_id +JOIN users ON articles.author_id = users.id +GROUP BY articles.id, users.id; + +SELECT string_agg (DISTINCT title || ' ' || tag, ',' ) AS articleTags +FROM articles +LEFT JOIN tags ON articles.id = tags.article_id +JOIN users ON articles.author_id = users.id +GROUP BY articles.id, users.id; + +SELECT username, string_agg (tag, ',') +FROM articles +LEFT JOIN tags ON articles.id = tags.article_id +JOIN users ON articles.author_id = users.id +GROUP BY articles.id, users.id; + +SELECT articles.id, slug, title, description, body, users.username, users.bio, users.image, createdAt, updatedAt, +COALESCE (array_agg (DISTINCT tag ORDER BY tag) FILTER (WHERE tag IS NOT NULL), '{}') AS articleTags +FROM articles +LEFT JOIN tags ON articles.id = tags.article_id +JOIN users ON articles.author_id = users.id +GROUP BY articles.id, users.id; + +SELECT array_agg (tag ORDER BY tag) +FROM articles +LEFT JOIN tags ON articles.id = tags.article_id +JOIN users ON articles.author_id = users.id +GROUP BY articles.id, users.id; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dog.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dog.sq index a94e0628c42..6dad18247f9 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dog.sq +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dog.sq @@ -71,3 +71,38 @@ SELECT breed, FROM dog GROUP BY breed ORDER BY breed; + +selectDogsStringAggNameOrderBy: +SELECT breed, + string_agg(DISTINCT name, ',' ORDER BY name) +FROM dog +GROUP BY breed +ORDER BY breed; + +selectDogsArrayAggName: +SELECT breed, + array_agg(name) +FROM dog +GROUP BY breed +ORDER BY breed; + +selectDogsCoalesceArrayAggName: +SELECT breed, + coalesce(array_agg(name)) +FROM dog +GROUP BY breed +ORDER BY breed; + +selectDogsArrayAggNameOrderBy: +SELECT breed, + array_agg(DISTINCT name ORDER BY name ASC) +FROM dog +GROUP BY breed +ORDER BY breed; + +selectDogsArrayAggNameOrderByWhereFilter: +SELECT breed, + array_agg(DISTINCT name ORDER BY name DESC) FILTER (WHERE is_good = 1) +FROM dog +GROUP BY breed +ORDER BY breed; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index a62686a1128..6153df9bb24 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -286,6 +286,83 @@ class PostgreSqlTest { } } + @Test fun testStringAggOrderBy() { + database.dogQueries.insertDog("Tilda", "Pomeranian") + database.dogQueries.insertDog("Bruno", "Pomeranian") + database.dogQueries.insertDog("Mads", "Broholmer") + + database.dogQueries.selectDogsStringAggNameOrderBy().executeAsList().let { + assertThat(it).containsExactly( + SelectDogsStringAggNameOrderBy("Broholmer", "Mads"), + SelectDogsStringAggNameOrderBy("Pomeranian", "Bruno,Tilda"), + ) + } + } + + @Test fun testArrayAgg() { + database.dogQueries.insertDog("Tilda", "Pomeranian") + database.dogQueries.insertDog("Bruno", "Pomeranian") + database.dogQueries.insertDog("Mads", "Broholmer") + + database.dogQueries.selectDogsArrayAggName().executeAsList().zip( + listOf( + SelectDogsArrayAggName("Broholmer", arrayOf("Mads")), + SelectDogsArrayAggName("Pomeranian", arrayOf("Tilda", "Bruno")), + ), + ).forEach { dog -> + assertThat(dog.first.breed).isEqualTo(dog.second.breed) + assertThat(dog.first.expr).isEqualTo(dog.second.expr) // isEqualTo works with Array equality + } + } + + @Test fun testCoalesceArrayAgg() { + database.dogQueries.insertDog("Tilda", "Pomeranian") + database.dogQueries.insertDog("Bruno", "Pomeranian") + database.dogQueries.insertDog("Mads", "Broholmer") + + database.dogQueries.selectDogsCoalesceArrayAggName().executeAsList().zip( + listOf( + SelectDogsCoalesceArrayAggName("Broholmer", arrayOf("Mads")), + SelectDogsCoalesceArrayAggName("Pomeranian", arrayOf("Tilda", "Bruno")), + ), + ).forEach { dog -> + assertThat(dog.first.breed).isEqualTo(dog.second.breed) + assertThat(dog.first.coalesce).isEqualTo(dog.second.coalesce) // isEqualTo works with Array equality + } + } + + @Test fun testArrayAggOrderBy() { + database.dogQueries.insertDog("Tilda", "Pomeranian") + database.dogQueries.insertDog("Bruno", "Pomeranian") + database.dogQueries.insertDog("Mads", "Broholmer") + + database.dogQueries.selectDogsArrayAggNameOrderBy().executeAsList().zip( + listOf( + SelectDogsArrayAggNameOrderBy("Broholmer", arrayOf("Mads")), + SelectDogsArrayAggNameOrderBy("Pomeranian", arrayOf("Bruno", "Tilda")), + ), + ).forEach { dog -> + assertThat(dog.first.breed).isEqualTo(dog.second.breed) + assertThat(dog.first.expr).isEqualTo(dog.second.expr) // isEqualTo works with Array equality + } + } + + @Test fun testArrayAggOrderByWhereFilter() { + database.dogQueries.insertDog("Tilda", "Pomeranian") + database.dogQueries.insertDog("Bruno", "Pomeranian") + database.dogQueries.insertDog("Mads", "Broholmer") + + database.dogQueries.selectDogsArrayAggNameOrderByWhereFilter().executeAsList().zip( + listOf( + SelectDogsArrayAggNameOrderByWhereFilter("Broholmer", arrayOf("Mads")), + SelectDogsArrayAggNameOrderByWhereFilter("Pomeranian", arrayOf("Tilda", "Bruno")), + ), + ).forEach { dog -> + assertThat(dog.first.breed).isEqualTo(dog.second.breed) + assertThat(dog.first.expr).isEqualTo(dog.second.expr) // isEqualTo works with Array equality + } + } + @Test fun testSerial() { database.run { oneEntityQueries.transaction { From be82f846b7a2b194eb50faf3d576056b861eb922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 19 Mar 2024 19:29:33 +0000 Subject: [PATCH 085/304] Fixes 5028 PostgreSql json (#5030) * Add new method bindObjectOther With JDBC, setObject...Types.OTHER can be used to bind a String to a JSON type Keep the jsonDataType as a String for reading and writing This is also useful for other types like TSVector * Add JSON enum type JSON type needs special object binding to write as a String. Read as a String as normal * Add JsonQueries integration tests Previously there were no jsonQueries integration tests even though source existed --- .../dialects/postgresql/PostgreSqlType.kt | 4 ++++ .../postgresql/PostgreSqlTypeResolver.kt | 2 +- .../cash/sqldelight/driver/jdbc/JdbcDriver.kt | 8 ++++++++ .../sqldelight/postgresql/integration/Json.sq | 9 ++++++++- .../postgresql/integration/PostgreSqlTest.kt | 18 ++++++++++++++++++ 5 files changed, 39 insertions(+), 2 deletions(-) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt index b7907e30e52..16c4ad75668 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt @@ -6,6 +6,7 @@ import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.INT import com.squareup.kotlinpoet.LONG import com.squareup.kotlinpoet.SHORT +import com.squareup.kotlinpoet.STRING import com.squareup.kotlinpoet.TypeName internal enum class PostgreSqlType(override val javaType: TypeName) : DialectType { @@ -19,6 +20,7 @@ internal enum class PostgreSqlType(override val javaType: TypeName) : DialectTyp INTERVAL(ClassName("org.postgresql.util", "PGInterval")), UUID(ClassName("java.util", "UUID")), NUMERIC(ClassName("java.math", "BigDecimal")), + JSON(STRING), ; override fun prepareStatementBinder(columnIndex: CodeBlock, value: CodeBlock): CodeBlock { @@ -30,6 +32,7 @@ internal enum class PostgreSqlType(override val javaType: TypeName) : DialectTyp BIG_INT -> "bindLong" DATE, TIME, TIMESTAMP, TIMESTAMP_TIMEZONE, INTERVAL, UUID -> "bindObject" NUMERIC -> "bindBigDecimal" + JSON -> "bindObjectOther" }, ) .add("(%L, %L)\n", columnIndex, value) @@ -44,6 +47,7 @@ internal enum class PostgreSqlType(override val javaType: TypeName) : DialectTyp BIG_INT -> "$cursorName.getLong($columnIndex)" DATE, TIME, TIMESTAMP, TIMESTAMP_TIMEZONE, INTERVAL, UUID -> "$cursorName.getObject<%T>($columnIndex)" NUMERIC -> "$cursorName.getBigDecimal($columnIndex)" + JSON -> "$cursorName.getString($columnIndex)" }, javaType, ) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index 2c832a6a850..b0c594cc638 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -66,7 +66,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes else -> throw IllegalArgumentException("Unknown date type ${dateDataType!!.text}") } } - jsonDataType != null -> TEXT + jsonDataType != null -> PostgreSqlType.JSON booleanDataType != null -> BOOLEAN blobDataType != null -> BLOB else -> throw IllegalArgumentException("Unknown kotlin type for sql type ${this.text}") diff --git a/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt b/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt index 5297d24f5ee..2021ed0ee4d 100644 --- a/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt +++ b/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt @@ -261,6 +261,14 @@ class JdbcPreparedStatement( } } + fun bindObjectOther(index: Int, obj: Any?) { + if (obj == null) { + preparedStatement.setNull(index + 1, Types.OTHER) + } else { + preparedStatement.setObject(index + 1, obj, Types.OTHER) + } + } + override fun bindString(index: Int, string: String?) { if (string == null) { preparedStatement.setNull(index + 1, Types.VARCHAR) diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq index 801bced9291..72515d17313 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq @@ -10,4 +10,11 @@ INSERT INTO myJson(data, datab) VALUES( ); buildJson: -SELECT json_build_object('key', 'value'), jsonb_build_object('key', 'value'); \ No newline at end of file +SELECT json_build_object('key', 'value'), jsonb_build_object('key', 'value'); + +insertLiteral: +INSERT INTO myJson(data, datab) VALUES (?, ?); + +select: +SELECT * +FROM myJson; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index 6153df9bb24..cefb3b05ead 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -673,4 +673,22 @@ class PostgreSqlTest { val result = database.binaryArgumentsQueries.selectDataBinaryIntervalComparison2(created).executeAsList() assertThat(result.first().datum).isEqualTo(10) } + + @Test + fun testInsertJson() { + database.jsonQueries.insert("another key", "another value") + with(database.jsonQueries.select().executeAsList()) { + assertThat(first().data_).isEqualTo("""{"another key" : "another value"}""") + assertThat(first().datab).isEqualTo("""{"key": "value"}""") + } + } + + @Test + fun testInsertJsonLiteral() { + database.jsonQueries.insertLiteral("""{"key a" : "value a"}""", """{"key b" : "value b"}""") + with(database.jsonQueries.select().executeAsList()) { + assertThat(first().data_).isEqualTo("""{"key a" : "value a"}""") + assertThat(first().datab).isEqualTo("""{"key b": "value b"}""") + } + } } From db61291e13f2e5e38f44eaba3bd84198955d1a20 Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:03:30 +0100 Subject: [PATCH 086/304] CI: Use M1 runner (#5081) * Use new Gradle setup action * Try M1 runner * Use macOS Intel runner for instrumentation tests due required nested virtualization not supported on M1 (but M2+ or Intel) * Use macOS Intel runner for instrumentation tests due required nested virtualization not supported on M1 (but M2+ or Intel) --------- Co-authored-by: hfhbd --- .github/workflows/PR-skip.yml | 8 +++++++- .github/workflows/PR.yml | 18 +++++++++++++----- .github/workflows/Release.yml | 4 ++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/.github/workflows/PR-skip.yml b/.github/workflows/PR-skip.yml index 7c13083b567..e528437bd4a 100644 --- a/.github/workflows/PR-skip.yml +++ b/.github/workflows/PR-skip.yml @@ -15,7 +15,7 @@ jobs: build: strategy: matrix: - os: [ macOS-latest, windows-latest, ubuntu-latest ] + os: [ macOS-14, macOS-latest, windows-latest, ubuntu-latest ] job: [ instrumentation, test, gradle-plugin-tests ] exclude: - os: windows-latest @@ -24,6 +24,12 @@ jobs: job: gradle-plugin-tests - os: ubuntu-latest job: gradle-plugin-tests + - os: macOS-latest + job: test + - os: macOS-latest + job: gradle-plugin-tests + - os: macOS-14 + job: instrumentation # We don't actually need to run on `{{matrix.os}}` for this to work runs-on: ubuntu-latest steps: diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index 06890d1b429..2a004a93bfe 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -24,8 +24,10 @@ jobs: build: strategy: # Ensure any changes to the matrix are also made in PR-skip.yml + # macOS-latest (Intel) is required to run Android simulator tests (instrumentation) + # due to nested virtualization not supported on M1 matrix: - os: [ macOS-latest, windows-latest, ubuntu-latest ] + os: [ macOS-14, macOS-latest, windows-latest, ubuntu-latest ] job: [ instrumentation, test, gradle-plugin-tests ] exclude: - os: windows-latest @@ -34,6 +36,12 @@ jobs: job: gradle-plugin-tests - os: ubuntu-latest job: gradle-plugin-tests + - os: macOS-latest + job: test + - os: macOS-latest + job: gradle-plugin-tests + - os: macOS-14 + job: instrumentation runs-on: ${{matrix.os}} permissions: @@ -58,7 +66,7 @@ jobs: run: | ./gradlew build -x :sqldelight-idea-plugin:build -x :sqldelight-gradle-plugin:test --stacktrace -x linuxX64Test - name: Run gradle plugin tests - if: matrix.os == 'macOS-latest' && matrix.job == 'gradle-plugin-tests' + if: matrix.os == 'macOS-14' && matrix.job == 'gradle-plugin-tests' run: ./gradlew :sqldelight-gradle-plugin:test :sqldelight-gradle-plugin:grammarkitTest --parallel - name: Run the IntelliJ plugin @@ -86,12 +94,12 @@ jobs: # ios tests - name: Run ios tests - if: matrix.os == 'macOS-latest' && matrix.job == 'test' + if: matrix.os == 'macOS-14' && matrix.job == 'test' run: ./gradlew iosX64Test --stacktrace --parallel # Build the samples - name: Build the mobile sample - if: matrix.os == 'macOS-latest' && matrix.job == 'test' + if: matrix.os == 'macOS-14' && matrix.job == 'test' uses: gradle/actions/setup-gradle@v3 with: arguments: build --stacktrace --parallel @@ -99,7 +107,7 @@ jobs: gradle-home-cache-cleanup: true - name: Build the web sample - if: matrix.os == 'macOS-latest' && matrix.job == 'test' + if: matrix.os == 'macOS-14' && matrix.job == 'test' uses: gradle/actions/setup-gradle@v3 with: arguments: kotlinUpgradeYarnLock build --stacktrace --parallel diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index cbd234fc93e..f2a995f87a6 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -15,7 +15,7 @@ jobs: publish_archives: strategy: matrix: - os: [macOS-latest, windows-latest, ubuntu-latest] + os: [macOS-14, windows-latest, ubuntu-latest] runs-on: ${{matrix.os}} if: github.repository == 'cashapp/sqldelight' @@ -36,7 +36,7 @@ jobs: gradle-home-cache-cleanup: true - name: Publish the macOS artifacts - if: matrix.os == 'macOS-latest' + if: matrix.os == 'macOS-14' env: ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.SONATYPE_NEXUS_USERNAME }} ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.SONATYPE_NEXUS_PASSWORD }} From 73f551eb59450d558c792cd43eec6c798e64562a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 13:21:38 -0400 Subject: [PATCH 087/304] Update dependency co.touchlab:stately-concurrency to v2.0.7 (#5085) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b8f1ad6414d..781939b04fe 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -76,7 +76,7 @@ schemaCrawler-sqlite = { module = "us.fatehi:schemacrawler-sqlite", version.ref objectDiff = { module = "de.danielbechler:java-object-diff", version = "0.95" } sqliter = { module = "co.touchlab:sqliter-driver", version.ref = "sqliter" } -stately-concurrency = { module = "co.touchlab:stately-concurrency", version = "2.0.6" } +stately-concurrency = { module = "co.touchlab:stately-concurrency", version = "2.0.7" } testhelp = { module = "co.touchlab:testhelp", version = "0.6.11" } burst = { module = "com.squareup.burst:burst-junit4", version = "1.2.0" } From bb283118fa90662cff09345bb366b1b573dfea58 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 13:22:56 -0400 Subject: [PATCH 088/304] Update dependency gradle to v8.7 (#5087) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew.bat | 20 +++++++++--------- sample-web/gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- sample-web/gradlew.bat | 20 +++++++++--------- sample/gradle/wrapper/gradle-wrapper.jar | Bin 43462 -> 43453 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- sample/gradlew.bat | 20 +++++++++--------- 9 files changed, 33 insertions(+), 33 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch delta 34118 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 delta 34176 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 SGW6ptSs!X7{rG*o_g?|vpSEZK diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a80b22ce5cf..b82aa23a4f0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f135..25da30dbdee 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/sample-web/gradle/wrapper/gradle-wrapper.jar b/sample-web/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch delta 34118 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 delta 34176 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 SGW6ptSs!X7{rG*o_g?|vpSEZK diff --git a/sample-web/gradle/wrapper/gradle-wrapper.properties b/sample-web/gradle/wrapper/gradle-wrapper.properties index a80b22ce5cf..b82aa23a4f0 100644 --- a/sample-web/gradle/wrapper/gradle-wrapper.properties +++ b/sample-web/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample-web/gradlew.bat b/sample-web/gradlew.bat index 93e3f59f135..25da30dbdee 100644 --- a/sample-web/gradlew.bat +++ b/sample-web/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/sample/gradle/wrapper/gradle-wrapper.jar b/sample/gradle/wrapper/gradle-wrapper.jar index d64cd4917707c1f8861d8cb53dd15194d4248596..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch delta 34118 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 delta 34176 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 SGW6ptSs!X7{rG*o_g?|vpSEZK diff --git a/sample/gradle/wrapper/gradle-wrapper.properties b/sample/gradle/wrapper/gradle-wrapper.properties index a80b22ce5cf..b82aa23a4f0 100644 --- a/sample/gradle/wrapper/gradle-wrapper.properties +++ b/sample/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample/gradlew.bat b/sample/gradlew.bat index 93e3f59f135..25da30dbdee 100644 --- a/sample/gradlew.bat +++ b/sample/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail From 9baa1c68fa7c40b66d868f1a12d9efbdcf118e95 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 20:36:34 +0100 Subject: [PATCH 089/304] Update dependency co.touchlab:testhelp to v0.6.12 (#5084) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 781939b04fe..eaafeaeddbc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -78,7 +78,7 @@ objectDiff = { module = "de.danielbechler:java-object-diff", version = "0.95" } sqliter = { module = "co.touchlab:sqliter-driver", version.ref = "sqliter" } stately-concurrency = { module = "co.touchlab:stately-concurrency", version = "2.0.7" } -testhelp = { module = "co.touchlab:testhelp", version = "0.6.11" } +testhelp = { module = "co.touchlab:testhelp", version = "0.6.12" } burst = { module = "com.squareup.burst:burst-junit4", version = "1.2.0" } testParameterInjector = { module = "com.google.testparameterinjector:test-parameter-injector", version = "1.15" } From 5b316c2c766dd3ce29b2bdac3816eb9fd4a544dc Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Fri, 22 Mar 2024 21:45:03 +0100 Subject: [PATCH 090/304] Use linux for the Android emulator tests (#5088) Co-authored-by: hfhbd --- .github/workflows/PR-skip.yml | 6 +----- .github/workflows/PR.yml | 16 ++++++++-------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/.github/workflows/PR-skip.yml b/.github/workflows/PR-skip.yml index e528437bd4a..07eb7bd1cdf 100644 --- a/.github/workflows/PR-skip.yml +++ b/.github/workflows/PR-skip.yml @@ -15,7 +15,7 @@ jobs: build: strategy: matrix: - os: [ macOS-14, macOS-latest, windows-latest, ubuntu-latest ] + os: [ macOS-14, windows-latest, ubuntu-latest ] job: [ instrumentation, test, gradle-plugin-tests ] exclude: - os: windows-latest @@ -24,10 +24,6 @@ jobs: job: gradle-plugin-tests - os: ubuntu-latest job: gradle-plugin-tests - - os: macOS-latest - job: test - - os: macOS-latest - job: gradle-plugin-tests - os: macOS-14 job: instrumentation # We don't actually need to run on `{{matrix.os}}` for this to work diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index 2a004a93bfe..5fa7c55e988 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -24,10 +24,8 @@ jobs: build: strategy: # Ensure any changes to the matrix are also made in PR-skip.yml - # macOS-latest (Intel) is required to run Android simulator tests (instrumentation) - # due to nested virtualization not supported on M1 matrix: - os: [ macOS-14, macOS-latest, windows-latest, ubuntu-latest ] + os: [ macOS-14, windows-latest, ubuntu-latest ] job: [ instrumentation, test, gradle-plugin-tests ] exclude: - os: windows-latest @@ -36,10 +34,6 @@ jobs: job: gradle-plugin-tests - os: ubuntu-latest job: gradle-plugin-tests - - os: macOS-latest - job: test - - os: macOS-latest - job: gradle-plugin-tests - os: macOS-14 job: instrumentation @@ -84,8 +78,14 @@ jobs: run: ./gradlew linuxX64Test --no-parallel # android tests + - name: Enable KVM group perms + if: matrix.os == 'ubuntu-latest' && matrix.job == 'instrumentation' + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm - name: Run instrumentation tests - if: matrix.os == 'macOS-latest' && matrix.job == 'instrumentation' + if: matrix.os == 'ubuntu-latest' && matrix.job == 'instrumentation' uses: reactivecircus/android-emulator-runner@v2 with: api-level: 29 From 4e753a52955f639238d46f20980e767b2167ea30 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 22:55:30 +0000 Subject: [PATCH 091/304] Update plugin intellij to v1.17.2 (#5033) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index eaafeaeddbc..7c7c0b70ffa 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -101,7 +101,7 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-android-extensions = { id = "org.jetbrains.kotlin.android.extensions", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } -intellij = { id = "org.jetbrains.intellij", version = "1.17.1" } +intellij = { id = "org.jetbrains.intellij", version = "1.17.2" } grammarKitComposer = { id = "com.alecstrong.grammar.kit.composer", version = "0.1.12" } publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } From a83943bc1b38a3fca3f7dccc0b9c31be78a164de Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Wed, 27 Mar 2024 15:47:23 +0100 Subject: [PATCH 092/304] Increase Android minSDK to 21 (#5094) --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7c7c0b70ffa..655ba14a56f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,7 +12,7 @@ paging3 = "3.1.1" ktlint = "1.2.1" agp = "8.3.1" compileSdk = "34" -minSdk = "16" +minSdk = "21" sqlPsi = "0.4.8" testContainers = "1.19.7" From 42e5f3b624e92720005273ef1bf0aa95612047e2 Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:41:13 +0100 Subject: [PATCH 093/304] CI: Move samples out of matrix (#5096) * CI: Move samples out of matrix * Fix missing ./gradlew call * Use -p --------- Co-authored-by: hfhbd --- .github/workflows/PR.yml | 47 +++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index 5fa7c55e988..c7f3b78f5c2 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -97,23 +97,6 @@ jobs: if: matrix.os == 'macOS-14' && matrix.job == 'test' run: ./gradlew iosX64Test --stacktrace --parallel - # Build the samples - - name: Build the mobile sample - if: matrix.os == 'macOS-14' && matrix.job == 'test' - uses: gradle/actions/setup-gradle@v3 - with: - arguments: build --stacktrace --parallel - build-root-directory: sample - gradle-home-cache-cleanup: true - - - name: Build the web sample - if: matrix.os == 'macOS-14' && matrix.job == 'test' - uses: gradle/actions/setup-gradle@v3 - with: - arguments: kotlinUpgradeYarnLock build --stacktrace --parallel - build-root-directory: sample-web - gradle-home-cache-cleanup: true - verify_intellij: runs-on: ubuntu-latest @@ -143,5 +126,35 @@ jobs: - name: Success! run: echo "All IntelliJ plugin verification checks passed!" + buildSample: + runs-on: macos-14 + permissions: + contents: read + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version-file: .github/workflows/.ci-java-version + - uses: gradle/actions/setup-gradle@v3 + with: + gradle-home-cache-cleanup: true + - run: ./gradlew -p sample build --stacktrace --parallel + + buildWebSample: + runs-on: macos-14 + permissions: + contents: read + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version-file: .github/workflows/.ci-java-version + - uses: gradle/actions/setup-gradle@v3 + with: + gradle-home-cache-cleanup: true + - run: ./gradlew -p sample-web kotlinUpgradeYarnLock build --stacktrace --parallel + env: GRADLE_OPTS: -Dorg.gradle.caching=true From 63481b12b5eeb2894321b6fb313636951d54c99e Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Wed, 27 Mar 2024 16:44:35 +0100 Subject: [PATCH 094/304] CI: Remove outdated workaround (#5097) * Remove outdated workaround for https://github.com/Kotlin/dokka/issues/2954 * Update gradle.properties --------- Co-authored-by: hfhbd --- .github/workflows/prepare_mkdocs.sh | 2 +- build.gradle | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/prepare_mkdocs.sh b/.github/workflows/prepare_mkdocs.sh index 0f0a1f8163c..03cb992959b 100755 --- a/.github/workflows/prepare_mkdocs.sh +++ b/.github/workflows/prepare_mkdocs.sh @@ -9,7 +9,7 @@ set -ex # Generate the API docs -./gradlew dokkaHtmlMultiModule +./gradlew :dokkaHtmlMultiModule # Fix up some styling/functionality on the generated dokka HTML pages set +x diff --git a/build.gradle b/build.gradle index 48b95c6bea8..9db7c9dfdae 100644 --- a/build.gradle +++ b/build.gradle @@ -87,7 +87,4 @@ tasks.named("dokkaHtmlMultiModule") { "customStyleSheets": ["${file("docs/css/logo-styles.css")}"] } """]) - - // https://github.com/Kotlin/dokka/issues/2954 - dependsOn(":sqldelight-compiler:dokkaHtmlMultiModule") } From 8297a1e79eb5eaae2cc7760c65083dd5442f6367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Wed, 27 Mar 2024 18:55:12 +0000 Subject: [PATCH 095/304] Fixes 5040 PostgreSql json operators (#5041) * Initial changes for json operators Add Json Path operator to grammar Add jsonExpression to return JSON type in resolver Add Integration Tests * Add boolean operators to grammar Any operators starting with "?" must be escaped with an prefix "?" for binding with JDBC statements. This means that SQL statements must use e.g "??" * Discriminate operator return type Either Boolean or JSON * Integration tests Tests for operators * Fixture Test * Remove "'||' | '-'" operators for now JsonExpressionMixin.kt * Fixture tests previous tests were not valid * Support Json for "||" "-" operators * Add tests for operators Fixture tests Integration tests * fix json functions Use the Json type so that the bind parameters use setObjectOther Add integration tests --- .../postgresql/PostgreSqlTypeResolver.kt | 11 ++- .../postgresql/grammar/PostgreSql.bnf | 8 ++- .../grammar/mixins/JsonExpressionMixin.kt | 2 +- .../postgres/PostgreSqlFixturesTest.kt | 2 +- .../fixtures_postgresql/json_functions/Test.s | 49 ++++++------- .../sqldelight/postgresql/integration/Json.sq | 37 ++++++++-- .../postgresql/integration/PostgreSqlTest.kt | 68 ++++++++++++++++++- 7 files changed, 135 insertions(+), 42 deletions(-) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index b0c594cc638..535d29d669a 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -154,7 +154,6 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "to_json", "to_jsonb", "array_to_json", "row_to_json", "json_build_array", "jsonb_build_array", - "json_build_object", "jsonb_build_object", "json_object", "jsonb_object", "json_extract_path", "jsonb_extract_path", "json_extract_path_text", "jsonb_extract_path_text", @@ -164,6 +163,8 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "jsonb_pretty", "json_typeof", "jsonb_typeof", "json_agg", "jsonb_agg", "json_object_agg", "jsonb_object_agg", + -> IntermediateType(PostgreSqlType.JSON) + "json_build_object", "jsonb_build_object", -> IntermediateType(TEXT) "array_agg" -> { val typeForAgg = encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() @@ -238,6 +239,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes PostgreSqlType.INTERVAL, PostgreSqlType.TIMESTAMP_TIMEZONE, PostgreSqlType.TIMESTAMP, + PostgreSqlType.JSON, ) } } @@ -260,6 +262,13 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes val windowFunctionExpr = windowFunctionExpr as WindowFunctionMixin functionType(windowFunctionExpr.functionExpr)!! } + jsonExpression != null -> { + if (jsonExpression!!.jsonbBooleanOperator != null) { + IntermediateType(BOOLEAN) + } else { + IntermediateType(PostgreSqlType.JSON) + } + } else -> parentResolver.resolvedType(this) } diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index feab46fd7bd..f5791c41c13 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -175,6 +175,7 @@ create_index_stmt ::= CREATE [ UNIQUE ] INDEX [ 'CONCURRENTLY' ] [ IF NOT EXISTS pin = 6 } + identity_clause ::= 'IDENTITY' [ LP [ 'SEQUENCE' 'NAME' sequence_name ] [ sequence_parameters* ] RP ] generated_clause ::= GENERATED ( (ALWAYS AS LP <> RP 'STORED') | ( (ALWAYS | BY DEFAULT) AS identity_clause ) ) { @@ -368,12 +369,13 @@ boolean_not_expression ::= NOT (boolean_literal | {column_name}) boolean_literal ::= TRUE | FALSE -json_expression ::= {column_name} ( jsona_binary_operator | jsonb_binary_operator ) <> { +json_expression ::= {column_name} ( jsona_binary_operator | jsonb_binary_operator | jsonb_boolean_operator ) <> { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.JsonExpressionMixin" pin = 2 } -jsona_binary_operator ::= '->' | '->>' | '#>' -jsonb_binary_operator ::= '@>' | '<@' | '?|' | '?&' | '?' | '#-' +jsona_binary_operator ::= '->' | '->>' | '#>' | '#>>' +jsonb_binary_operator ::= '#-' +jsonb_boolean_operator ::= '@@' | '@>' | '<@' | '@?' | '??|' | '??&' | '??' extension_stmt ::= create_sequence_stmt | copy_stdin | truncate_stmt | set_stmt | drop_sequence_stmt | alter_sequence_stmt | create_extension_stmt | drop_extension_stmt | alter_extension_stmt { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionStmtImpl" diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/JsonExpressionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/JsonExpressionMixin.kt index 6699674cefa..76b81386d60 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/JsonExpressionMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/JsonExpressionMixin.kt @@ -15,7 +15,7 @@ internal abstract class JsonExpressionMixin(node: ASTNode) : if (columnType == null || columnType !in arrayOf("JSON", "JSONB")) { annotationHolder.createErrorAnnotation(firstChild, "Left side of json expression must be a json column.") } - if (jsonbBinaryOperator != null && columnType != "JSONB") { + if ((jsonbBinaryOperator != null || jsonbBooleanOperator != null) && columnType != "JSONB") { annotationHolder.createErrorAnnotation(firstChild, "Left side of jsonb expression must be a jsonb column.") } super.annotate(annotationHolder) diff --git a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt index 28b25da3090..c91b3f09be2 100644 --- a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt +++ b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt @@ -18,7 +18,7 @@ class PostgreSqlFixturesTest(name: String, fixtureRoot: File) : FixturesTest(nam "BLOB" to "TEXT", "id TEXT GENERATED ALWAYS AS (2) UNIQUE NOT NULL" to "id TEXT GENERATED ALWAYS AS (2) STORED UNIQUE NOT NULL", "'(', ')', ',', '.', , BETWEEN or IN expected, got ','" - to "'(', ')', ',', '.', , , , BETWEEN or IN expected, got ','", + to "'#-', '(', ')', ',', '.', , , , BETWEEN or IN expected, got ','", ) override fun setupDialect() { diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/json_functions/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/json_functions/Test.s index b700b545f37..39eb1cc02db 100644 --- a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/json_functions/Test.s +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/json_functions/Test.s @@ -3,31 +3,24 @@ CREATE TABLE myTable( datab JSONB NOT NULL ); -SELECT * -FROM myTable -WHERE - data -> 'sup' AND - data ->> 'sup' AND - data #> 'sup' AND ---error[col 2]: Left side of jsonb expression must be a jsonb column. - data @> 'sup' AND ---error[col 2]: Left side of jsonb expression must be a jsonb column. - data <@ 'sup' AND ---error[col 2]: Left side of jsonb expression must be a jsonb column. - data ? 'sup' AND ---error[col 2]: Left side of jsonb expression must be a jsonb column. - data ?| 'sup' AND ---error[col 2]: Left side of jsonb expression must be a jsonb column. - data ?& 'sup' AND ---error[col 2]: Left side of jsonb expression must be a jsonb column. - data #- 'sup' AND - datab -> 'sup' AND - datab ->> 'sup' AND - datab #> 'sup' AND - datab @> 'sup' AND - datab <@ 'sup' AND - datab ? 'sup' AND - datab ?| 'sup' AND - datab ?& 'sup' AND - datab #- 'sup' -; \ No newline at end of file +SELECT +--error[col 2]: Left side of jsonb expression must be a jsonb column. + data #- '{"a"}', +--error[col 2]: Left side of jsonb expression must be a jsonb column. + data @> datab, +--error[col 2]: Left side of jsonb expression must be a jsonb column. + data <@ datab, +--error[col 2]: Left side of jsonb expression must be a jsonb column. + data ?? 'b', +--error[col 2]: Left side of jsonb expression must be a jsonb column. + data ??| '{"a","b"}', +--error[col 2]: Left side of jsonb expression must be a jsonb column. + data ??& '{"a"}', +--error[col 2]: Left side of jsonb expression must be a jsonb column. + data @? '$.a[*]', +--error[col 2]: Left side of jsonb expression must be a jsonb column. + data @@ '$.b[*] > 0' +FROM myTable; + +SELECT data ->> 'a', datab -> 'b', data #> '{aa}', datab #>> '{bb}', datab || datab, datab - 'b', datab - 1 +FROM myTable; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq index 72515d17313..f5505f1c600 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq @@ -1,20 +1,43 @@ -CREATE TABLE myJson( +CREATE TABLE TestJson( data JSON NOT NULL, - datab JSONB NOT NULL + datab JSONB NOT NULL, + datac JSONB, + datad TEXT[] ); insert: -INSERT INTO myJson(data, datab) VALUES( +INSERT INTO TestJson(data, datab) VALUES( json_build_object(:key, :value), jsonb_build_object('key', 'value') ); -buildJson: -SELECT json_build_object('key', 'value'), jsonb_build_object('key', 'value'); +setJsonb: +UPDATE TestJson +SET datab = jsonb_set(datab, :path, :newValue) RETURNING datab; insertLiteral: -INSERT INTO myJson(data, datab) VALUES (?, ?); +INSERT INTO TestJson(data, datab, datac, datad) VALUES (?, ?, ?, ?); select: SELECT * -FROM myJson; +FROM TestJson; + +selectJsonObjectOperators: +SELECT data ->> 'a', datab -> 'b', data #> '{aa}', datab #>> '{bb}', datab - 'b' +FROM TestJson; + +selectJsonArrayIndexOperators: +SELECT data -> 0, data ->> 1, data ->> 2, datab - 1 +FROM TestJson; + +selectJsonBooleanOperators: +SELECT datab @> datac, datac <@ datab, datab ?? 'b', datab ??| datad, datab ??& datad, datab @@ '$.b[*] > 0' +FROM TestJson; + +selectJsonConcatOperators: +SELECT datab || datac +FROM TestJson; + +selectJsonPretty: +SELECT jsonb_pretty(datab) +FROM TestJson; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index cefb3b05ead..f90fd3f4746 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -685,10 +685,76 @@ class PostgreSqlTest { @Test fun testInsertJsonLiteral() { - database.jsonQueries.insertLiteral("""{"key a" : "value a"}""", """{"key b" : "value b"}""") + database.jsonQueries.insertLiteral("""{"key a" : "value a"}""", """{"key b" : "value b"}""", """{}""", emptyArray()) with(database.jsonQueries.select().executeAsList()) { assertThat(first().data_).isEqualTo("""{"key a" : "value a"}""") assertThat(first().datab).isEqualTo("""{"key b": "value b"}""") } } + + @Test + fun testJsonObjectOperators() { + database.jsonQueries.insertLiteral("""{"a" : 11,"aa":[1,2,3]}""", """{"b" : 12,"bb":[1,2,3]}""", """{}""", emptyArray()) + with(database.jsonQueries.selectJsonObjectOperators().executeAsList()) { + assertThat(first().expr).isEqualTo("11") + assertThat(first().expr_).isEqualTo("12") + assertThat(first().expr__).isEqualTo("[1,2,3]") + assertThat(first().expr___).isEqualTo("[1, 2, 3]") + assertThat(first().expr____).isEqualTo("""{"bb": [1, 2, 3]}""") + } + } + + @Test + fun testJsonArrayIndexOperators() { + database.jsonQueries.insertLiteral("""[1,2,3]""", """[1,2,3]""", """{}""", emptyArray()) + with(database.jsonQueries.selectJsonArrayIndexOperators().executeAsList()) { + assertThat(first().expr).isEqualTo("1") + assertThat(first().expr_).isEqualTo("2") + assertThat(first().expr__).isEqualTo("3") + assertThat(first().expr___).isEqualTo("[1, 3]") + } + } + + @Test + fun testJsonBooleanOperators() { + database.jsonQueries.insertLiteral("""{}""", """{"a":1, "b":2}""", """{"b":2}""", arrayOf("a", "b")) + with(database.jsonQueries.selectJsonBooleanOperators().executeAsList()) { + assertThat(first().expr).isEqualTo(true) + assertThat(first().expr_).isEqualTo(true) + assertThat(first().expr__).isEqualTo(true) + assertThat(first().expr___).isEqualTo(true) + assertThat(first().expr____).isEqualTo(true) + assertThat(first().expr_____).isEqualTo(true) + } + } + + @Test + fun testJsonConcatOperators() { + database.jsonQueries.insertLiteral("""{}""", """{"a":1}""", """{"b":2}""", emptyArray()) + with(database.jsonQueries.selectJsonConcatOperators().executeAsList()) { + assertThat(first().expr).isEqualTo("""{"a": 1, "b": 2}""") + } + } + + @Test + fun testJsonbPretty() { + database.jsonQueries.insertLiteral("""{}""", """{"a":1,"b":2}""", """{}""", emptyArray()) + with(database.jsonQueries.selectJsonPretty().executeAsList()) { + assertThat(first()).isEqualTo( + """{ + | "a": 1, + | "b": 2 + |} + """.trimMargin(), + ) + } + } + + @Test + fun testJsonbSet() { + database.jsonQueries.insertLiteral("""{}""", """[{"a":1},{"b":2}]""", """{}""", emptyArray()) + with(database.jsonQueries.setJsonb("""{0, "a"}""", """123""").executeAsList()) { + assertThat(first()).isEqualTo("""[{"a": 123}, {"b": 2}]""") + } + } } From 1f4bb0aee62af94f0c4267ef0efac2ccebd68ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Wed, 27 Mar 2024 19:23:24 +0000 Subject: [PATCH 096/304] Add grammar for GIN (#5027) support gin operator classes Add fixture tests to check basic syntax Co-authored-by: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> --- .../dialects/postgresql/grammar/PostgreSql.bnf | 5 ++++- .../fixtures_postgresql/create-index/Sample.s | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index f5791c41c13..fd37e048446 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -168,7 +168,10 @@ table_constraint ::= [ CONSTRAINT {identifier} ] ( override = true } -create_index_stmt ::= CREATE [ UNIQUE ] INDEX [ 'CONCURRENTLY' ] [ IF NOT EXISTS ] [ {database_name} DOT ] {index_name} ON {table_name} LP {indexed_column} ( COMMA {indexed_column} ) * RP [ WHERE <> ] { +gin_operator_class_stmt ::= 'array_ops' | 'jsonb_ops' | 'jsonb_path_ops' | 'tsvector_ops' + +create_index_stmt ::= CREATE [ UNIQUE ] INDEX [ 'CONCURRENTLY' ] [ IF NOT EXISTS ] [ {database_name} DOT ] {index_name} ON {table_name} + ( USING 'GIN' LP {indexed_column} [ gin_operator_class_stmt ] ( COMMA {indexed_column} [ gin_operator_class_stmt ] ) * RP | LP {indexed_column} ( COMMA {indexed_column} ) * RP [ WHERE <> ] ) { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlCreateIndexStmtImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlGeneratedClause" override = true diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/create-index/Sample.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/create-index/Sample.s index 02c9224c057..175fc0395cb 100644 --- a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/create-index/Sample.s +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/create-index/Sample.s @@ -6,3 +6,15 @@ CREATE TABLE abg ( ); CREATE INDEX CONCURRENTLY beta_gamma_idx ON abg (beta, gamma); + + +CREATE TABLE json_gin( + alpha JSONB, + beta JSONB +); + +CREATE INDEX gin_alpha_1 ON json_gin USING GIN (alpha); +CREATE INDEX gin_alpha_beta_2 ON json_gin USING GIN (alpha, beta); +CREATE INDEX gin_alpha_beta_3 ON json_gin USING GIN (alpha jsonb_ops, beta); +CREATE INDEX gin_alpha_beta_4 ON json_gin USING GIN (alpha, beta jsonb_path_ops); +CREATE INDEX gin_alpha_beta_5 ON json_gin USING GIN (alpha jsonb_path_ops, beta jsonb_ops); From 5cdab9065a1dcbf4267ab80a5830bdf64068f01a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 09:44:02 -0400 Subject: [PATCH 097/304] Update plugin intellij to v1.17.3 (#5099) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 655ba14a56f..a895cb65c6c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -101,7 +101,7 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-android-extensions = { id = "org.jetbrains.kotlin.android.extensions", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } -intellij = { id = "org.jetbrains.intellij", version = "1.17.2" } +intellij = { id = "org.jetbrains.intellij", version = "1.17.3" } grammarKitComposer = { id = "com.alecstrong.grammar.kit.composer", version = "0.1.12" } publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } From fad79d29defcac1b8e3e25045905405d1f98fbf8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 30 Mar 2024 01:32:30 +0000 Subject: [PATCH 098/304] Update dependency org.robolectric:robolectric to v4.12 (#5101) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a895cb65c6c..4d67bdcbfff 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -64,7 +64,7 @@ intellij-utilUi = { module = "com.jetbrains.intellij.platform:util-ui", version. intellij-util = { module = "com.jetbrains.intellij.platform:util", version.ref = "idea" } sqlPsi = { module = "com.alecstrong.sql.psi:core", version.ref = "sqlPsi" } -robolectric = { module = "org.robolectric:robolectric", version = "4.11.1" } +robolectric = { module = "org.robolectric:robolectric", version = "4.12" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.2.0" } From f342eaebf62924ed98f7e2c8c92ceb5b7f3d9f16 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 30 Mar 2024 11:55:43 -0700 Subject: [PATCH 099/304] Update actions/configure-pages action to v5 (#5102) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/Publish-Website.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Publish-Website.yml b/.github/workflows/Publish-Website.yml index 4d9dff4bd97..aa5a9f645f2 100644 --- a/.github/workflows/Publish-Website.yml +++ b/.github/workflows/Publish-Website.yml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout the repo uses: actions/checkout@v4 - - uses: actions/configure-pages@v4 + - uses: actions/configure-pages@v5 - name: Set up Java uses: actions/setup-java@v4 with: From ace474fccdd19038a0b6061ec6f96549de0c40a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Sat, 30 Mar 2024 18:56:24 +0000 Subject: [PATCH 100/304] Fixes json operator binding for 5040 (#5100) * Fix json_expression use column_expr instead of column_name as this allows a binary expression to be evaluated JsonExpressionMixin now references a column_expr * Add integration tests --- .../postgresql/grammar/PostgreSql.bnf | 2 +- .../grammar/mixins/JsonExpressionMixin.kt | 13 +++++++--- .../sqldelight/postgresql/integration/Json.sq | 15 +++++++++++ .../postgresql/integration/PostgreSqlTest.kt | 25 +++++++++++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index fd37e048446..0b41b357ae8 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -372,7 +372,7 @@ boolean_not_expression ::= NOT (boolean_literal | {column_name}) boolean_literal ::= TRUE | FALSE -json_expression ::= {column_name} ( jsona_binary_operator | jsonb_binary_operator | jsonb_boolean_operator ) <> { +json_expression ::= {column_expr} ( jsona_binary_operator | jsonb_binary_operator | jsonb_boolean_operator ) <> { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.JsonExpressionMixin" pin = 2 } diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/JsonExpressionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/JsonExpressionMixin.kt index 76b81386d60..6a1caad24fa 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/JsonExpressionMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/JsonExpressionMixin.kt @@ -2,22 +2,29 @@ package app.cash.sqldelight.dialects.postgresql.grammar.mixins import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlJsonExpression import com.alecstrong.sql.psi.core.SqlAnnotationHolder +import com.alecstrong.sql.psi.core.psi.SqlBinaryExpr import com.alecstrong.sql.psi.core.psi.SqlColumnDef import com.alecstrong.sql.psi.core.psi.SqlColumnName import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlExpr import com.intellij.lang.ASTNode internal abstract class JsonExpressionMixin(node: ASTNode) : SqlCompositeElementImpl(node), + SqlBinaryExpr, PostgreSqlJsonExpression { override fun annotate(annotationHolder: SqlAnnotationHolder) { - val columnType = ((firstChild.reference?.resolve() as? SqlColumnName)?.parent as? SqlColumnDef)?.columnType?.typeName?.text + val columnType = ((firstChild.firstChild.reference?.resolve() as? SqlColumnName)?.parent as? SqlColumnDef)?.columnType?.typeName?.text if (columnType == null || columnType !in arrayOf("JSON", "JSONB")) { - annotationHolder.createErrorAnnotation(firstChild, "Left side of json expression must be a json column.") + annotationHolder.createErrorAnnotation(firstChild.firstChild, "Left side of json expression must be a json column.") } if ((jsonbBinaryOperator != null || jsonbBooleanOperator != null) && columnType != "JSONB") { - annotationHolder.createErrorAnnotation(firstChild, "Left side of jsonb expression must be a jsonb column.") + annotationHolder.createErrorAnnotation(firstChild.firstChild, "Left side of jsonb expression must be a jsonb column.") } super.annotate(annotationHolder) } + + override fun getExprList(): List { + return children.filterIsInstance() + } } diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq index f5505f1c600..df82c065d7a 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Json.sq @@ -41,3 +41,18 @@ FROM TestJson; selectJsonPretty: SELECT jsonb_pretty(datab) FROM TestJson; + +selectJsonbPath: +SELECT * +FROM TestJson +WHERE datab @> ?; + +selectJsonPathEquals: +SELECT * +FROM TestJson +WHERE data ->> 'a' = ? AND datab ->> 'b' = ?; + +selectJsonbContains: +SELECT * +FROM TestJson +WHERE datab ?? ?; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index f90fd3f4746..58272bf4017 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -757,4 +757,29 @@ class PostgreSqlTest { assertThat(first()).isEqualTo("""[{"a": 123}, {"b": 2}]""") } } + + @Test + fun testSelectJsonbPath() { + database.jsonQueries.insertLiteral("""{}""", """[{"a":1},{"b":2}]""", """{}""", emptyArray()) + with(database.jsonQueries.selectJsonbPath("""[{"a":1}]""").executeAsList()) { + assertThat(first().datab).isEqualTo("""[{"a": 1}, {"b": 2}]""") + } + } + + @Test + fun testSelectJsonPathEquality() { + database.jsonQueries.insertLiteral("""{"a": 1}""", """{"b":2}""", """{}""", emptyArray()) + with(database.jsonQueries.selectJsonPathEquals("1", "2").executeAsList()) { + assertThat(first().data_).isEqualTo("""{"a": 1}""") + assertThat(first().datab).isEqualTo("""{"b": 2}""") + } + } + + @Test + fun testSelectJsonbContains() { + database.jsonQueries.insertLiteral("""{}""", """{"b":2}""", """{}""", emptyArray()) + with(database.jsonQueries.selectJsonbContains("b").executeAsList()) { + assertThat(first().datab).isEqualTo("""{"b": 2}""") + } + } } From 6b6cf70a35a26b15471d25f7e7a7cda88ae822a2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:33:28 +0000 Subject: [PATCH 101/304] Update plugin com.gradle.enterprise to v3.17 (#5113) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index 91d87b4dd87..6f0d77b14dd 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.16.2" + id "com.gradle.enterprise" version "3.17" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index bfca70d65d0..1b62834fd01 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.16.2" + id "com.gradle.enterprise" version "3.17" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/settings.gradle b/settings.gradle index 28c90b125eb..b788f01620c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.16.2" + id "com.gradle.enterprise" version "3.17" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } From 6b933dccd6226889bd4c808c50a4efb9c4222ba3 Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Tue, 2 Apr 2024 19:36:40 +0200 Subject: [PATCH 102/304] Add 2.0.0 jvm abi of primitive-adapters, android-driver, jdbc-driver, sqlite-driver and async extensions (#5110) --- .../api/primitive-adapters.api | 24 +++++++ adapters/primitive-adapters/build.gradle | 1 + drivers/android-driver/api/android-driver.api | 35 +++++++++ drivers/android-driver/build.gradle | 1 + drivers/jdbc-driver/api/jdbc-driver.api | 72 +++++++++++++++++++ drivers/jdbc-driver/build.gradle | 1 + drivers/sqlite-driver/api/sqlite-driver.api | 26 +++++++ drivers/sqlite-driver/build.gradle | 1 + .../async-extensions/api/async-extensions.api | 19 +++++ extensions/async-extensions/build.gradle | 1 + .../api/coroutines-extensions.api | 9 +++ extensions/coroutines-extensions/build.gradle | 1 + .../api/rxjava2-extensions.api | 11 +++ extensions/rxjava2-extensions/build.gradle | 1 + .../api/rxjava3-extensions.api | 11 +++ extensions/rxjava3-extensions/build.gradle | 1 + 16 files changed, 215 insertions(+) create mode 100644 adapters/primitive-adapters/api/primitive-adapters.api create mode 100644 drivers/android-driver/api/android-driver.api create mode 100644 drivers/jdbc-driver/api/jdbc-driver.api create mode 100644 drivers/sqlite-driver/api/sqlite-driver.api create mode 100644 extensions/async-extensions/api/async-extensions.api create mode 100644 extensions/coroutines-extensions/api/coroutines-extensions.api create mode 100644 extensions/rxjava2-extensions/api/rxjava2-extensions.api create mode 100644 extensions/rxjava3-extensions/api/rxjava3-extensions.api diff --git a/adapters/primitive-adapters/api/primitive-adapters.api b/adapters/primitive-adapters/api/primitive-adapters.api new file mode 100644 index 00000000000..b68a077b280 --- /dev/null +++ b/adapters/primitive-adapters/api/primitive-adapters.api @@ -0,0 +1,24 @@ +public final class app/cash/sqldelight/adapter/primitive/FloatColumnAdapter : app/cash/sqldelight/ColumnAdapter { + public static final field INSTANCE Lapp/cash/sqldelight/adapter/primitive/FloatColumnAdapter; + public fun decode (D)Ljava/lang/Float; + public synthetic fun decode (Ljava/lang/Object;)Ljava/lang/Object; + public fun encode (F)Ljava/lang/Double; + public synthetic fun encode (Ljava/lang/Object;)Ljava/lang/Object; +} + +public final class app/cash/sqldelight/adapter/primitive/IntColumnAdapter : app/cash/sqldelight/ColumnAdapter { + public static final field INSTANCE Lapp/cash/sqldelight/adapter/primitive/IntColumnAdapter; + public fun decode (J)Ljava/lang/Integer; + public synthetic fun decode (Ljava/lang/Object;)Ljava/lang/Object; + public fun encode (I)Ljava/lang/Long; + public synthetic fun encode (Ljava/lang/Object;)Ljava/lang/Object; +} + +public final class app/cash/sqldelight/adapter/primitive/ShortColumnAdapter : app/cash/sqldelight/ColumnAdapter { + public static final field INSTANCE Lapp/cash/sqldelight/adapter/primitive/ShortColumnAdapter; + public fun decode (J)Ljava/lang/Short; + public synthetic fun decode (Ljava/lang/Object;)Ljava/lang/Object; + public synthetic fun encode (Ljava/lang/Object;)Ljava/lang/Object; + public fun encode (S)Ljava/lang/Long; +} + diff --git a/adapters/primitive-adapters/build.gradle b/adapters/primitive-adapters/build.gradle index 93cb027bcdb..320273b33d0 100644 --- a/adapters/primitive-adapters/build.gradle +++ b/adapters/primitive-adapters/build.gradle @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.dokka) id("app.cash.sqldelight.multiplatform") id("app.cash.sqldelight.toolchain.runtime") + alias(libs.plugins.binaryCompatibilityValidator) } archivesBaseName = 'sqldelight-primitive-adapters' diff --git a/drivers/android-driver/api/android-driver.api b/drivers/android-driver/api/android-driver.api new file mode 100644 index 00000000000..37ea3e22a74 --- /dev/null +++ b/drivers/android-driver/api/android-driver.api @@ -0,0 +1,35 @@ +public final class app/cash/sqldelight/driver/android/AndroidSqliteDriver : app/cash/sqldelight/db/SqlDriver { + public fun (Landroidx/sqlite/db/SupportSQLiteDatabase;)V + public fun (Landroidx/sqlite/db/SupportSQLiteDatabase;I)V + public fun (Landroidx/sqlite/db/SupportSQLiteDatabase;ILjava/lang/Long;)V + public synthetic fun (Landroidx/sqlite/db/SupportSQLiteDatabase;ILjava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Landroidx/sqlite/db/SupportSQLiteOpenHelper;)V + public fun (Lapp/cash/sqldelight/db/SqlSchema;Landroid/content/Context;)V + public fun (Lapp/cash/sqldelight/db/SqlSchema;Landroid/content/Context;Ljava/lang/String;)V + public fun (Lapp/cash/sqldelight/db/SqlSchema;Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;)V + public fun (Lapp/cash/sqldelight/db/SqlSchema;Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;)V + public fun (Lapp/cash/sqldelight/db/SqlSchema;Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;I)V + public fun (Lapp/cash/sqldelight/db/SqlSchema;Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;IZ)V + public fun (Lapp/cash/sqldelight/db/SqlSchema;Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;IZLjava/lang/Long;)V + public synthetic fun (Lapp/cash/sqldelight/db/SqlSchema;Landroid/content/Context;Ljava/lang/String;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Factory;Landroidx/sqlite/db/SupportSQLiteOpenHelper$Callback;IZLjava/lang/Long;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun addListener ([Ljava/lang/String;Lapp/cash/sqldelight/Query$Listener;)V + public fun close ()V + public fun currentTransaction ()Lapp/cash/sqldelight/Transacter$Transaction; + public fun execute (Ljava/lang/Integer;Ljava/lang/String;ILkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult; + public synthetic fun executeQuery (Ljava/lang/Integer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult; + public fun executeQuery-0yMERmw (Ljava/lang/Integer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function1;)Ljava/lang/Object; + public fun newTransaction ()Lapp/cash/sqldelight/db/QueryResult; + public fun notifyListeners ([Ljava/lang/String;)V + public fun removeListener ([Ljava/lang/String;Lapp/cash/sqldelight/Query$Listener;)V +} + +public class app/cash/sqldelight/driver/android/AndroidSqliteDriver$Callback : androidx/sqlite/db/SupportSQLiteOpenHelper$Callback { + public fun (Lapp/cash/sqldelight/db/SqlSchema;[Lapp/cash/sqldelight/db/AfterVersion;)V + public fun onCreate (Landroidx/sqlite/db/SupportSQLiteDatabase;)V + public fun onUpgrade (Landroidx/sqlite/db/SupportSQLiteDatabase;II)V +} + +public final class app/cash/sqldelight/driver/android/AndroidSqliteDriver$Transaction : app/cash/sqldelight/Transacter$Transaction { + public fun (Lapp/cash/sqldelight/driver/android/AndroidSqliteDriver;Lapp/cash/sqldelight/Transacter$Transaction;)V +} + diff --git a/drivers/android-driver/build.gradle b/drivers/android-driver/build.gradle index 05fa832101d..2c1396f927e 100644 --- a/drivers/android-driver/build.gradle +++ b/drivers/android-driver/build.gradle @@ -4,6 +4,7 @@ plugins { alias(libs.plugins.publish) alias(libs.plugins.dokka) id("app.cash.sqldelight.toolchain.runtime") + alias(libs.plugins.binaryCompatibilityValidator) } archivesBaseName = 'sqldelight-android-driver' diff --git a/drivers/jdbc-driver/api/jdbc-driver.api b/drivers/jdbc-driver/api/jdbc-driver.api new file mode 100644 index 00000000000..045ffc3eb99 --- /dev/null +++ b/drivers/jdbc-driver/api/jdbc-driver.api @@ -0,0 +1,72 @@ +public abstract interface class app/cash/sqldelight/driver/jdbc/ConnectionManager { + public abstract fun beginTransaction (Ljava/sql/Connection;)V + public abstract fun close ()V + public abstract fun closeConnection (Ljava/sql/Connection;)V + public abstract fun endTransaction (Ljava/sql/Connection;)V + public abstract fun getConnection ()Ljava/sql/Connection; + public abstract fun getTransaction ()Lapp/cash/sqldelight/driver/jdbc/ConnectionManager$Transaction; + public abstract fun rollbackTransaction (Ljava/sql/Connection;)V + public abstract fun setTransaction (Lapp/cash/sqldelight/driver/jdbc/ConnectionManager$Transaction;)V +} + +public final class app/cash/sqldelight/driver/jdbc/ConnectionManager$Transaction : app/cash/sqldelight/Transacter$Transaction { + public fun (Lapp/cash/sqldelight/driver/jdbc/ConnectionManager$Transaction;Lapp/cash/sqldelight/driver/jdbc/ConnectionManager;Ljava/sql/Connection;)V + public final fun getConnection ()Ljava/sql/Connection; + public synthetic fun getEnclosingTransaction ()Lapp/cash/sqldelight/Transacter$Transaction; +} + +public final class app/cash/sqldelight/driver/jdbc/JdbcCursor : app/cash/sqldelight/db/SqlCursor { + public fun (Ljava/sql/ResultSet;)V + public final fun getArray (I)[Ljava/lang/Object; + public final fun getBigDecimal (I)Ljava/math/BigDecimal; + public fun getBoolean (I)Ljava/lang/Boolean; + public final fun getByte (I)Ljava/lang/Byte; + public fun getBytes (I)[B + public fun getDouble (I)Ljava/lang/Double; + public final fun getFloat (I)Ljava/lang/Float; + public final fun getInt (I)Ljava/lang/Integer; + public fun getLong (I)Ljava/lang/Long; + public final fun getResultSet ()Ljava/sql/ResultSet; + public final fun getShort (I)Ljava/lang/Short; + public fun getString (I)Ljava/lang/String; + public synthetic fun next ()Lapp/cash/sqldelight/db/QueryResult; + public fun next-mlR-ZEE ()Ljava/lang/Object; +} + +public abstract class app/cash/sqldelight/driver/jdbc/JdbcDriver : app/cash/sqldelight/db/SqlDriver, app/cash/sqldelight/driver/jdbc/ConnectionManager { + public fun ()V + public fun beginTransaction (Ljava/sql/Connection;)V + public fun close ()V + public final fun connectionAndClose ()Lkotlin/Pair; + public fun currentTransaction ()Lapp/cash/sqldelight/Transacter$Transaction; + public fun endTransaction (Ljava/sql/Connection;)V + public fun execute (Ljava/lang/Integer;Ljava/lang/String;ILkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult; + public fun executeQuery (Ljava/lang/Integer;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/functions/Function1;)Lapp/cash/sqldelight/db/QueryResult; + public fun getTransaction ()Lapp/cash/sqldelight/driver/jdbc/ConnectionManager$Transaction; + public fun newTransaction ()Lapp/cash/sqldelight/db/QueryResult; + public fun rollbackTransaction (Ljava/sql/Connection;)V + public fun setTransaction (Lapp/cash/sqldelight/driver/jdbc/ConnectionManager$Transaction;)V +} + +public final class app/cash/sqldelight/driver/jdbc/JdbcDrivers { + public static final fun fromDataSource (Ljavax/sql/DataSource;)Lapp/cash/sqldelight/driver/jdbc/JdbcDriver; +} + +public final class app/cash/sqldelight/driver/jdbc/JdbcPreparedStatement : app/cash/sqldelight/db/SqlPreparedStatement { + public fun (Ljava/sql/PreparedStatement;)V + public final fun bindBigDecimal (ILjava/math/BigDecimal;)V + public fun bindBoolean (ILjava/lang/Boolean;)V + public final fun bindByte (ILjava/lang/Byte;)V + public fun bindBytes (I[B)V + public fun bindDouble (ILjava/lang/Double;)V + public final fun bindFloat (ILjava/lang/Float;)V + public final fun bindInt (ILjava/lang/Integer;)V + public fun bindLong (ILjava/lang/Long;)V + public final fun bindObject (ILjava/lang/Object;)V + public final fun bindObjectOther (ILjava/lang/Object;)V + public final fun bindShort (ILjava/lang/Short;)V + public fun bindString (ILjava/lang/String;)V + public final fun execute ()J + public final fun executeQuery (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; +} + diff --git a/drivers/jdbc-driver/build.gradle b/drivers/jdbc-driver/build.gradle index 808e1f34b16..9766bff7c62 100644 --- a/drivers/jdbc-driver/build.gradle +++ b/drivers/jdbc-driver/build.gradle @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.publish) alias(libs.plugins.dokka) id("app.cash.sqldelight.toolchain.runtime") + alias(libs.plugins.binaryCompatibilityValidator) } archivesBaseName = 'sqldelight-jdbc-driver' diff --git a/drivers/sqlite-driver/api/sqlite-driver.api b/drivers/sqlite-driver/api/sqlite-driver.api new file mode 100644 index 00000000000..b2c1cc35fc2 --- /dev/null +++ b/drivers/sqlite-driver/api/sqlite-driver.api @@ -0,0 +1,26 @@ +public final class app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver : app/cash/sqldelight/driver/jdbc/JdbcDriver, app/cash/sqldelight/driver/jdbc/ConnectionManager { + public static final field Companion Lapp/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver$Companion; + public static final field IN_MEMORY Ljava/lang/String; + public fun (Ljava/lang/String;Ljava/util/Properties;)V + public synthetic fun (Ljava/lang/String;Ljava/util/Properties;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun addListener ([Ljava/lang/String;Lapp/cash/sqldelight/Query$Listener;)V + public fun beginTransaction (Ljava/sql/Connection;)V + public fun close ()V + public fun closeConnection (Ljava/sql/Connection;)V + public fun endTransaction (Ljava/sql/Connection;)V + public fun getConnection ()Ljava/sql/Connection; + public fun getTransaction ()Lapp/cash/sqldelight/driver/jdbc/ConnectionManager$Transaction; + public fun notifyListeners ([Ljava/lang/String;)V + public fun removeListener ([Ljava/lang/String;Lapp/cash/sqldelight/Query$Listener;)V + public fun rollbackTransaction (Ljava/sql/Connection;)V + public fun setTransaction (Lapp/cash/sqldelight/driver/jdbc/ConnectionManager$Transaction;)V +} + +public final class app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver$Companion { +} + +public final class app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteSchemaKt { + public static final fun JdbcSqliteDriver (Ljava/lang/String;Ljava/util/Properties;Lapp/cash/sqldelight/db/SqlSchema;Z[Lapp/cash/sqldelight/db/AfterVersion;)Lapp/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver; + public static synthetic fun JdbcSqliteDriver$default (Ljava/lang/String;Ljava/util/Properties;Lapp/cash/sqldelight/db/SqlSchema;Z[Lapp/cash/sqldelight/db/AfterVersion;ILjava/lang/Object;)Lapp/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver; +} + diff --git a/drivers/sqlite-driver/build.gradle b/drivers/sqlite-driver/build.gradle index 93c4cd531bb..ff718272019 100644 --- a/drivers/sqlite-driver/build.gradle +++ b/drivers/sqlite-driver/build.gradle @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.publish) alias(libs.plugins.dokka) id("app.cash.sqldelight.toolchain.runtime") + alias(libs.plugins.binaryCompatibilityValidator) } archivesBaseName = 'sqldelight-sqlite-driver' diff --git a/extensions/async-extensions/api/async-extensions.api b/extensions/async-extensions/api/async-extensions.api new file mode 100644 index 00000000000..f8ac0742c0c --- /dev/null +++ b/extensions/async-extensions/api/async-extensions.api @@ -0,0 +1,19 @@ +public final class app/cash/sqldelight/async/coroutines/DriverExtensionsKt { + public static final fun await (Lapp/cash/sqldelight/db/SqlDriver;Ljava/lang/Integer;Ljava/lang/String;ILkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun await$default (Lapp/cash/sqldelight/db/SqlDriver;Ljava/lang/Integer;Ljava/lang/String;ILkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; + public static final fun awaitCreate (Lapp/cash/sqldelight/db/SqlSchema;Lapp/cash/sqldelight/db/SqlDriver;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitMigrate (Lapp/cash/sqldelight/db/SqlSchema;Lapp/cash/sqldelight/db/SqlDriver;JJLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitQuery (Lapp/cash/sqldelight/db/SqlDriver;Ljava/lang/Integer;Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun awaitQuery$default (Lapp/cash/sqldelight/db/SqlDriver;Ljava/lang/Integer;Ljava/lang/String;Lkotlin/jvm/functions/Function2;ILkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; +} + +public final class app/cash/sqldelight/async/coroutines/QueryExtensionsKt { + public static final fun awaitAsList (Lapp/cash/sqldelight/ExecutableQuery;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitAsOne (Lapp/cash/sqldelight/ExecutableQuery;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static final fun awaitAsOneOrNull (Lapp/cash/sqldelight/ExecutableQuery;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +} + +public final class app/cash/sqldelight/async/coroutines/SynchronousKt { + public static final fun synchronous (Lapp/cash/sqldelight/db/SqlSchema;)Lapp/cash/sqldelight/db/SqlSchema; +} + diff --git a/extensions/async-extensions/build.gradle b/extensions/async-extensions/build.gradle index 173c6452ad6..c674081f580 100644 --- a/extensions/async-extensions/build.gradle +++ b/extensions/async-extensions/build.gradle @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.dokka) id("app.cash.sqldelight.multiplatform") id("app.cash.sqldelight.toolchain.runtime") + alias(libs.plugins.binaryCompatibilityValidator) } archivesBaseName = 'sqldelight-async-extensions' diff --git a/extensions/coroutines-extensions/api/coroutines-extensions.api b/extensions/coroutines-extensions/api/coroutines-extensions.api new file mode 100644 index 00000000000..d8aac93c7f1 --- /dev/null +++ b/extensions/coroutines-extensions/api/coroutines-extensions.api @@ -0,0 +1,9 @@ +public final class app/cash/sqldelight/coroutines/FlowQuery { + public static final fun mapToList (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; + public static final fun mapToOne (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; + public static final fun mapToOneNotNull (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; + public static final fun mapToOneOrDefault (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; + public static final fun mapToOneOrNull (Lkotlinx/coroutines/flow/Flow;Lkotlin/coroutines/CoroutineContext;)Lkotlinx/coroutines/flow/Flow; + public static final fun toFlow (Lapp/cash/sqldelight/Query;)Lkotlinx/coroutines/flow/Flow; +} + diff --git a/extensions/coroutines-extensions/build.gradle b/extensions/coroutines-extensions/build.gradle index 0a99f7884de..c498f5f70a3 100644 --- a/extensions/coroutines-extensions/build.gradle +++ b/extensions/coroutines-extensions/build.gradle @@ -5,6 +5,7 @@ plugins { alias(libs.plugins.dokka) id("app.cash.sqldelight.multiplatform") id("app.cash.sqldelight.toolchain.runtime") + alias(libs.plugins.binaryCompatibilityValidator) } archivesBaseName = 'sqldelight-coroutines-extensions' diff --git a/extensions/rxjava2-extensions/api/rxjava2-extensions.api b/extensions/rxjava2-extensions/api/rxjava2-extensions.api new file mode 100644 index 00000000000..5f479222c75 --- /dev/null +++ b/extensions/rxjava2-extensions/api/rxjava2-extensions.api @@ -0,0 +1,11 @@ +public final class app/cash/sqldelight/rx2/RxQuery { + public static final fun mapToList (Lio/reactivex/Observable;)Lio/reactivex/Observable; + public static final fun mapToOne (Lio/reactivex/Observable;)Lio/reactivex/Observable; + public static final fun mapToOneNonNull (Lio/reactivex/Observable;)Lio/reactivex/Observable; + public static final fun mapToOneOrDefault (Lio/reactivex/Observable;Ljava/lang/Object;)Lio/reactivex/Observable; + public static final fun mapToOptional (Lio/reactivex/Observable;)Lio/reactivex/Observable; + public static final fun toObservable (Lapp/cash/sqldelight/Query;)Lio/reactivex/Observable; + public static final fun toObservable (Lapp/cash/sqldelight/Query;Lio/reactivex/Scheduler;)Lio/reactivex/Observable; + public static synthetic fun toObservable$default (Lapp/cash/sqldelight/Query;Lio/reactivex/Scheduler;ILjava/lang/Object;)Lio/reactivex/Observable; +} + diff --git a/extensions/rxjava2-extensions/build.gradle b/extensions/rxjava2-extensions/build.gradle index f8238bd2c61..885d2e268a5 100644 --- a/extensions/rxjava2-extensions/build.gradle +++ b/extensions/rxjava2-extensions/build.gradle @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.publish) alias(libs.plugins.dokka) id("app.cash.sqldelight.toolchain.runtime") + alias(libs.plugins.binaryCompatibilityValidator) } archivesBaseName = 'sqldelight-rxjava2-extensions' diff --git a/extensions/rxjava3-extensions/api/rxjava3-extensions.api b/extensions/rxjava3-extensions/api/rxjava3-extensions.api new file mode 100644 index 00000000000..b8fdcd2ba8a --- /dev/null +++ b/extensions/rxjava3-extensions/api/rxjava3-extensions.api @@ -0,0 +1,11 @@ +public final class app/cash/sqldelight/rx3/RxQuery { + public static final fun mapToList (Lio/reactivex/rxjava3/core/Observable;)Lio/reactivex/rxjava3/core/Observable; + public static final fun mapToOne (Lio/reactivex/rxjava3/core/Observable;)Lio/reactivex/rxjava3/core/Observable; + public static final fun mapToOneNonNull (Lio/reactivex/rxjava3/core/Observable;)Lio/reactivex/rxjava3/core/Observable; + public static final fun mapToOneOrDefault (Lio/reactivex/rxjava3/core/Observable;Ljava/lang/Object;)Lio/reactivex/rxjava3/core/Observable; + public static final fun mapToOptional (Lio/reactivex/rxjava3/core/Observable;)Lio/reactivex/rxjava3/core/Observable; + public static final fun toObservable (Lapp/cash/sqldelight/Query;)Lio/reactivex/rxjava3/core/Observable; + public static final fun toObservable (Lapp/cash/sqldelight/Query;Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Observable; + public static synthetic fun toObservable$default (Lapp/cash/sqldelight/Query;Lio/reactivex/rxjava3/core/Scheduler;ILjava/lang/Object;)Lio/reactivex/rxjava3/core/Observable; +} + diff --git a/extensions/rxjava3-extensions/build.gradle b/extensions/rxjava3-extensions/build.gradle index d7c0db1dadc..514630d1c06 100644 --- a/extensions/rxjava3-extensions/build.gradle +++ b/extensions/rxjava3-extensions/build.gradle @@ -3,6 +3,7 @@ plugins { alias(libs.plugins.publish) alias(libs.plugins.dokka) id("app.cash.sqldelight.toolchain.runtime") + alias(libs.plugins.binaryCompatibilityValidator) } archivesBaseName = 'sqldelight-rxjava3-extensions' From 363504bb2e676d898d3bdeed3aa56ce3ce769a6c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 23:03:34 +0000 Subject: [PATCH 103/304] Update dependency org.robolectric:robolectric to v4.12.1 (#5114) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4d67bdcbfff..bac8f778984 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -64,7 +64,7 @@ intellij-utilUi = { module = "com.jetbrains.intellij.platform:util-ui", version. intellij-util = { module = "com.jetbrains.intellij.platform:util", version.ref = "idea" } sqlPsi = { module = "com.alecstrong.sql.psi:core", version.ref = "sqlPsi" } -robolectric = { module = "org.robolectric:robolectric", version = "4.12" } +robolectric = { module = "org.robolectric:robolectric", version = "4.12.1" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.2.0" } From 7a1f7597c6f90f492c33632a43956c335bbd5391 Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Wed, 3 Apr 2024 13:26:32 +0200 Subject: [PATCH 104/304] Use the new develocity plugin (#5116) * Use the new develocity plugin * Use the new develocity plugin --- sample-web/settings.gradle | 14 +++++++------- sample/settings.gradle | 14 +++++++------- settings.gradle | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index 6f0d77b14dd..8a98426ef7e 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,18 +17,18 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.17" + id "com.gradle.develocity" version "3.17" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } -gradleEnterprise { +develocity { buildScan { - termsOfServiceUrl = 'https://gradle.com/terms-of-service' - termsOfServiceAgree = 'yes' - if (System.getenv("CI")) { - publishAlways() - tag "CI" + termsOfUseUrl = 'https://gradle.com/terms-of-service' + termsOfUseAgree = 'yes' + publishing { + onlyIf { System.getenv("CI") } } + tag "CI" } } diff --git a/sample/settings.gradle b/sample/settings.gradle index 1b62834fd01..7077281e8a2 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,18 +17,18 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.17" + id "com.gradle.develocity" version "3.17" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } -gradleEnterprise { +develocity { buildScan { - termsOfServiceUrl = 'https://gradle.com/terms-of-service' - termsOfServiceAgree = 'yes' - if (System.getenv("CI")) { - publishAlways() - tag "CI" + termsOfUseUrl = 'https://gradle.com/terms-of-service' + termsOfUseAgree = 'yes' + publishing { + onlyIf { System.getenv("CI") } } + tag "CI" } } diff --git a/settings.gradle b/settings.gradle index b788f01620c..8824087b2a2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,18 +9,18 @@ pluginManagement { } plugins { - id "com.gradle.enterprise" version "3.17" + id "com.gradle.develocity" version "3.17" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } -gradleEnterprise { +develocity { buildScan { - termsOfServiceUrl = 'https://gradle.com/terms-of-service' - termsOfServiceAgree = 'yes' - if (System.getenv("CI")) { - publishAlways() - tag "CI" + termsOfUseUrl = 'https://gradle.com/terms-of-service' + termsOfUseAgree = 'yes' + publishing { + onlyIf { System.getenv("CI") } } + tag "CI" } } From 4051c3446b721c045a66ee2a467d73435965627a Mon Sep 17 00:00:00 2001 From: Jeffrey Starke Date: Wed, 3 Apr 2024 20:18:07 -0500 Subject: [PATCH 105/304] Update (#5117) --- docs/common/migrations_server.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/common/migrations_server.md b/docs/common/migrations_server.md index 1e1c70cf984..525602ca696 100644 --- a/docs/common/migrations_server.md +++ b/docs/common/migrations_server.md @@ -8,7 +8,7 @@ services to read from: sqldelight { databases { Database { - migrationOutputDirectory = file("$buildDir/resources/main/migrations") + migrationOutputDirectory = layout.buildDirectory.dir("resources/main/migrations") migrationOutputFileFormat = ".sql" // Defaults to .sql } } From 8b4f448027dab832f66afde49fb3ee28b07ca6b3 Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Thu, 4 Apr 2024 08:18:41 +0200 Subject: [PATCH 106/304] Expose more JDBC/R2DBC statement methods for dialect authors (#5098) --- .../dialects/postgresql/PostgreSqlType.kt | 30 ++++++---- drivers/jdbc-driver/api/jdbc-driver.api | 8 ++- .../cash/sqldelight/driver/jdbc/JdbcDriver.kt | 39 +++++++------ .../sqldelight/driver/r2dbc/R2dbcDriver.kt | 56 +++++++++++++++---- 4 files changed, 91 insertions(+), 42 deletions(-) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt index 16c4ad75668..d79bf98dec8 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt @@ -5,6 +5,7 @@ import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.INT import com.squareup.kotlinpoet.LONG +import com.squareup.kotlinpoet.MemberName import com.squareup.kotlinpoet.SHORT import com.squareup.kotlinpoet.STRING import com.squareup.kotlinpoet.TypeName @@ -24,19 +25,24 @@ internal enum class PostgreSqlType(override val javaType: TypeName) : DialectTyp ; override fun prepareStatementBinder(columnIndex: CodeBlock, value: CodeBlock): CodeBlock { - return CodeBlock.builder() - .add( - when (this) { - SMALL_INT -> "bindShort" - INTEGER -> "bindInt" - BIG_INT -> "bindLong" - DATE, TIME, TIMESTAMP, TIMESTAMP_TIMEZONE, INTERVAL, UUID -> "bindObject" - NUMERIC -> "bindBigDecimal" - JSON -> "bindObjectOther" - }, + return when (this) { + SMALL_INT -> CodeBlock.of("bindShort(%L, %L)\n", columnIndex, value) + INTEGER -> CodeBlock.of("bindInt(%L, %L)\n", columnIndex, value) + BIG_INT -> CodeBlock.of("bindLong(%L, %L)\n", columnIndex, value) + DATE, TIME, TIMESTAMP, TIMESTAMP_TIMEZONE, INTERVAL, UUID -> CodeBlock.of( + "bindObject(%L, %L)\n", + columnIndex, + value, ) - .add("(%L, %L)\n", columnIndex, value) - .build() + + NUMERIC -> CodeBlock.of("bindBigDecimal(%L, %L)\n", columnIndex, value) + JSON -> CodeBlock.of( + "bindObject(%L, %L, %M)\n", + columnIndex, + value, + MemberName(ClassName("java.sql", "Types"), "OTHER"), + ) + } } override fun cursorGetter(columnIndex: Int, cursorName: String): CodeBlock { diff --git a/drivers/jdbc-driver/api/jdbc-driver.api b/drivers/jdbc-driver/api/jdbc-driver.api index 045ffc3eb99..78c6b8d89f1 100644 --- a/drivers/jdbc-driver/api/jdbc-driver.api +++ b/drivers/jdbc-driver/api/jdbc-driver.api @@ -22,6 +22,7 @@ public final class app/cash/sqldelight/driver/jdbc/JdbcCursor : app/cash/sqldeli public fun getBoolean (I)Ljava/lang/Boolean; public final fun getByte (I)Ljava/lang/Byte; public fun getBytes (I)[B + public final fun getDate (I)Ljava/sql/Date; public fun getDouble (I)Ljava/lang/Double; public final fun getFloat (I)Ljava/lang/Float; public final fun getInt (I)Ljava/lang/Integer; @@ -29,6 +30,8 @@ public final class app/cash/sqldelight/driver/jdbc/JdbcCursor : app/cash/sqldeli public final fun getResultSet ()Ljava/sql/ResultSet; public final fun getShort (I)Ljava/lang/Short; public fun getString (I)Ljava/lang/String; + public final fun getTime (I)Ljava/sql/Time; + public final fun getTimestamp (I)Ljava/sql/Timestamp; public synthetic fun next ()Lapp/cash/sqldelight/db/QueryResult; public fun next-mlR-ZEE ()Ljava/lang/Object; } @@ -58,14 +61,17 @@ public final class app/cash/sqldelight/driver/jdbc/JdbcPreparedStatement : app/c public fun bindBoolean (ILjava/lang/Boolean;)V public final fun bindByte (ILjava/lang/Byte;)V public fun bindBytes (I[B)V + public final fun bindDate (ILjava/sql/Date;)V public fun bindDouble (ILjava/lang/Double;)V public final fun bindFloat (ILjava/lang/Float;)V public final fun bindInt (ILjava/lang/Integer;)V public fun bindLong (ILjava/lang/Long;)V public final fun bindObject (ILjava/lang/Object;)V - public final fun bindObjectOther (ILjava/lang/Object;)V + public final fun bindObject (ILjava/lang/Object;I)V public final fun bindShort (ILjava/lang/Short;)V public fun bindString (ILjava/lang/String;)V + public final fun bindTime (ILjava/sql/Time;)V + public final fun bindTimestamp (ILjava/sql/Timestamp;)V public final fun execute ()J public final fun executeQuery (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; } diff --git a/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt b/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt index 2021ed0ee4d..58f9d6e727f 100644 --- a/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt +++ b/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt @@ -182,11 +182,7 @@ class JdbcPreparedStatement( private val preparedStatement: PreparedStatement, ) : SqlPreparedStatement { override fun bindBytes(index: Int, bytes: ByteArray?) { - if (bytes == null) { - preparedStatement.setNull(index + 1, Types.BLOB) - } else { - preparedStatement.setBytes(index + 1, bytes) - } + preparedStatement.setBytes(index + 1, bytes) } override fun bindBoolean(index: Int, boolean: Boolean?) { @@ -246,11 +242,7 @@ class JdbcPreparedStatement( } fun bindBigDecimal(index: Int, decimal: BigDecimal?) { - if (decimal == null) { - preparedStatement.setNull(index + 1, Types.NUMERIC) - } else { - preparedStatement.setBigDecimal(index + 1, decimal) - } + preparedStatement.setBigDecimal(index + 1, decimal) } fun bindObject(index: Int, obj: Any?) { @@ -261,20 +253,28 @@ class JdbcPreparedStatement( } } - fun bindObjectOther(index: Int, obj: Any?) { + fun bindObject(index: Int, obj: Any?, type: Int) { if (obj == null) { - preparedStatement.setNull(index + 1, Types.OTHER) + preparedStatement.setNull(index + 1, type) } else { - preparedStatement.setObject(index + 1, obj, Types.OTHER) + preparedStatement.setObject(index + 1, obj, type) } } override fun bindString(index: Int, string: String?) { - if (string == null) { - preparedStatement.setNull(index + 1, Types.VARCHAR) - } else { - preparedStatement.setString(index + 1, string) - } + preparedStatement.setString(index + 1, string) + } + + fun bindDate(index: Int, date: java.sql.Date?) { + preparedStatement.setDate(index, date) + } + + fun bindTime(index: Int, date: java.sql.Time?) { + preparedStatement.setTime(index, date) + } + + fun bindTimestamp(index: Int, timestamp: java.sql.Timestamp?) { + preparedStatement.setTimestamp(index, timestamp) } fun executeQuery(mapper: (SqlCursor) -> R): R { @@ -312,6 +312,9 @@ class JdbcCursor(val resultSet: ResultSet) : SqlCursor { override fun getDouble(index: Int): Double? = getAtIndex(index, resultSet::getDouble) fun getBigDecimal(index: Int): BigDecimal? = resultSet.getBigDecimal(index + 1) inline fun getObject(index: Int): T? = resultSet.getObject(index + 1, T::class.java) + fun getDate(index: Int): java.sql.Date? = resultSet.getDate(index) + fun getTime(index: Int): java.sql.Time? = resultSet.getTime(index) + fun getTimestamp(index: Int): java.sql.Timestamp? = resultSet.getTimestamp(index) @Suppress("UNCHECKED_CAST") fun getArray(index: Int) = getAtIndex(index, resultSet::getArray)?.array as Array? diff --git a/drivers/r2dbc-driver/src/main/kotlin/app/cash/sqldelight/driver/r2dbc/R2dbcDriver.kt b/drivers/r2dbc-driver/src/main/kotlin/app/cash/sqldelight/driver/r2dbc/R2dbcDriver.kt index 3445955f751..dcf5ab466ea 100644 --- a/drivers/r2dbc-driver/src/main/kotlin/app/cash/sqldelight/driver/r2dbc/R2dbcDriver.kt +++ b/drivers/r2dbc-driver/src/main/kotlin/app/cash/sqldelight/driver/r2dbc/R2dbcDriver.kt @@ -8,6 +8,7 @@ import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.db.SqlPreparedStatement import io.r2dbc.spi.Connection import io.r2dbc.spi.Statement +import java.math.BigDecimal import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope @@ -155,7 +156,7 @@ fun CoroutineScope.R2dbcDriver( } // R2DBC uses boxed Java classes instead primitives: https://r2dbc.io/spec/1.0.0.RELEASE/spec/html/#datatypes -class R2dbcPreparedStatement(private val statement: Statement) : SqlPreparedStatement { +class R2dbcPreparedStatement(val statement: Statement) : SqlPreparedStatement { override fun bindBytes(index: Int, bytes: ByteArray?) { if (bytes == null) { statement.bindNull(index, ByteArray::class.java) @@ -164,6 +165,22 @@ class R2dbcPreparedStatement(private val statement: Statement) : SqlPreparedStat } } + override fun bindBoolean(index: Int, boolean: Boolean?) { + if (boolean == null) { + statement.bindNull(index, Boolean::class.javaObjectType) + } else { + statement.bind(index, boolean) + } + } + + fun bindByte(index: Int, byte: Byte?) { + if (byte == null) { + statement.bindNull(index, Byte::class.javaObjectType) + } else { + statement.bind(index, byte) + } + } + fun bindShort(index: Int, short: Short?) { if (short == null) { statement.bindNull(index, Short::class.javaObjectType) @@ -188,6 +205,14 @@ class R2dbcPreparedStatement(private val statement: Statement) : SqlPreparedStat } } + fun bindFloat(index: Int, float: Float?) { + if (float == null) { + statement.bindNull(index, Float::class.javaObjectType) + } else { + statement.bind(index, float) + } + } + override fun bindDouble(index: Int, double: Double?) { if (double == null) { statement.bindNull(index, Double::class.javaObjectType) @@ -196,29 +221,38 @@ class R2dbcPreparedStatement(private val statement: Statement) : SqlPreparedStat } } - override fun bindString(index: Int, string: String?) { - if (string == null) { - statement.bindNull(index, String::class.java) + fun bindBigDecimal(index: Int, decimal: BigDecimal?) { + if (decimal == null) { + statement.bindNull(index, BigDecimal::class.java) } else { - statement.bind(index, string) + statement.bind(index, decimal) } } - override fun bindBoolean(index: Int, boolean: Boolean?) { - if (boolean == null) { - statement.bindNull(index, Boolean::class.javaObjectType) + fun bindObject(index: Int, any: Any?, ignoredSqlType: Int = 0) { + if (any == null) { + statement.bindNull(index, Any::class.java) } else { - statement.bind(index, boolean) + statement.bind(index, any) } } - fun bindObject(index: Int, any: Any?) { + @JvmName("bindTypedObject") + inline fun bindObject(index: Int, any: T?) { if (any == null) { - statement.bindNull(index, Any::class.java) + statement.bindNull(index, T::class.java) } else { statement.bind(index, any) } } + + override fun bindString(index: Int, string: String?) { + if (string == null) { + statement.bindNull(index, String::class.java) + } else { + statement.bind(index, string) + } + } } internal fun Publisher.asIterator(): AsyncPublisherIterator = From 56282091afa5208fa0dbd823ab36ae4f57b9e88b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Thu, 4 Apr 2024 09:36:05 +0100 Subject: [PATCH 107/304] Fixes 5082 tsvector (#5104) * Add match operator for tsvector and jsonb Shared with Jsonb and TsVector type Add MatchOperatorExpressionMixin for SqlExp and annotations Add PostgreSqlTypeResolver matchOperatorExpression boolean result types Operator resolver type e.g || concat * Add tests Integration tests for TsVector || concat test * add ts_rank function Useful text search function ts_rank returns a REAL type * Add function websearch_to_tsquery Seems to be commonly used for searches - returns ts_query type that is a text type Tested locally with ` SELECT * FROM Recipes WHERE search @@ websearch_to_tsquery('english', ?); ` --- .../dialects/postgresql/PostgreSqlType.kt | 5 +- .../postgresql/PostgreSqlTypeResolver.kt | 9 ++++ .../postgresql/grammar/PostgreSql.bnf | 15 ++++-- .../mixins/MatchOperatorExpressionMixin.kt | 35 ++++++++++++++ .../postgres/PostgreSqlFixturesTest.kt | 2 +- .../fixtures_postgresql/json_functions/Test.s | 2 +- .../text-search-functions/Test.s | 8 ++++ .../postgresql/integration/TextSearch.sq | 28 +++++++++++ .../postgresql/integration/PostgreSqlTest.kt | 46 +++++++++++++++++++ 9 files changed, 143 insertions(+), 7 deletions(-) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/MatchOperatorExpressionMixin.kt create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/text-search-functions/Test.s create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/TextSearch.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt index d79bf98dec8..eb81fca6bd6 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt @@ -22,6 +22,7 @@ internal enum class PostgreSqlType(override val javaType: TypeName) : DialectTyp UUID(ClassName("java.util", "UUID")), NUMERIC(ClassName("java.math", "BigDecimal")), JSON(STRING), + TSVECTOR(STRING), ; override fun prepareStatementBinder(columnIndex: CodeBlock, value: CodeBlock): CodeBlock { @@ -36,7 +37,7 @@ internal enum class PostgreSqlType(override val javaType: TypeName) : DialectTyp ) NUMERIC -> CodeBlock.of("bindBigDecimal(%L, %L)\n", columnIndex, value) - JSON -> CodeBlock.of( + JSON, TSVECTOR -> CodeBlock.of( "bindObject(%L, %L, %M)\n", columnIndex, value, @@ -53,7 +54,7 @@ internal enum class PostgreSqlType(override val javaType: TypeName) : DialectTyp BIG_INT -> "$cursorName.getLong($columnIndex)" DATE, TIME, TIMESTAMP, TIMESTAMP_TIMEZONE, INTERVAL, UUID -> "$cursorName.getObject<%T>($columnIndex)" NUMERIC -> "$cursorName.getBigDecimal($columnIndex)" - JSON -> "$cursorName.getString($columnIndex)" + JSON, TSVECTOR -> "$cursorName.getString($columnIndex)" }, javaType, ) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index 535d29d669a..b1937f9895d 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -69,6 +69,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes jsonDataType != null -> PostgreSqlType.JSON booleanDataType != null -> BOOLEAN blobDataType != null -> BLOB + tsvectorDataType != null -> PostgreSqlType.TSVECTOR else -> throw IllegalArgumentException("Unknown kotlin type for sql type ${this.text}") }, ) @@ -178,6 +179,10 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "regexp_count", "regexp_instr" -> IntermediateType(INTEGER) "regexp_like" -> IntermediateType(BOOLEAN) "regexp_replace", "regexp_substr" -> IntermediateType(TEXT) + "to_tsquery" -> IntermediateType(TEXT) + "to_tsvector" -> IntermediateType(PostgreSqlType.TSVECTOR) + "ts_rank" -> encapsulatingType(exprList, REAL, TEXT) + "websearch_to_tsquery" -> IntermediateType(TEXT) else -> null } @@ -240,6 +245,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes PostgreSqlType.TIMESTAMP_TIMEZONE, PostgreSqlType.TIMESTAMP, PostgreSqlType.JSON, + PostgreSqlType.TSVECTOR, ) } } @@ -269,6 +275,9 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes IntermediateType(PostgreSqlType.JSON) } } + matchOperatorExpression != null -> { + IntermediateType(BOOLEAN) + } else -> parentResolver.resolvedType(this) } diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 0b41b357ae8..653d050d6dd 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -146,7 +146,8 @@ type_name ::= ( date_data_type | boolean_data_type | json_data_type | - blob_data_type + blob_data_type | + tsvector_data_type ) [ '[]' ] { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlTypeNameImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlTypeName" @@ -210,6 +211,8 @@ json_data_type ::= 'JSON' | 'JSONB' blob_data_type ::= 'BYTEA' +tsvector_data_type ::= 'TSVECTOR' + interval_expression ::= 'INTERVAL' string_literal with_clause_auxiliary_stmt ::= {compound_select_stmt} | delete_stmt_limited | insert_stmt | update_stmt_limited { @@ -358,7 +361,7 @@ compound_select_stmt ::= [ {with_clause} ] {select_stmt} ( {compound_operator} override = true } -extension_expr ::= array_agg_stmt| string_agg_stmt | json_expression | boolean_literal | boolean_not_expression | window_function_expr { +extension_expr ::= match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_literal | boolean_not_expression | window_function_expr { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionExprImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionExpr" override = true @@ -378,7 +381,13 @@ json_expression ::= {column_expr} ( jsona_binary_operator | jsonb_binary_operato } jsona_binary_operator ::= '->' | '->>' | '#>' | '#>>' jsonb_binary_operator ::= '#-' -jsonb_boolean_operator ::= '@@' | '@>' | '<@' | '@?' | '??|' | '??&' | '??' +jsonb_boolean_operator ::= '@>' | '<@' | '@?' | '??|' | '??&' | '??' +match_operator ::= '@@' + +match_operator_expression ::= ( {function_expr} | {column_expr} ) match_operator <> { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.MatchOperatorExpressionMixin" + pin = 2 +} extension_stmt ::= create_sequence_stmt | copy_stdin | truncate_stmt | set_stmt | drop_sequence_stmt | alter_sequence_stmt | create_extension_stmt | drop_extension_stmt | alter_extension_stmt { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionStmtImpl" diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/MatchOperatorExpressionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/MatchOperatorExpressionMixin.kt new file mode 100644 index 00000000000..708431c118d --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/MatchOperatorExpressionMixin.kt @@ -0,0 +1,35 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlMatchOperatorExpression +import com.alecstrong.sql.psi.core.SqlAnnotationHolder +import com.alecstrong.sql.psi.core.psi.SqlBinaryExpr +import com.alecstrong.sql.psi.core.psi.SqlColumnDef +import com.alecstrong.sql.psi.core.psi.SqlColumnName +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlExpr +import com.intellij.lang.ASTNode + +/** + * The "@@" match operator is used by TsVector and Jsonb + * The type annotation is performed here for both types + * For other json operators see JsonExpressionMixin + */ +internal abstract class MatchOperatorExpressionMixin(node: ASTNode) : + SqlCompositeElementImpl(node), + SqlBinaryExpr, + PostgreSqlMatchOperatorExpression { + + override fun annotate(annotationHolder: SqlAnnotationHolder) { + val columnType = ((firstChild.firstChild.reference?.resolve() as? SqlColumnName)?.parent as? SqlColumnDef)?.columnType?.typeName?.text + when { + columnType == null -> super.annotate(annotationHolder) + columnType == "JSONB" -> super.annotate(annotationHolder) + columnType == "JSON" -> annotationHolder.createErrorAnnotation(firstChild.firstChild, "Left side of jsonb expression must be a jsonb column.") + columnType != "TSVECTOR" -> annotationHolder.createErrorAnnotation(firstChild.firstChild, "Left side of match expression must be a tsvector column.") + } + super.annotate(annotationHolder) + } + override fun getExprList(): List { + return children.filterIsInstance() + } +} diff --git a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt index c91b3f09be2..f854343efc0 100644 --- a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt +++ b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt @@ -18,7 +18,7 @@ class PostgreSqlFixturesTest(name: String, fixtureRoot: File) : FixturesTest(nam "BLOB" to "TEXT", "id TEXT GENERATED ALWAYS AS (2) UNIQUE NOT NULL" to "id TEXT GENERATED ALWAYS AS (2) STORED UNIQUE NOT NULL", "'(', ')', ',', '.', , BETWEEN or IN expected, got ','" - to "'#-', '(', ')', ',', '.', , , , BETWEEN or IN expected, got ','", + to "'#-', '(', ')', ',', '.', , , , '@@', BETWEEN or IN expected, got ','", ) override fun setupDialect() { diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/json_functions/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/json_functions/Test.s index 39eb1cc02db..48bd0a6adb8 100644 --- a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/json_functions/Test.s +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/json_functions/Test.s @@ -22,5 +22,5 @@ SELECT data @@ '$.b[*] > 0' FROM myTable; -SELECT data ->> 'a', datab -> 'b', data #> '{aa}', datab #>> '{bb}', datab || datab, datab - 'b', datab - 1 +SELECT data ->> 'a', datab -> 'b', data #> '{aa}', datab #>> '{bb}', datab || datab, datab - 'b', datab - 1, datab @@ '$.b[*] > 0' FROM myTable; diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/text-search-functions/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/text-search-functions/Test.s new file mode 100644 index 00000000000..d30255a8b3d --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/text-search-functions/Test.s @@ -0,0 +1,8 @@ +CREATE TABLE t1 ( + c1 TSVECTOR +); + +INSERT INTO t1 (c1) VALUES ('the rain in spain falls mainly on the plains') ; + +SELECT c1 @@ 'fail' +FROM t1; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/TextSearch.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/TextSearch.sq new file mode 100644 index 00000000000..bf65eefc288 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/TextSearch.sq @@ -0,0 +1,28 @@ +CREATE TABLE search( + content TSVECTOR NOT NULL +); + +insertLiteral: +INSERT INTO search (content) VALUES (?); + +contains: +SELECT content @@ ? +FROM search; + +search: +SELECT * +FROM search WHERE content @@ ?; + +tsQuery: +SELECT to_tsquery(?); + +tsVector: +SELECT to_tsvector(?); + +concat: +SELECT content || to_tsvector(?) +FROM search; + +rank: +SELECT ts_rank(content, ?) +FROM search; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index 58272bf4017..6a2b24c71d2 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -782,4 +782,50 @@ class PostgreSqlTest { assertThat(first().datab).isEqualTo("""{"b": 2}""") } } + + @Test + fun testSelectTsVectorSearch() { + database.textSearchQueries.insertLiteral("the rain in spain") + with(database.textSearchQueries.search("rain").executeAsList()) { + assertThat(first()).isEqualTo("'in' 'rain' 'spain' 'the'") + } + } + + @Test + fun testSelectTsVectorContains() { + database.textSearchQueries.insertLiteral("the rain in spain") + with(database.textSearchQueries.contains("rain").executeAsList()) { + assertThat(first()).isEqualTo(true) + } + } + + @Test + fun testSelectTsQuery() { + with(database.textSearchQueries.tsQuery("the & rain & spain'").executeAsList()) { + assertThat(first()).isEqualTo("'rain' & 'spain'") + } + } + + @Test + fun testSelectTsVector() { + with(database.textSearchQueries.tsVector("the rain in spain").executeAsList()) { + assertThat(first()).isEqualTo("'rain':2 'spain':4") + } + } + + @Test + fun testContactTsVector() { + database.textSearchQueries.insertLiteral("the rain in spain") + with(database.textSearchQueries.concat("falls mainly on the plains").executeAsList()) { + assertThat(first()).isEqualTo("'fall':1 'in' 'main':2 'plain':5 'rain' 'spain' 'the'") + } + } + + @Test + fun testContactTsVectorRank() { + database.textSearchQueries.insertLiteral("the rain in spain") + with(database.textSearchQueries.rank("rain | plain").executeAsList()) { + assertThat(first()).isEqualTo("0.030396355") + } + } } From 918fc32914587415763605533e25ad1eba80faaf Mon Sep 17 00:00:00 2001 From: Jeffrey Starke Date: Thu, 4 Apr 2024 19:12:46 -0500 Subject: [PATCH 108/304] Update build.gradle (#5118) --- sqldelight-gradle-plugin/src/test/schema-output/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldelight-gradle-plugin/src/test/schema-output/build.gradle b/sqldelight-gradle-plugin/src/test/schema-output/build.gradle index 30436297eb2..f2e53b3bb12 100644 --- a/sqldelight-gradle-plugin/src/test/schema-output/build.gradle +++ b/sqldelight-gradle-plugin/src/test/schema-output/build.gradle @@ -8,7 +8,7 @@ sqldelight { MyDatabase { packageName = "app.cash.sqldelight.mysql.integration" dialect("app.cash.sqldelight:mysql-dialect:${app.cash.sqldelight.VersionKt.VERSION}") - migrationOutputDirectory = file("build/resources/migrations") + migrationOutputDirectory = layout.buildDirectory.dir("resources/migrations") migrationOutputFileFormat = ".sql" } } From 2c54d9e4df04ed6ad391bdeba2b395917f5ce869 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Apr 2024 07:44:53 -0400 Subject: [PATCH 109/304] Update plugin ksp to v1.9.23-1.0.20 (#5121) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bac8f778984..86e28733aae 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -107,5 +107,5 @@ publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } -ksp = { id = "com.google.devtools.ksp", version = "1.9.23-1.0.19" } +ksp = { id = "com.google.devtools.ksp", version = "1.9.23-1.0.20" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.14.0" } From aa41c0b2381c0f9534c22e5362e9e5257407b39f Mon Sep 17 00:00:00 2001 From: Alec Kazakova <1675456+AlecKazakova@users.noreply.github.com> Date: Fri, 5 Apr 2024 10:51:07 -0400 Subject: [PATCH 110/304] Specify the thread to use for the connection list clear action (#5125) --- .../cash/sqldelight/intellij/run/window/ConnectionListPanel.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/run/window/ConnectionListPanel.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/run/window/ConnectionListPanel.kt index 9ac02e18629..9598cf0e785 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/run/window/ConnectionListPanel.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/run/window/ConnectionListPanel.kt @@ -3,6 +3,7 @@ package app.cash.sqldelight.intellij.run.window import app.cash.sqldelight.dialect.api.ConnectionManager import app.cash.sqldelight.intellij.run.ConnectionOptions import com.intellij.icons.AllIcons +import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.project.Project import com.intellij.openapi.wm.ToolWindowManager @@ -44,6 +45,8 @@ internal class ConnectionListPanel( connectionOptions.unselectOption() updateModel() } + + override fun getActionUpdateThread() = ActionUpdateThread.EDT } init { From b5d9d3fd29b10273741c418c51829023e206ff3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:34:19 +0100 Subject: [PATCH 111/304] Fixes 5032 column adjacency for PostgreSql UPDATE FROM statement (#5035) * Fixes column adjacency for Update statement Same fix for Sqlite * Add Integration tests * fix from spotless whitespace --------- Co-authored-by: Alec Kazakova <1675456+AlecKazakova@users.noreply.github.com> --- .../grammar/mixins/UpdateStmtLimitedMixin.kt | 4 +-- .../fixtures_postgresql/update-set-from/1.s | 10 +++++-- .../postgresql/integration/Updates.sq | 30 +++++++++++++++++++ .../postgresql/integration/PostgreSqlTest.kt | 18 +++++++++++ 4 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Updates.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/UpdateStmtLimitedMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/UpdateStmtLimitedMixin.kt index 1ece1572273..7c85bb30504 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/UpdateStmtLimitedMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/UpdateStmtLimitedMixin.kt @@ -18,9 +18,9 @@ internal abstract class UpdateStmtLimitedMixin( FromQuery { override fun queryAvailable(child: PsiElement): Collection { if (child != joinClause && joinClause != null) { - return super.queryAvailable(child) + joinClause!!.queryExposed() + return super.queryAvailable(child) + + joinClause!!.queryExposed().map { it.copy(adjacent = true) } } - return super.queryAvailable(child) } diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/update-set-from/1.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/update-set-from/1.s index 914dc77d6cd..54c94a755da 100644 --- a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/update-set-from/1.s +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/update-set-from/1.s @@ -1,9 +1,11 @@ CREATE TABLE test( - id SERIAL PRIMARY KEY + id SERIAL PRIMARY KEY, + id2 INTEGER ); CREATE TABLE test2( - id2 SERIAL PRIMARY KEY + id2 SERIAL PRIMARY KEY, + other TEXT ); UPDATE test @@ -40,4 +42,8 @@ FROM ( ON otherTest.id = test2.id2 ); +UPDATE test +SET id2 = t2.id2 +FROM test2 t2 +WHERE other = 'x'; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Updates.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Updates.sq new file mode 100644 index 00000000000..60ac7f648b5 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Updates.sq @@ -0,0 +1,30 @@ +CREATE TABLE test( + id SERIAL PRIMARY KEY, + id2 INTEGER +); + +CREATE TABLE test2( + id2 SERIAL PRIMARY KEY, + other TEXT +); + +insertTest: +INSERT INTO test (id2) VALUES(?); + +insertTest2: +INSERT INTO test2 (other) VALUES(?); + +updateTestId: +UPDATE test +SET id = t2.id2 +FROM ( + SELECT + id2 + FROM test2 +) AS t2 RETURNING test.id; + +updateTestId2: +UPDATE test +SET id2 = t2.id2 +FROM test2 t2 +WHERE other = ? RETURNING test.id2; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index 6a2b24c71d2..10880dd2022 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -783,6 +783,24 @@ class PostgreSqlTest { } } + @Test + fun testUpdateSetFromId() { + database.updatesQueries.insertTest(31) + database.updatesQueries.insertTest2("X") + with(database.updatesQueries.updateTestId().executeAsOne()) { + assertThat(this).isEqualTo(1) + } + } + + @Test + fun testUpdateSetFromId2() { + database.updatesQueries.insertTest(31) + database.updatesQueries.insertTest2("X") + with(database.updatesQueries.updateTestId2("X").executeAsOne()) { + assertThat(id2).isEqualTo(1) + } + } + @Test fun testSelectTsVectorSearch() { database.textSearchQueries.insertLiteral("the rain in spain") From ad70ba12ff4225e06a7c8472c6e9a5ee78793f1a Mon Sep 17 00:00:00 2001 From: Alec Kazakova <1675456+AlecKazakova@users.noreply.github.com> Date: Fri, 5 Apr 2024 11:34:55 -0400 Subject: [PATCH 112/304] Dont bundle the kotlin lib into the intellij plugin as its already a plugin dependency (#5126) --- sqldelight-idea-plugin/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sqldelight-idea-plugin/build.gradle b/sqldelight-idea-plugin/build.gradle index 42e5f9d0903..830cc402de8 100644 --- a/sqldelight-idea-plugin/build.gradle +++ b/sqldelight-idea-plugin/build.gradle @@ -91,8 +91,9 @@ dependencies { testImplementation projects.dialects.sqlite318 } -configurations.named("implementation") { +configurations.named("runtimeClasspath") { exclude group: "org.slf4j" + exclude group: "org.jetbrains.kotlin" } def bugsnagKey = tasks.register('bugsnagKey', BugsnagKey) From b372df0dc74eadf8a99ca25ddb4f48d23c54a8d2 Mon Sep 17 00:00:00 2001 From: Alexander Perfilyev Date: Fri, 5 Apr 2024 19:40:33 +0300 Subject: [PATCH 113/304] Bump intellij version (#4983) * Bump intellij version also closes #4894 and #4741 * Bump sql psi version * Fixing up errors * Include sql psi environment for tests --------- Co-authored-by: Alec Kazakova --- .github/workflows/PR.yml | 5 +-- dialects/hsql/build.gradle | 2 + dialects/mysql/build.gradle | 2 + dialects/postgresql/build.gradle | 2 + dialects/sqlite-3-18/build.gradle | 2 + dialects/sqlite-3-24/build.gradle | 2 + dialects/sqlite-3-25/build.gradle | 2 + dialects/sqlite-3-30/build.gradle | 2 + dialects/sqlite-3-33/build.gradle | 2 + dialects/sqlite-3-35/build.gradle | 2 + dialects/sqlite-3-38/build.gradle | 2 + dialects/sqlite/json-module/build.gradle | 2 + gradle/libs.versions.toml | 5 ++- sqldelight-compiler/environment/build.gradle | 16 +++---- .../core/lang/MigrationParserDefinition.kt | 1 + .../core/lang/SqlDelightParserDefinition.kt | 4 +- .../core/lang/psi/ColumnTypeMixin.kt | 10 ++--- .../validation/OptimisticLockValidator.kt | 9 +--- sqldelight-gradle-plugin/build.gradle | 6 ++- .../sqldelight/core/SqlDelightEnvironment.kt | 4 +- .../OptimisticLockCompilerAnnotator.kt | 14 ++++++ .../SqlDelightLiveTemplateContextType.kt | 2 +- .../SqlDelightReferenceContributor.kt | 43 ------------------- .../SqlDelightTreeStructureProvider.kt | 2 +- .../intentions/AddOptimisticLockIntention.kt | 4 +- .../src/main/resources/META-INF/plugin.xml | 7 +-- .../sqldelight/intellij/FindUsagesTest.kt | 2 +- test-util/build.gradle | 1 + .../sqldelight/test/util/TestEnvironment.kt | 4 +- 29 files changed, 77 insertions(+), 84 deletions(-) create mode 100644 sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/annotators/OptimisticLockCompilerAnnotator.kt diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index c7f3b78f5c2..b65d9bea593 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -107,9 +107,8 @@ jobs: matrix: # https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html idea: - - 'IC-2022.3.3' # AS: Giraffe | 2022.3.1 - - 'IC-2023.1' # IC - - 'IC-2023.2' # IC + - 'IC-2023.2.5' # IC / Iguana + - 'IC-2024.1' # IC steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/dialects/hsql/build.gradle b/dialects/hsql/build.gradle index 4f298432e78..dcccb399f3a 100644 --- a/dialects/hsql/build.gradle +++ b/dialects/hsql/build.gradle @@ -24,6 +24,8 @@ dependencies { testFixturesApi testFixtures(libs.sqlPsi) testImplementation libs.truth + // Remove with next sql-psi release https://github.com/AlecKazakova/sql-psi/pull/619 + testImplementation libs.sqlPsiEnvironment } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/dialects/mysql/build.gradle b/dialects/mysql/build.gradle index 5ddcba725bb..28c785bc76b 100644 --- a/dialects/mysql/build.gradle +++ b/dialects/mysql/build.gradle @@ -29,6 +29,8 @@ dependencies { testFixturesApi testFixtures(libs.sqlPsi) testImplementation libs.truth + // Remove with next sql-psi release https://github.com/AlecKazakova/sql-psi/pull/619 + testImplementation libs.sqlPsiEnvironment } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/dialects/postgresql/build.gradle b/dialects/postgresql/build.gradle index e516a30e6fa..5407c0ad15d 100644 --- a/dialects/postgresql/build.gradle +++ b/dialects/postgresql/build.gradle @@ -29,6 +29,8 @@ dependencies { testFixturesApi testFixtures(libs.sqlPsi) testImplementation libs.truth + // Remove with next sql-psi release https://github.com/AlecKazakova/sql-psi/pull/619 + testImplementation libs.sqlPsiEnvironment } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/dialects/sqlite-3-18/build.gradle b/dialects/sqlite-3-18/build.gradle index 4f298432e78..dcccb399f3a 100644 --- a/dialects/sqlite-3-18/build.gradle +++ b/dialects/sqlite-3-18/build.gradle @@ -24,6 +24,8 @@ dependencies { testFixturesApi testFixtures(libs.sqlPsi) testImplementation libs.truth + // Remove with next sql-psi release https://github.com/AlecKazakova/sql-psi/pull/619 + testImplementation libs.sqlPsiEnvironment } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/dialects/sqlite-3-24/build.gradle b/dialects/sqlite-3-24/build.gradle index 74280fcbad6..01f1fcd9888 100644 --- a/dialects/sqlite-3-24/build.gradle +++ b/dialects/sqlite-3-24/build.gradle @@ -25,6 +25,8 @@ dependencies { testFixturesApi testFixtures(projects.dialects.sqlite318) testImplementation libs.junit + // Remove with next sql-psi release https://github.com/AlecKazakova/sql-psi/pull/619 + testImplementation libs.sqlPsiEnvironment } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/dialects/sqlite-3-25/build.gradle b/dialects/sqlite-3-25/build.gradle index 945f527c7ba..32ce8b47870 100644 --- a/dialects/sqlite-3-25/build.gradle +++ b/dialects/sqlite-3-25/build.gradle @@ -25,6 +25,8 @@ dependencies { testFixturesApi(testFixtures(libs.sqlPsi)) testImplementation libs.truth + // Remove with next sql-psi release https://github.com/AlecKazakova/sql-psi/pull/619 + testImplementation libs.sqlPsiEnvironment } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/dialects/sqlite-3-30/build.gradle b/dialects/sqlite-3-30/build.gradle index 40f5ff7a22c..0e72b268a26 100644 --- a/dialects/sqlite-3-30/build.gradle +++ b/dialects/sqlite-3-30/build.gradle @@ -25,6 +25,8 @@ dependencies { testFixturesApi(testFixtures(libs.sqlPsi)) testImplementation libs.truth + // Remove with next sql-psi release https://github.com/AlecKazakova/sql-psi/pull/619 + testImplementation libs.sqlPsiEnvironment } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/dialects/sqlite-3-33/build.gradle b/dialects/sqlite-3-33/build.gradle index 6f25405e0e2..be6d7d6009b 100644 --- a/dialects/sqlite-3-33/build.gradle +++ b/dialects/sqlite-3-33/build.gradle @@ -25,6 +25,8 @@ dependencies { testFixturesApi(testFixtures(libs.sqlPsi)) testImplementation libs.truth + // Remove with next sql-psi release https://github.com/AlecKazakova/sql-psi/pull/619 + testImplementation libs.sqlPsiEnvironment } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/dialects/sqlite-3-35/build.gradle b/dialects/sqlite-3-35/build.gradle index 30581168ea3..57bcbcc0bf9 100644 --- a/dialects/sqlite-3-35/build.gradle +++ b/dialects/sqlite-3-35/build.gradle @@ -25,6 +25,8 @@ dependencies { testFixturesApi(testFixtures(libs.sqlPsi)) testImplementation libs.truth + // Remove with next sql-psi release https://github.com/AlecKazakova/sql-psi/pull/619 + testImplementation libs.sqlPsiEnvironment } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/dialects/sqlite-3-38/build.gradle b/dialects/sqlite-3-38/build.gradle index 2c7c78b3bf7..d7295f8e136 100644 --- a/dialects/sqlite-3-38/build.gradle +++ b/dialects/sqlite-3-38/build.gradle @@ -25,6 +25,8 @@ dependencies { testFixturesApi(testFixtures(libs.sqlPsi)) testImplementation libs.truth + // Remove with next sql-psi release https://github.com/AlecKazakova/sql-psi/pull/619 + testImplementation libs.sqlPsiEnvironment } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/dialects/sqlite/json-module/build.gradle b/dialects/sqlite/json-module/build.gradle index e6bf0eb77d9..7825a719a46 100644 --- a/dialects/sqlite/json-module/build.gradle +++ b/dialects/sqlite/json-module/build.gradle @@ -25,6 +25,8 @@ dependencies { testFixturesApi testFixtures(libs.sqlPsi) testImplementation libs.truth + // Remove with next sql-psi release https://github.com/AlecKazakova/sql-psi/pull/619 + testImplementation libs.sqlPsiEnvironment } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 86e28733aae..dbfbf0d6cc0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ kotlin = "1.9.23" dokka = "1.9.20" kotlinCoroutines = "1.8.0" -idea = "222.4459.24" # Flamingo | 2022.2.1 (see https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html) +idea = "231.9392.1" # Hedgehog | 2023.1.1 Patch 2 (see https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html) androidxSqlite = "2.4.0" schemaCrawler = "16.19.2" sqliter = "1.3.1" @@ -13,7 +13,7 @@ ktlint = "1.2.1" agp = "8.3.1" compileSdk = "34" minSdk = "21" -sqlPsi = "0.4.8" +sqlPsi = "0.4.9" testContainers = "1.19.7" [libraries] @@ -64,6 +64,7 @@ intellij-utilUi = { module = "com.jetbrains.intellij.platform:util-ui", version. intellij-util = { module = "com.jetbrains.intellij.platform:util", version.ref = "idea" } sqlPsi = { module = "com.alecstrong.sql.psi:core", version.ref = "sqlPsi" } +sqlPsiEnvironment = { module = "com.alecstrong.sql.psi:environment", version.ref = "sqlPsi" } robolectric = { module = "org.robolectric:robolectric", version = "4.12.1" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } diff --git a/sqldelight-compiler/environment/build.gradle b/sqldelight-compiler/environment/build.gradle index 96b82bdd866..85ea552b9bf 100644 --- a/sqldelight-compiler/environment/build.gradle +++ b/sqldelight-compiler/environment/build.gradle @@ -76,35 +76,35 @@ tasks.named("shadowJar") { intellij-deps-fastutil-8.5.8-11.jar 3.945,56 kb ide-222.4459.24.jar 3.860,40 kb util-222.4459.24.jar 2.385,63 kb - + After minimizing: 43 MB, mostly due to minimizing ide-impl - */ + */ minimize { // Needed for MockProject and MockModule. exclude(dependency(libs.intellij.testFramework.get())) - + // Needed for general utils like PsiTreeUtil. exclude(dependency(libs.intellij.util.get())) - + // Base intellij platform. exclude(dependency(libs.intellij.core.get())) exclude(dependency(libs.intellij.coreImpl.get())) - + // Base required language support. exclude(dependency(libs.intellij.lang.get())) exclude(dependency(libs.intellij.langImpl.get())) - + // Base required analysis support, like resolve references. exclude(dependency(libs.intellij.analysis.get())) exclude(dependency(libs.intellij.analysisImpl.get())) - + // Needed for resolving files and the file index. exclude(dependency(libs.intellij.projectModel.get())) exclude(dependency(libs.intellij.projectModelImpl.get())) // Don't minimize coroutines support. exclude(dependency(libs.intellij.utilEx.get())) - + // Needed for Icon support. exclude(dependency(libs.intellij.utilUi.get())) } diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/MigrationParserDefinition.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/MigrationParserDefinition.kt index 1bccace78d9..3329e0617bb 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/MigrationParserDefinition.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/MigrationParserDefinition.kt @@ -25,6 +25,7 @@ class MigrationParserDefinition : SqlParserDefinition() { private val FILE = object : ILightStubFileElementType>(MigrationLanguage) { override fun getStubVersion(): Int = this@Companion.stubVersion + override fun getExternalId(): String = "SqlDelight.MIGRATION" } } } diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightParserDefinition.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightParserDefinition.kt index 8101f27b854..faade35abe7 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightParserDefinition.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightParserDefinition.kt @@ -53,6 +53,8 @@ class SqlDelightParserDefinition : SqlParserDefinition() { } companion object { - private val FILE = ILightStubFileElementType>(SqlDelightLanguage) + private val FILE = object : ILightStubFileElementType>(SqlDelightLanguage) { + override fun getExternalId(): String = "SqlDelight" + } } } diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt index 95b10431d1a..379f59ae90f 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt @@ -42,7 +42,7 @@ import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.tree.TokenSet import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.parentOfType -import com.intellij.util.castSafelyTo +import com.intellij.util.asSafely import com.squareup.kotlinpoet.AnnotationSpec import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.CodeBlock @@ -84,10 +84,10 @@ internal abstract class ColumnTypeMixin( ?.columnNameList?.singleOrNull() // Foreign Column (tableForeignKeyClause ?: columnConstraint)?.reference?.resolve()?.let { resolvedKey -> // Resolved Column - val dialectType = resolvedKey.castSafelyTo() // Column Name - ?.parent?.castSafelyTo() // Column Definition - ?.columnType?.castSafelyTo() // Column type - ?.type()?.dialectType?.castSafelyTo() ?: return@let // SqlDelight type + val dialectType = resolvedKey.asSafely() // Column Name + ?.parent?.asSafely() // Column Definition + ?.columnType?.asSafely() // Column type + ?.type()?.dialectType?.asSafely() ?: return@let // SqlDelight type type = type.copy( dialectType = dialectType, javaType = dialectType.javaType, diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/validation/OptimisticLockValidator.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/validation/OptimisticLockValidator.kt index 534d1b2436a..a918a204c04 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/validation/OptimisticLockValidator.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/validation/OptimisticLockValidator.kt @@ -3,7 +3,6 @@ package app.cash.sqldelight.core.lang.validation import app.cash.sqldelight.core.lang.util.columnDefSource import app.cash.sqldelight.core.lang.util.findChildrenOfType import com.alecstrong.sql.psi.core.SqlAnnotationHolder -import com.alecstrong.sql.psi.core.SqlCompilerAnnotator import com.alecstrong.sql.psi.core.psi.NamedElement import com.alecstrong.sql.psi.core.psi.Queryable import com.alecstrong.sql.psi.core.psi.SqlBinaryAddExpr @@ -21,17 +20,13 @@ import com.intellij.lang.annotation.HighlightSeverity import com.intellij.psi.PsiElement import com.intellij.psi.util.parentOfType -open class OptimisticLockValidator : Annotator, SqlCompilerAnnotator { +open class OptimisticLockValidator : Annotator { open fun quickFix(element: PsiElement, lock: ColumnDefMixin): IntentionAction? = null override fun annotate(element: PsiElement, holder: AnnotationHolder) { annotate(element, holder, null) } - override fun annotate(element: PsiElement, annotationHolder: SqlAnnotationHolder) { - annotate(element, null, annotationHolder) - } - fun annotate( element: PsiElement, holder: AnnotationHolder?, @@ -103,7 +98,7 @@ open class OptimisticLockValidator : Annotator, SqlCompilerAnnotator { val whereExpression = when (element) { is SqlUpdateStmt -> element.expr - is SqlUpdateStmtLimited -> element.exprList.getOrNull(0) ?: return + is SqlUpdateStmtLimited -> element.expr else -> throw IllegalStateException() } diff --git a/sqldelight-gradle-plugin/build.gradle b/sqldelight-gradle-plugin/build.gradle index cf2460ee86c..c1bbac5570e 100644 --- a/sqldelight-gradle-plugin/build.gradle +++ b/sqldelight-gradle-plugin/build.gradle @@ -42,6 +42,7 @@ gradlePlugin { dependencies { api projects.sqldelightCompiler + compileOnly(projects.sqldelightCompiler.environment) { targetConfiguration = "shadow" } @@ -51,6 +52,7 @@ dependencies { targetConfiguration = "shadow" } + implementation libs.sqlPsiEnvironment implementation libs.kotlin.plugin compileOnly libs.android.plugin @@ -104,7 +106,7 @@ tasks.named('test') { languageVersion = JavaLanguageVersion.of(ToolchainConventions.BUILD_JDK) } environment("ORG_GRADLE_PROJECT_sqldelightVersion", project.version) - + if (System.getenv("CI")) { reports.html.required = false reports.junitXml.required = false @@ -141,7 +143,7 @@ tasks.named("grammarkitTest") { ":runtime:publishKotlinMultiplatformPublicationToInstallLocallyRepository", ":runtime:publishJvmPublicationToInstallLocallyRepository", ":drivers:sqlite-driver:publishAllPublicationsToInstallLocallyRepository", - ":drivers:jdbc-driver:publishAllPublicationsToInstallLocallyRepository", + ":drivers:jdbc-driver:publishAllPublicationsToInstallLocallyRepository", ":sqlite-migrations:publishAllPublicationsToInstallLocallyRepository", ":sqldelight-compiler:publishAllPublicationsToInstallLocallyRepository", ":sqldelight-gradle-plugin:publishAllPublicationsToInstallLocallyRepository", diff --git a/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/SqlDelightEnvironment.kt b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/SqlDelightEnvironment.kt index d0d166d6e96..5759ae874b5 100644 --- a/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/SqlDelightEnvironment.kt +++ b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/SqlDelightEnvironment.kt @@ -15,6 +15,7 @@ */ package app.cash.sqldelight.core +import app.cash.sqldelight.core.annotators.OptimisticLockCompilerAnnotator import app.cash.sqldelight.core.compiler.SqlDelightCompiler import app.cash.sqldelight.core.lang.DatabaseFileType import app.cash.sqldelight.core.lang.DatabaseFileViewProviderFactory @@ -26,7 +27,6 @@ import app.cash.sqldelight.core.lang.SqlDelightFileType import app.cash.sqldelight.core.lang.SqlDelightParserDefinition import app.cash.sqldelight.core.lang.SqlDelightQueriesFile import app.cash.sqldelight.core.lang.util.migrationFiles -import app.cash.sqldelight.core.lang.validation.OptimisticLockValidator import app.cash.sqldelight.core.psi.SqlDelightImportStmt import app.cash.sqldelight.dialect.api.SqlDelightDialect import com.alecstrong.sql.psi.core.SqlCoreEnvironment @@ -132,7 +132,7 @@ class SqlDelightEnvironment( */ fun generateSqlDelightFiles(logger: (String) -> Unit): CompilationStatus { val errors = sortedMapOf>() - val extraAnnotators = listOf(OptimisticLockValidator()) + val extraAnnotators = listOf(OptimisticLockCompilerAnnotator()) annotate( extraAnnotators, ) { element, message -> diff --git a/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/annotators/OptimisticLockCompilerAnnotator.kt b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/annotators/OptimisticLockCompilerAnnotator.kt new file mode 100644 index 00000000000..72e8470f171 --- /dev/null +++ b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/annotators/OptimisticLockCompilerAnnotator.kt @@ -0,0 +1,14 @@ +package app.cash.sqldelight.core.annotators + +import app.cash.sqldelight.core.lang.validation.OptimisticLockValidator +import com.alecstrong.sql.psi.core.SqlAnnotationHolder +import com.alecstrong.sql.psi.core.SqlCompilerAnnotator +import com.intellij.psi.PsiElement + +class OptimisticLockCompilerAnnotator : SqlCompilerAnnotator { + private val optimisticLockValidator = OptimisticLockValidator() + + override fun annotate(element: PsiElement, annotationHolder: SqlAnnotationHolder) { + optimisticLockValidator.annotate(element, null, annotationHolder) + } +} diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightLiveTemplateContextType.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightLiveTemplateContextType.kt index 612b130df30..0d9e2d6fe10 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightLiveTemplateContextType.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightLiveTemplateContextType.kt @@ -5,7 +5,7 @@ import app.cash.sqldelight.core.lang.SqlDelightFileType import com.intellij.codeInsight.template.TemplateActionContext import com.intellij.codeInsight.template.TemplateContextType -class SqlDelightLiveTemplateContextType : TemplateContextType("SQLDELIGHT", "SqlDelight") { +class SqlDelightLiveTemplateContextType : TemplateContextType("SqlDelight") { private val supportedFileTypes = setOf(SqlDelightFileType, MigrationFileType) diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightReferenceContributor.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightReferenceContributor.kt index e574e7868c6..a2d38e461e4 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightReferenceContributor.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightReferenceContributor.kt @@ -16,10 +16,7 @@ import com.intellij.psi.PsiReferenceProvider import com.intellij.psi.PsiReferenceRegistrar import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.stubs.StubIndex -import com.intellij.psi.stubs.StubIndexKey import com.intellij.util.ProcessingContext -import kotlin.reflect.full.companionObject -import kotlin.reflect.full.companionObjectInstance import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelTypeAliasFqNameIndex import org.jetbrains.kotlin.psi.KtTypeAlias @@ -78,43 +75,3 @@ internal class SqlDelightReferenceContributor : PsiReferenceContributor() { private fun typeForThisPackage(file: SqlDelightFile) = "${file.packageName}.${element.text}" } } - -private fun getKotlinTopLevelTypeAliasFqNameIndex(): StubIndexKey { - // read the HELPER variable reflectively (2023.2) - try { - val helperField = KotlinTopLevelTypeAliasFqNameIndex::class.java.getField("Helper") - val helper = helperField.get(null) - if (helper != null) { - val keyMethod = helper.javaClass.getMethod("getIndexKey") - val key = keyMethod.invoke(helper) - @Suppress("UNCHECKED_CAST") // Reflection that will go away when our minimum version is >= 2023.2 - if (key != null) return key as StubIndexKey - } - } catch (e: Exception) { - /* intentionally empty, fall back to getInstance() call in case of errors */ - } - - // read the INSTANCE variable reflectively first (newer Kotlin plugins) - try { - val instanceField = KotlinTopLevelTypeAliasFqNameIndex::class.java.getField("INSTANCE") - val instance = instanceField.get(null) - if (instance is KotlinTopLevelTypeAliasFqNameIndex) { - val keyMethod = instance.javaClass.getMethod("getKEY") - val key = keyMethod.invoke(instance) - @Suppress("UNCHECKED_CAST") // Reflection that will go away when our minimum version is >= 2023.2 - if (key != null) return key as StubIndexKey - } - } catch (e: Exception) { - /* intentionally empty, fall back to getInstance() call in case of errors */ - } - - // Call the method getInstance on the companion type. - val companionMethod = - KotlinTopLevelTypeAliasFqNameIndex::class.companionObject!!.java.getMethod("getInstance") - val instance = companionMethod.invoke(KotlinTopLevelTypeAliasFqNameIndex::class.companionObjectInstance!!) - as KotlinTopLevelTypeAliasFqNameIndex - val keyMethod = instance.javaClass.getMethod("getKEY") - val key = keyMethod.invoke(instance) - @Suppress("UNCHECKED_CAST") // Reflection that will go away when our minimum version is >= 2023.2 - return key as StubIndexKey -} diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightTreeStructureProvider.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightTreeStructureProvider.kt index 7c045ae00b4..2dac9241043 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightTreeStructureProvider.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightTreeStructureProvider.kt @@ -91,7 +91,7 @@ internal class SqlDelightTreeStructureProvider( return virtualFile } - override fun getData(selected: MutableCollection>, dataId: String): Any? { + override fun getData(selected: MutableCollection>, dataId: String): Any? { if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.`is`(dataId)) { if (selected.any { it is SqlDelightPackageNode }) { return SqlDelightDeleteProvider(selected) diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddOptimisticLockIntention.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddOptimisticLockIntention.kt index 0cf5d84e147..10788c797b1 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddOptimisticLockIntention.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddOptimisticLockIntention.kt @@ -45,9 +45,7 @@ class AddOptimisticLockIntention( val whereClause = when (updateElement) { is SqlUpdateStmt -> updateElement.expr - is SqlUpdateStmtLimited -> - updateElement.exprList - .single { it.node.treePrev.treePrev.text == "WHERE" } + is SqlUpdateStmtLimited -> updateElement.expr else -> throw IllegalStateException() } diff --git a/sqldelight-idea-plugin/src/main/resources/META-INF/plugin.xml b/sqldelight-idea-plugin/src/main/resources/META-INF/plugin.xml index 1175181a984..a7b8cc4c7e7 100644 --- a/sqldelight-idea-plugin/src/main/resources/META-INF/plugin.xml +++ b/sqldelight-idea-plugin/src/main/resources/META-INF/plugin.xml @@ -3,7 +3,7 @@ SQLDelight Custom Languages Square, Inc. - + com.intellij.modules.lang com.intellij.java org.jetbrains.kotlin @@ -47,13 +47,14 @@ implementation="app.cash.sqldelight.intellij.GradleSystemListener"/> - + - + diff --git a/sqldelight-idea-plugin/src/test/kotlin/app/cash/sqldelight/intellij/FindUsagesTest.kt b/sqldelight-idea-plugin/src/test/kotlin/app/cash/sqldelight/intellij/FindUsagesTest.kt index 1d6ea0faa03..939ad9b650a 100644 --- a/sqldelight-idea-plugin/src/test/kotlin/app/cash/sqldelight/intellij/FindUsagesTest.kt +++ b/sqldelight-idea-plugin/src/test/kotlin/app/cash/sqldelight/intellij/FindUsagesTest.kt @@ -12,7 +12,7 @@ import com.alecstrong.sql.psi.core.psi.SqlViewName import com.google.common.truth.Truth.assertThat import com.intellij.psi.PsiReferenceExpression import com.intellij.usageView.UsageInfo -import org.jetbrains.kotlin.idea.findUsages.KotlinReferenceUsageInfo +import org.jetbrains.kotlin.idea.base.searching.usages.KotlinReferenceUsageInfo import org.jetbrains.kotlin.psi.KtReferenceExpression import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance diff --git a/test-util/build.gradle b/test-util/build.gradle index 4d36b8e889e..fc110a3b5fe 100644 --- a/test-util/build.gradle +++ b/test-util/build.gradle @@ -6,6 +6,7 @@ plugins { dependencies { api projects.sqldelightCompiler api projects.dialects.sqlite318 + api libs.sqlPsiEnvironment implementation libs.sqlPsi implementation(projects.sqldelightCompiler.environment) { diff --git a/test-util/src/main/kotlin/app/cash/sqldelight/test/util/TestEnvironment.kt b/test-util/src/main/kotlin/app/cash/sqldelight/test/util/TestEnvironment.kt index edb9b05fa71..810965a391e 100644 --- a/test-util/src/main/kotlin/app/cash/sqldelight/test/util/TestEnvironment.kt +++ b/test-util/src/main/kotlin/app/cash/sqldelight/test/util/TestEnvironment.kt @@ -5,9 +5,9 @@ import app.cash.sqldelight.core.SqlDelightDatabaseName import app.cash.sqldelight.core.SqlDelightDatabaseProperties import app.cash.sqldelight.core.SqlDelightEnvironment import app.cash.sqldelight.core.SqlDelightSourceFolder +import app.cash.sqldelight.core.annotators.OptimisticLockCompilerAnnotator import app.cash.sqldelight.core.lang.MigrationLanguage import app.cash.sqldelight.core.lang.SqlDelightLanguage -import app.cash.sqldelight.core.lang.validation.OptimisticLockValidator import app.cash.sqldelight.dialect.api.SqlDelightDialect import app.cash.sqldelight.dialects.sqlite_3_18.SqliteDialect import com.alecstrong.sql.psi.core.SqlAnnotationHolder @@ -51,7 +51,7 @@ internal class TestEnvironment( ) LanguageParserDefinitions.INSTANCE.forLanguage(SqlDelightLanguage).createParser(environment.project) LanguageParserDefinitions.INSTANCE.forLanguage(MigrationLanguage).createParser(environment.project) - environment.annotate(listOf(OptimisticLockValidator()), annotationHolder) + environment.annotate(listOf(OptimisticLockCompilerAnnotator()), annotationHolder) return environment } } From ebabf0956367fe25b64eae01097183235ae79713 Mon Sep 17 00:00:00 2001 From: Alec Kazakova <1675456+AlecKazakova@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:45:33 -0400 Subject: [PATCH 114/304] Use the extensions array instead of stream (#5127) --- .../app/cash/sqldelight/dialects/sqlite_3_18/SqliteDialect.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dialects/sqlite-3-18/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_18/SqliteDialect.kt b/dialects/sqlite-3-18/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_18/SqliteDialect.kt index 9fc5d0263b1..4f5c9e020c9 100644 --- a/dialects/sqlite-3-18/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_18/SqliteDialect.kt +++ b/dialects/sqlite-3-18/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_18/SqliteDialect.kt @@ -47,7 +47,7 @@ open class SqliteDialect : SqlDelightDialect { ApplicationManager.getApplication()?.apply { if (extensionArea.hasExtensionPoint(StubElementTypeHolderEP.EP_NAME)) { val exPoint = extensionArea.getExtensionPoint(StubElementTypeHolderEP.EP_NAME) - if (!exPoint.extensions().anyMatch { it.holderClass == SqliteTypes::class.java.name }) { + if (!exPoint.extensions.any { it.holderClass == SqliteTypes::class.java.name }) { Timber.i("Registering Stub extension point") exPoint.registerExtension( StubElementTypeHolderEP().apply { From 3a778a74abf167936ffc53a044a3f8f97557f1fd Mon Sep 17 00:00:00 2001 From: Alec Kazakova <1675456+AlecKazakova@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:48:04 -0400 Subject: [PATCH 115/304] Inline the column names for SELECT * (#5054) * Inline the column names for SELECT * * Fix select star join cases --- gradle.properties | 2 +- .../sqldelight/core/lang/util/TreeUtil.kt | 27 +++++- .../cash/sqldelight/core/QueriesTypeTest.kt | 6 +- .../core/async/AsyncQueriesTypeTest.kt | 2 +- .../core/queries/InterfaceGeneration.kt | 4 +- .../core/queries/SelectQueryFunctionTest.kt | 28 +++--- .../core/queries/SelectQueryTypeTest.kt | 88 +++++++++++++++---- .../queries/async/AsyncSelectQueryTypeTest.kt | 4 +- .../output/com/example/DataQueries.kt | 4 +- .../output/com/example/DataQueries.kt | 6 +- .../output/com/example/DataQueries.kt | 2 +- .../output/com/example/DataQueries.kt | 2 +- .../output/com/example/queries/DataQueries.kt | 13 +-- 13 files changed, 133 insertions(+), 55 deletions(-) diff --git a/gradle.properties b/gradle.properties index 09c5423dcc4..9da50da3732 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=1g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx16g -XX:MaxMetaspaceSize=4g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 GROUP=app.cash.sqldelight VERSION_NAME=2.1.0-SNAPSHOT diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt index e4447d380b8..8fc5b7a6d1e 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt @@ -43,6 +43,7 @@ import com.alecstrong.sql.psi.core.psi.mixins.ColumnDefMixin import com.intellij.lang.ASTNode import com.intellij.psi.PsiDirectory import com.intellij.psi.PsiElement +import com.intellij.psi.PsiNamedElement import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.TokenSet @@ -145,7 +146,9 @@ inline fun PsiElement.nextSiblingOfType(): T { } private fun PsiElement.rangesToReplace(): List> { - return if (this is ColumnTypeMixin && javaTypeName != null) { + return if (this is SqlCreateViewStmt) { + emptyList() + } else if (this is ColumnTypeMixin && javaTypeName != null) { listOf( Pair( first = (typeName.node.startOffset + typeName.node.textLength) until @@ -193,6 +196,28 @@ private fun PsiElement.rangesToReplace(): List> { ), ) } + } else if (this is SqlResultColumn && this.expr == null) { + listOf( + this.range to this@rangesToReplace.queryExposed().flatMap { query -> + query.columns.map { column -> + val columnElement = column.element as? PsiNamedElement ?: return@rangesToReplace emptyList() + + buildString { + if (query.table != null) { + append("${query.table!!.node.text}.") + } else { + val definition = columnElement.reference?.resolve() + if (definition?.parent is SqlCreateViewStmt) { + append("${(definition.parent as SqlCreateViewStmt).viewName.node.text}.") + } else if (definition?.parent?.parent is SqlCreateTableStmt) { + append("${(definition.parent.parent as SqlCreateTableStmt).tableName.node.text}.") + } + } + append(columnElement.node.text) + } + } + }.joinToString(separator = ", "), + ) } else { children.flatMap { it.rangesToReplace() } } diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt index bfefc192a97..4802248de22 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt @@ -201,7 +201,7 @@ class QueriesTypeTest { | | override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = | driver.executeQuery(${select.id.withUnderscores}, ""${'"'} - | |SELECT * + | |SELECT data.id, data.value | |FROM data | |WHERE id = ? | ""${'"'}.trimMargin(), mapper, 1) { @@ -533,7 +533,7 @@ class QueriesTypeTest { | | override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = | driver.executeQuery(${select.id.withUnderscores}, ""${'"'} - | |SELECT * + | |SELECT data.id, data.value | |FROM data | |WHERE id = ? | ""${'"'}.trimMargin(), mapper, 1) { @@ -832,7 +832,7 @@ class QueriesTypeTest { | | override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = | driver.executeQuery(-988_424_235, ""${'"'} - | |SELECT * + | |SELECT soupView.token, soupView.soup_token, soupView.soup_broth, soupView.soup_name | |FROM soupView | |WHERE soup_token = ? | ""${'"'}.trimMargin(), mapper, 1) { diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueriesTypeTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueriesTypeTest.kt index c2717b875f4..705a9d8e2ec 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueriesTypeTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueriesTypeTest.kt @@ -202,7 +202,7 @@ class AsyncQueriesTypeTest { | | override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = | driver.executeQuery(${select.id.withUnderscores}, ""${'"'} - | |SELECT * + | |SELECT data.id, data.value | |FROM data | |WHERE id = ? | ""${'"'}.trimMargin(), mapper, 1) { diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt index 8dfafbbf3bf..8a71e913ed5 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt @@ -831,8 +831,8 @@ class InterfaceGeneration { | | override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = | driver.executeQuery(null, - | ""${'"'}SELECT * FROM song WHERE album_id ${'$'}{ if (album_id == null) "IS" else "=" } ?""${'"'}, mapper, - | 1) { + | ""${'"'}SELECT song.title, song.track_number, song.album_id FROM song WHERE album_id ${'$'}{ if (album_id == null) "IS" else "=" } ?""${'"'}, + | mapper, 1) { | bindLong(0, album_id) | } | diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/SelectQueryFunctionTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/SelectQueryFunctionTest.kt index cea738965ea..770d9708f04 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/SelectQueryFunctionTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/SelectQueryFunctionTest.kt @@ -230,7 +230,7 @@ class SelectQueryFunctionTest { assertThat(generator.customResultTypeFunction().toString()).isEqualTo( """ |public fun selectForId(mapper: (id: kotlin.Long, value_: kotlin.collections.List) -> T): app.cash.sqldelight.Query = app.cash.sqldelight.Query(${query.id.withUnderscores}, arrayOf("data"), driver, "Test.sq", "selectForId", ""${'"'} - ||SELECT * + ||SELECT data.id, data.value ||FROM data |""${'"'}.trimMargin()) { cursor -> | mapper( @@ -263,7 +263,7 @@ class SelectQueryFunctionTest { assertThat(generator.customResultTypeFunction().toString()).isEqualTo( """ |public fun selectData(): app.cash.sqldelight.Query = app.cash.sqldelight.Query(${query.id.withUnderscores}, arrayOf("data"), driver, "Test.sq", "selectData", ""${'"'} - ||SELECT * + ||SELECT data.id ||FROM data |""${'"'}.trimMargin()) { cursor -> | cursor.getLong(0)!! @@ -308,7 +308,7 @@ class SelectQueryFunctionTest { | val goodIndexes = createArguments(count = good.size) | val badIndexes = createArguments(count = bad.size) | return driver.executeQuery(null, ""${'"'} - | |SELECT * + | |SELECT data.id | |FROM data | |WHERE id IN ${"$"}goodIndexes AND id NOT IN ${"$"}badIndexes | ""${'"'}.trimMargin(), mapper, good.size + bad.size) { @@ -394,7 +394,7 @@ class SelectQueryFunctionTest { | } | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(${query.id.withUnderscores}, ""${'"'} - | |SELECT * + | |SELECT person._id, person.first_name, person.last_name | |FROM person | |WHERE first_name = ? AND last_name = ? | ""${'"'}.trimMargin(), mapper, 2) { @@ -429,7 +429,7 @@ class SelectQueryFunctionTest { assertThat(generator.customResultTypeFunction().toString()).isEqualTo( """ |public fun selectData(): app.cash.sqldelight.Query = app.cash.sqldelight.Query(${query.id.withUnderscores}, arrayOf("data"), driver, "Test.sq", "selectData", ""${'"'} - ||SELECT * + ||SELECT data.value ||FROM data |""${'"'}.trimMargin()) { cursor -> | cursor.getDouble(0)!! @@ -459,7 +459,7 @@ class SelectQueryFunctionTest { assertThat(generator.customResultTypeFunction().toString()).isEqualTo( """ |public fun selectData(): app.cash.sqldelight.Query = app.cash.sqldelight.Query(${query.id.withUnderscores}, arrayOf("data"), driver, "Test.sq", "selectData", ""${'"'} - ||SELECT * + ||SELECT data.value ||FROM data |""${'"'}.trimMargin()) { cursor -> | cursor.getBytes(0)!! @@ -556,7 +556,7 @@ class SelectQueryFunctionTest { | bigint2: kotlin.String, | bigint3: kotlin.String?, |) -> T): app.cash.sqldelight.Query = app.cash.sqldelight.Query(${query.id.withUnderscores}, arrayOf("data"), driver, "Test.sq", "selectData", ""${'"'} - ||SELECT * + ||SELECT data.boolean0, data.boolean1, data.boolean2, data.boolean3, data.tinyint0, data.tinyint1, data.tinyint2, data.tinyint3, data.smallint0, data.smallint1, data.smallint2, data.smallint3, data.int0, data.int1, data.int2, data.int3, data.bigint0, data.bigint1, data.bigint2, data.bigint3 ||FROM data |""${'"'}.trimMargin()) { cursor -> | check(cursor is ${dialect.dialect.runtimeTypes.cursorType}) @@ -665,7 +665,7 @@ class SelectQueryFunctionTest { | timestamp0: kotlinx.datetime.Instant, | timestamp1: kotlinx.datetime.Instant?, |) -> T): app.cash.sqldelight.Query = app.cash.sqldelight.Query(${query.id.withUnderscores}, arrayOf("data"), driver, "Test.sq", "selectData", ""${'"'} - ||SELECT * + ||SELECT data.boolean0, data.boolean1, data.boolean2, data.boolean3, data.bit0, data.bit1, data.bit2, data.bit3, data.tinyint0, data.tinyint1, data.tinyint2, data.tinyint3, data.smallint0, data.smallint1, data.smallint2, data.smallint3, data.int0, data.int1, data.int2, data.int3, data.bigint0, data.bigint1, data.bigint2, data.bigint3, data.timestamp0, data.timestamp1 ||FROM data |""${'"'}.trimMargin()) { cursor -> | check(cursor is ${dialect.dialect.runtimeTypes.cursorType}) @@ -760,7 +760,7 @@ class SelectQueryFunctionTest { | timestamp0: kotlinx.datetime.Instant, | timestamp1: kotlinx.datetime.Instant?, |) -> T): app.cash.sqldelight.Query = app.cash.sqldelight.Query(${query.id.withUnderscores}, arrayOf("data"), driver, "Test.sq", "selectData", ""${'"'} - ||SELECT * + ||SELECT data.intArray, data.smallint0, data.smallint1, data.smallint2, data.smallint3, data.int0, data.int1, data.int2, data.int3, data.bigint0, data.bigint1, data.bigint2, data.bigint3, data.uuid, data.timestamp0, data.timestamp1 ||FROM data |""${'"'}.trimMargin()) { cursor -> | check(cursor is ${dialect.dialect.runtimeTypes.cursorType}) @@ -930,7 +930,7 @@ class SelectQueryFunctionTest { | val29: kotlin.Long?, | val30: kotlin.Long?, |) -> T): app.cash.sqldelight.Query = app.cash.sqldelight.Query(-1_626_977_671, arrayOf("bigTable"), driver, "Test.sq", "select", ""${'"'} - ||SELECT * + ||SELECT bigTable.val1, bigTable.val2, bigTable.val3, bigTable.val4, bigTable.val5, bigTable.val6, bigTable.val7, bigTable.val8, bigTable.val9, bigTable.val10, bigTable.val11, bigTable.val12, bigTable.val13, bigTable.val14, bigTable.val15, bigTable.val16, bigTable.val17, bigTable.val18, bigTable.val19, bigTable.val20, bigTable.val21, bigTable.val22, bigTable.val23, bigTable.val24, bigTable.val25, bigTable.val26, bigTable.val27, bigTable.val28, bigTable.val29, bigTable.val30 ||FROM bigTable |""${'"'}.trimMargin()) { cursor -> | mapper( @@ -1125,15 +1125,15 @@ class SelectQueryFunctionTest { | attr: kotlin.String?, | ordering: kotlin.Long, |) -> T): app.cash.sqldelight.Query = app.cash.sqldelight.Query(-602_300_915, arrayOf("testA"), driver, "Test.sq", "someSelect", ""${'"'} - ||SELECT * + ||SELECT testA.id, testA.status, testA.attr, ordering ||FROM ( - || SELECT *, 1 AS ordering + || SELECT testA.id, testA.status, testA.attr, 1 AS ordering || FROM testA || WHERE testA.attr IS NOT NULL || || UNION || - || SELECT *, 2 AS ordering + || SELECT testA.id, testA.status, testA.attr, 2 AS ordering || FROM testA || WHERE testA.attr IS NULL ||) @@ -1386,7 +1386,7 @@ class SelectQueryFunctionTest { assertThat(generator.customResultTypeFunction().toString()).isEqualTo( """ - |public fun selectAll(mapper: (accent_color: kotlin.String?, other_thing: kotlin.String?) -> T): app.cash.sqldelight.Query = app.cash.sqldelight.Query(${query.id.withUnderscores}, arrayOf("category"), driver, "Test.sq", "selectAll", "SELECT * FROM category") { cursor -> + |public fun selectAll(mapper: (accent_color: kotlin.String?, other_thing: kotlin.String?) -> T): app.cash.sqldelight.Query = app.cash.sqldelight.Query(${query.id.withUnderscores}, arrayOf("category"), driver, "Test.sq", "selectAll", "SELECT category.accent_color, category.other_thing FROM category") { cursor -> | check(cursor is app.cash.sqldelight.driver.jdbc.JdbcCursor) | mapper( | cursor.getString(0), diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/SelectQueryTypeTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/SelectQueryTypeTest.kt index 44b5fb3120d..07956313f8e 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/SelectQueryTypeTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/SelectQueryTypeTest.kt @@ -50,7 +50,7 @@ class SelectQueryTypeTest { |public fun insertReturning(mapper: (val1: kotlin.String?, val2: kotlin.String?) -> T): app.cash.sqldelight.ExecutableQuery = app.cash.sqldelight.Query(${query.id.withUnderscores}, driver, "Test.sq", "insertReturning", ""${'"'} ||INSERT INTO data ||VALUES ('sup', 'dude') - ||RETURNING * + ||RETURNING data.val1, data.val2 |""${'"'}.trimMargin()) { cursor -> | check(cursor is app.cash.sqldelight.driver.jdbc.JdbcCursor) | mapper( @@ -194,7 +194,7 @@ class SelectQueryTypeTest { | } | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(${query.id.withUnderscores}, ""${'"'} - | |SELECT * + | |SELECT data.id | |FROM data | |WHERE id = ? | ""${'"'}.trimMargin(), mapper, 1) { @@ -271,7 +271,7 @@ class SelectQueryTypeTest { | } | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(${query.id.withUnderscores}, ""${'"'} - | |SELECT * + | |SELECT data.id, data.value | |FROM data | |WHERE id = ? | |AND value = ? @@ -322,7 +322,7 @@ class SelectQueryTypeTest { | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult { | val idIndexes = createArguments(count = id.size) | return driver.executeQuery(null, ""${'"'} - | |SELECT * + | |SELECT data.id | |FROM data | |WHERE id IN ${"$"}idIndexes | ""${'"'}.trimMargin(), mapper, id.size) { @@ -376,7 +376,7 @@ class SelectQueryTypeTest { | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult { | val idIndexes = createArguments(count = id.size) | return driver.executeQuery(null, ""${'"'} - | |SELECT * + | |SELECT data.id, data.message | |FROM data | |WHERE id IN ${"$"}idIndexes AND message != ? AND id IN ${"$"}idIndexes | ""${'"'}.trimMargin(), mapper, 1 + id.size + id.size) { @@ -430,7 +430,7 @@ class SelectQueryTypeTest { | driver.removeListener("socialFeedItem", listener = listener) | } | - | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(null, ""${'"'}SELECT * FROM socialFeedItem WHERE message IS NOT NULL AND userId ${"$"}{ if (userId == null) "IS" else "=" } ? ORDER BY datetime(creation_time) DESC""${'"'}, mapper, 1) { + | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(null, ""${'"'}SELECT socialFeedItem.message, socialFeedItem.userId, socialFeedItem.creation_time FROM socialFeedItem WHERE message IS NOT NULL AND userId ${"$"}{ if (userId == null) "IS" else "=" } ? ORDER BY datetime(creation_time) DESC""${'"'}, mapper, 1) { | bindString(0, userId) | } | @@ -473,7 +473,7 @@ class SelectQueryTypeTest { | driver.removeListener("socialFeedItem", listener = listener) | } | - | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(${treatNullAsUnknownQuery.id.withUnderscores}, ""${'"'}SELECT * FROM socialFeedItem WHERE message IS NOT NULL AND userId = ? ORDER BY datetime(creation_time) DESC""${'"'}, mapper, 1) { + | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(${treatNullAsUnknownQuery.id.withUnderscores}, ""${'"'}SELECT socialFeedItem.message, socialFeedItem.userId, socialFeedItem.creation_time FROM socialFeedItem WHERE message IS NOT NULL AND userId = ? ORDER BY datetime(creation_time) DESC""${'"'}, mapper, 1) { | bindString(0, userId) | } | @@ -633,7 +633,7 @@ class SelectQueryTypeTest { | } | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(null, ""${'"'} - | |SELECT * + | |SELECT data.id, data.val | |FROM data | |WHERE val ${"$"}{ if (val_ == null) "IS" else "=" } ? | |AND val ${"$"}{ if (val__ == null) "IS" else "==" } ? @@ -701,7 +701,7 @@ class SelectQueryTypeTest { | } | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(${nullAsUnknownQuery.id.withUnderscores}, ""${'"'} - | |SELECT * + | |SELECT data.id, data.val | |FROM data | |WHERE val = ? | |AND val == ? @@ -760,7 +760,7 @@ class SelectQueryTypeTest { | } | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(${query.id.withUnderscores}, ""${'"'} - | |SELECT * + | |SELECT data.content | |FROM data | |WHERE data MATCH ? AND rowid = ? | ""${'"'}.trimMargin(), mapper, 2) { @@ -811,7 +811,7 @@ class SelectQueryTypeTest { | } | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(${query.id.withUnderscores}, ""${'"'} - | |SELECT * + | |SELECT data.content | |FROM data | |WHERE data MATCH '"one ' || ? || '" * ' | ""${'"'}.trimMargin(), mapper, 1) { @@ -869,7 +869,7 @@ class SelectQueryTypeTest { | val idIndexes = createArguments(count = id.size) | val token_Indexes = createArguments(count = token_.size) | return driver.executeQuery(null, ""${'"'} - | |SELECT * + | |SELECT data.id, data.token, data.name | |FROM data | |WHERE token = ? | | AND id IN ${"$"}idIndexes @@ -936,7 +936,7 @@ class SelectQueryTypeTest { | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(null, ""${'"'} | |WITH child_ids AS (SELECT id FROM data WHERE id ${'$'}{ if (id == null) "IS" else "=" } ?) - | |SELECT * + | |SELECT data.id | |FROM data | |WHERE id ${'$'}{ if (id == null) "IS" else "=" } ? OR id IN child_ids | |LIMIT ? @@ -994,7 +994,7 @@ class SelectQueryTypeTest { | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(${nullAsUnknownQuery.id.withUnderscores}, ""${'"'} | |WITH child_ids AS (SELECT id FROM data WHERE id = ?) - | |SELECT * + | |SELECT data.id | |FROM data | |WHERE id = ? OR id IN child_ids | |LIMIT ? @@ -1050,7 +1050,7 @@ class SelectQueryTypeTest { | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult { | val idIndexes = createArguments(count = id.size) | return driver.executeQuery(null, ""${'"'} - | |SELECT * + | |SELECT data.id | |FROM data | |WHERE id IN ${'$'}idIndexes | ""${'"'}.trimMargin(), mapper, id.size) { @@ -1116,7 +1116,7 @@ class SelectQueryTypeTest { | } | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(null, ""${'"'} - | |SELECT * + | |SELECT data.token | |FROM data | |WHERE token ${"$"}{ if (token == null) "IS" else "=" } ? OR ? IS NULL | ""${'"'}.trimMargin(), mapper, 2) { @@ -1165,7 +1165,7 @@ class SelectQueryTypeTest { | } | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(${nullAsUnknownQuery.id.withUnderscores}, ""${'"'} - | |SELECT * + | |SELECT data.token | |FROM data | |WHERE token = ? OR ? IS NULL | ""${'"'}.trimMargin(), mapper, 2) { @@ -1998,7 +1998,7 @@ class SelectQueryTypeTest { | } | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(841_750_630, ""${'"'} - | |SELECT * + | |SELECT multi.id, multi.name | |FROM multi | |WHERE (id, name) > (?, ?) | ""${'"'}.trimMargin(), mapper, 2) { @@ -2012,4 +2012,56 @@ class SelectQueryTypeTest { """.trimMargin(), ) } + + @Test + fun `expand select star across join`() { + val file = FixtureCompiler.parseSql( + """ + |CREATE TABLE `player`( + | id INTEGER NOT NULL PRIMARY KEY, + | name TEXT NOT NULL, + | team_id INTEGER NOT NULL + |); + | + |CREATE TABLE `team`( + | id INTEGER NOT NULL PRIMARY KEY, + | name TEXT NOT NULL + |); + | + |selectAll: + |SELECT * + |FROM `player` + |JOIN `team` ON team_id = `team`.id; + """.trimMargin(), + tempFolder, + ) + + val select = file.namedQueries.first() + val generator = SelectQueryGenerator(select) + + assertThat(generator.querySubtype().toString()).isEqualTo( + """ + |private inner class SelectAllQuery( + | mapper: (app.cash.sqldelight.db.SqlCursor) -> T, + |) : app.cash.sqldelight.Query(mapper) { + | override fun addListener(listener: app.cash.sqldelight.Query.Listener) { + | driver.addListener("player", "team", listener = listener) + | } + | + | override fun removeListener(listener: app.cash.sqldelight.Query.Listener) { + | driver.removeListener("player", "team", listener = listener) + | } + | + | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(-585_795_480, ""${'"'} + | |SELECT `player`.id, `player`.name, `player`.team_id, `team`.id, `team`.name + | |FROM `player` + | |JOIN `team` ON team_id = `team`.id + | ""${'"'}.trimMargin(), mapper, 0) + | + | override fun toString(): kotlin.String = "Test.sq:selectAll" + |} + | + """.trimMargin(), + ) + } } diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/async/AsyncSelectQueryTypeTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/async/AsyncSelectQueryTypeTest.kt index 0fcfd064053..3e1c3ef8e06 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/async/AsyncSelectQueryTypeTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/async/AsyncSelectQueryTypeTest.kt @@ -43,7 +43,7 @@ class AsyncSelectQueryTypeTest { |public fun insertReturning(mapper: (val1: kotlin.String?, val2: kotlin.String?) -> T): app.cash.sqldelight.ExecutableQuery = app.cash.sqldelight.Query(${query.id.withUnderscores}, driver, "Test.sq", "insertReturning", ""${'"'} ||INSERT INTO data ||VALUES ('sup', 'dude') - ||RETURNING * + ||RETURNING data.val1, data.val2 |""${'"'}.trimMargin()) { cursor -> | check(cursor is app.cash.sqldelight.driver.r2dbc.R2dbcCursor) | mapper( @@ -141,7 +141,7 @@ class AsyncSelectQueryTypeTest { | } | | override fun execute(mapper: (app.cash.sqldelight.db.SqlCursor) -> app.cash.sqldelight.db.QueryResult): app.cash.sqldelight.db.QueryResult = driver.executeQuery(${query.id.withUnderscores}, ""${'"'} - | |SELECT * + | |SELECT data.id | |FROM data | |WHERE id = ? | ""${'"'}.trimMargin(), mapper, 1) { diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/DataQueries.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/DataQueries.kt index 2efd52acdfb..899526dd772 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/DataQueries.kt +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-add-constraint/output/com/example/DataQueries.kt @@ -13,7 +13,7 @@ public class DataQueries( ) : TransacterImpl(driver) { public fun selectSingle(mapper: (first: Int, second: String?) -> T): Query = Query(-79_317_191, arrayOf("TestSingle"), driver, "Data.sq", "selectSingle", """ - |SELECT * + |SELECT TestSingle.first, TestSingle.second |FROM TestSingle """.trimMargin()) { cursor -> check(cursor is JdbcCursor) @@ -32,7 +32,7 @@ public class DataQueries( public fun selectCompound(mapper: (first: Int, second: String) -> T): Query = Query(-19_725_220, arrayOf("TestCompound"), driver, "Data.sq", "selectCompound", """ - |SELECT * + |SELECT TestCompound.first, TestCompound.second |FROM TestCompound """.trimMargin()) { cursor -> check(cursor is JdbcCursor) diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt index fac30fff96c..37fa888832e 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-alter-column/output/com/example/DataQueries.kt @@ -16,7 +16,7 @@ public class DataQueries( ) : TransacterImpl(driver) { public fun select(): Query = Query(-1_042_942_063, arrayOf("test3"), driver, "Data.sq", "select", """ - |SELECT * + |SELECT test3.alpha |FROM test3 """.trimMargin()) { cursor -> check(cursor is JdbcCursor) @@ -33,8 +33,8 @@ public class DataQueries( mapper: (SqlCursor) -> T, ) : ExecutableQuery(mapper) { override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = - driver.executeQuery(-1_320_712_882, """INSERT INTO test3 (alpha) VALUES (?) RETURNING *""", - mapper, 1) { + driver.executeQuery(-1_320_712_882, + """INSERT INTO test3 (alpha) VALUES (?) RETURNING test3.alpha""", mapper, 1) { check(this is JdbcPreparedStatement) bindString(0, test3.alpha) } diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/DataQueries.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/DataQueries.kt index 93131ebc5f5..5d52f52b955 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/DataQueries.kt +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table-rename-column-sqlite/output/com/example/DataQueries.kt @@ -10,7 +10,7 @@ public class DataQueries( ) : TransacterImpl(driver) { public fun select(): Query = Query(-1_042_942_063, arrayOf("test"), driver, "Data.sq", "select", """ - |SELECT * + |SELECT test.alpha | FROM test """.trimMargin()) { cursor -> cursor.getString(0)!! diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table/output/com/example/DataQueries.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table/output/com/example/DataQueries.kt index f39b52f74fc..cc7cdbcb607 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table/output/com/example/DataQueries.kt +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/alter-table/output/com/example/DataQueries.kt @@ -14,7 +14,7 @@ public class DataQueries( ) : TransacterImpl(driver) { public fun migrationSelect(mapper: (first: String, second: List?) -> T): Query = Query(-561_113_227, arrayOf("new_test"), driver, "Data.sq", "migrationSelect", """ - |SELECT * + |SELECT new_test.first, new_test.second |FROM new_test """.trimMargin()) { cursor -> mapper( diff --git a/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/queries/DataQueries.kt b/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/queries/DataQueries.kt index a7d79d84bea..5a9de056534 100644 --- a/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/queries/DataQueries.kt +++ b/sqldelight-compiler/src/test/migration-interface-fixtures/varying-query-migration-packages/output/com/example/queries/DataQueries.kt @@ -18,7 +18,7 @@ public class DataQueries( ) : TransacterImpl(driver) { public fun migrationSelect(mapper: (first: String, second: Int) -> T): Query = Query(-1_568_224_787, arrayOf("test"), driver, "Data.sq", "migrationSelect", """ - |SELECT * + |SELECT test.first, test.second |FROM test """.trimMargin()) { cursor -> check(cursor is JdbcCursor) @@ -96,7 +96,8 @@ public class DataQueries( ) : ExecutableQuery(mapper) { override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = driver.executeQuery(-1_845_995_606, - """INSERT INTO test(first, second) VALUES (?, ?) RETURNING *""", mapper, 2) { + """INSERT INTO test(first, second) VALUES (?, ?) RETURNING test.first, test.second""", + mapper, 2) { check(this is JdbcPreparedStatement) bindString(0, first) bindInt(1, second) @@ -110,8 +111,8 @@ public class DataQueries( mapper: (SqlCursor) -> T, ) : ExecutableQuery(mapper) { override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = - driver.executeQuery(-1_997_661_540, """DELETE FROM test WHERE first = ? RETURNING *""", - mapper, 1) { + driver.executeQuery(-1_997_661_540, + """DELETE FROM test WHERE first = ? RETURNING test.first, test.second""", mapper, 1) { check(this is JdbcPreparedStatement) bindString(0, first) } @@ -124,8 +125,8 @@ public class DataQueries( mapper: (SqlCursor) -> T, ) : ExecutableQuery(mapper) { override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = - driver.executeQuery(-1_501_049_414, """UPDATE test SET first = ? RETURNING *""", mapper, 1) - { + driver.executeQuery(-1_501_049_414, + """UPDATE test SET first = ? RETURNING test.first, test.second""", mapper, 1) { check(this is JdbcPreparedStatement) bindString(0, first) } From a82c18430fd2cdb7543a0740f1a833f58858adb7 Mon Sep 17 00:00:00 2001 From: Alec Kazakova Date: Fri, 5 Apr 2024 17:10:55 -0400 Subject: [PATCH 116/304] Prepare for release 2.0.2 --- CHANGELOG.md | 40 ++++++++++++++++++++++++++++++++++++++++ gradle.properties | 3 ++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b25218404f9..92ea1c401d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,44 @@ # Change Log +## [2.0.2] - 2024-04-05 + +### Added +- [PostgreSQL Dialect] Add PostgreSQL STRING_AGG function (#4950 by [André Danielsson][anddani]) +- [PostgreSQL Dialect] Add SET statement to pg dialect (#4927 by [Bastien de Luca][de-luca]) +- [PostgreSQL Dialect] Add PostgreSql alter column sequence parameters (#4916 by [Griffio][griffio]) +- [PostgreSQL Dialect] Add postgresql alter column default support for insert statement (#4912 by [Griffio][griffio]) +- [PostgreSQL Dialect] Add PostgreSql alter sequence and drop sequence (#4920 by [Griffio][griffio]) +- [PostgreSQL Dialect] Add Postgres Regex function definitions (#5025 by [Marius Volkhart][MariusV]) +- [PostgreSQL Dialect] Add grammar for GIN (#5027 by [Griffio][griffio]) + +### Changed +- [IDE Plugin] Minimum version of 2023.1 / Android Studio Iguana +- [Compiler] Allow overriding the type nullability in encapsulatingType (#4882 by [Eliezer Graber][eygraber]) +- [Compiler] Inline the column names for SELECT * +- [Gradle Plugin] switch to processIsolation (#5068 by [Emeka Nwagu][nwagu]) +- [Android Runtime] Increase Android minSDK to 21 (#5094 by [Philip Wedemann][hfhbd]) +- [Drivers] Expose more JDBC/R2DBC statement methods for dialect authors (#5098 by [Philip Wedemann][hfhbd]) + +### Fixed +- [PostgreSQL Dialect] Fix postgresql alter table alter column (#4868 by [Griffio][griffio]) +- [PostgreSQL Dialect] Fix 4448 missing import for table model (#4885 by [Griffio][griffio]) +- [PostgreSQL Dialect] Fixes 4932 postgresql default constraint functions (#4934 by [Griffio][griffio]) +- [PostgreSQL Dialect] fixes 4879 postgresql class-cast error in alter table rename column during migrations (#4880 by [Griffio][griffio]) +- [PostgreSQL Dialect] Fix 4474 PostgreSql create extension (#4541 by [Griffio][griffio]) +- [PostgreSQL Dialect] Fixes 5018 PostgreSql add Primary Key not nullable types (#5020 by [Griffio][griffio]) +- [PostgreSQL Dialect] Fixes 4703 aggregate expressions (#5071 by [Griffio][griffio]) +- [PostgreSQL Dialect] Fixes 5028 PostgreSql json (#5030 by [Griffio][griffio]) +- [PostgreSQL Dialect] Fixes 5040 PostgreSql json operators (#5041 by [Griffio][griffio]) +- [PostgreSQL Dialect] Fixes json operator binding for 5040 (#5100 by [Griffio][griffio]) +- [PostgreSQL Dialect] Fixes 5082 tsvector (#5104 by [Griffio][griffio]) +- [PostgreSQL Dialect] Fixes 5032 column adjacency for PostgreSql UPDATE FROM statement (#5035 by [Griffio][griffio]) +- [SQLite Dialect] fixes 4897 sqlite alter table rename column (#4899 by [Griffio][griffio]) +- [IDE Plugin] Fix error handler crash (#4988 by [Alexander Perfilyev][aperfilyev]) +- [IDE Plugin] BugSnag fails to init in IDEA 2023.3 (by [Alexander Perfilyev][aperfilyev]) +- [IDE Plugin] PluginException when opening .sq file in IntelliJ via plugin (by [Alexander Perfilyev][aperfilyev]) +- [IDE Plugin] Dont bundle the kotlin lib into the intellij plugin as its already a plugin dependency (#5126) +- [IDE Plugin] Use the extensions array instead of stream (#5127) + ## [2.0.1] - 2023-12-01 ### Added @@ -1042,3 +1081,4 @@ Initial release. [BoD]: https://github.com/BoD [de-luca]: https://github.com/de-luca [MohamadJaara]: https://github.com/MohamadJaara + [nwagu]: https://github.com/nwagu diff --git a/gradle.properties b/gradle.properties index 9da50da3732..91503958f55 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.jvmargs=-Xmx16g -XX:MaxMetaspaceSize=4g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 GROUP=app.cash.sqldelight -VERSION_NAME=2.1.0-SNAPSHOT +VERSION_NAME=2.0.2 POM_URL=https://github.com/cashapp/sqldelight/ POM_SCM_URL=https://github.com/cashapp/sqldelight/ @@ -16,6 +16,7 @@ POM_DEVELOPER_NAME=Square, Inc. SONATYPE_HOST=DEFAULT RELEASE_SIGNING_ENABLED=true +SONATYPE_AUTOMATIC_RELEASE=true android.useAndroidX=true From d3a9def082a836bbd3781b7ccfa0f3fde537968a Mon Sep 17 00:00:00 2001 From: Alec Kazakova Date: Fri, 5 Apr 2024 17:11:11 -0400 Subject: [PATCH 117/304] Prepare next development version. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 91503958f55..e2bd8936e3a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.jvmargs=-Xmx16g -XX:MaxMetaspaceSize=4g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 GROUP=app.cash.sqldelight -VERSION_NAME=2.0.2 +VERSION_NAME=2.1.0-SNAPSHOT POM_URL=https://github.com/cashapp/sqldelight/ POM_SCM_URL=https://github.com/cashapp/sqldelight/ From 4f426e3ba4120034d6b519b99c6e4f656bad1024 Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Sun, 7 Apr 2024 13:59:53 +0200 Subject: [PATCH 118/304] Fix local Gradle execution without a BuildScan (#5132) --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index 8a98426ef7e..7373f516381 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -26,7 +26,7 @@ develocity { termsOfUseUrl = 'https://gradle.com/terms-of-service' termsOfUseAgree = 'yes' publishing { - onlyIf { System.getenv("CI") } + onlyIf { System.getenv("CI") != null } } tag "CI" } diff --git a/sample/settings.gradle b/sample/settings.gradle index 7077281e8a2..079b0073b75 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -26,7 +26,7 @@ develocity { termsOfUseUrl = 'https://gradle.com/terms-of-service' termsOfUseAgree = 'yes' publishing { - onlyIf { System.getenv("CI") } + onlyIf { System.getenv("CI") != null } } tag "CI" } diff --git a/settings.gradle b/settings.gradle index 8824087b2a2..b13aeec238d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -18,7 +18,7 @@ develocity { termsOfUseUrl = 'https://gradle.com/terms-of-service' termsOfUseAgree = 'yes' publishing { - onlyIf { System.getenv("CI") } + onlyIf { System.getenv("CI") != null } } tag "CI" } From 0a62baa2f3ad6dc7f4b8fcace00e82fcd04be0e7 Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Sun, 7 Apr 2024 14:00:04 +0200 Subject: [PATCH 119/304] CI: Check for changed files (#5133) * CI: Check for changed files * Fix sqldelight-compiler:integration-tests --- .github/workflows/PR.yml | 3 +++ .../src/test/kotlin/com/example/GroupQueries.kt | 2 +- .../src/test/kotlin/com/example/PlayerQueries.kt | 10 +++++----- .../src/test/kotlin/com/example/TeamQueries.kt | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index b65d9bea593..161f076e057 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -97,6 +97,9 @@ jobs: if: matrix.os == 'macOS-14' && matrix.job == 'test' run: ./gradlew iosX64Test --stacktrace --parallel + - name: Check for changed files + run: test -z "$(git status --porcelain)" + verify_intellij: runs-on: ubuntu-latest diff --git a/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/GroupQueries.kt b/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/GroupQueries.kt index 0e0ba005079..77f985fb6dd 100644 --- a/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/GroupQueries.kt +++ b/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/GroupQueries.kt @@ -17,7 +17,7 @@ public class GroupQueries( public fun selectFromTable2(mapper: (something: String?, nice: String?) -> T): Query = Query(-620_576_550, arrayOf("myftstable2"), driver, "Group.sq", "selectFromTable2", """ - |SELECT * + |SELECT myftstable2.something, myftstable2.nice |FROM myftstable2 """.trimMargin()) { cursor -> mapper( diff --git a/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/PlayerQueries.kt b/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/PlayerQueries.kt index 2d214202543..40be2dca8ea 100644 --- a/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/PlayerQueries.kt +++ b/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/PlayerQueries.kt @@ -60,7 +60,7 @@ public class PlayerQueries( shoots: Shoots, ) -> T): Query = Query(-1_634_440_035, arrayOf("player"), driver, "Player.sq", "allPlayers", """ - |SELECT * + |SELECT player.name, player.number, player.team, player.shoots |FROM player """.trimMargin()) { cursor -> mapper( @@ -248,7 +248,7 @@ public class PlayerQueries( bindString(3, playerAdapter.shootsAdapter.encode(shoots)) } driver.executeQuery(-452_007_404, """ - |SELECT * + |SELECT player.name, player.number, player.team, player.shoots | FROM player | WHERE player.rowid = last_insert_rowid() """.trimMargin(), mapper, 0) @@ -271,7 +271,7 @@ public class PlayerQueries( override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = driver.executeQuery(null, """ - |SELECT * + |SELECT player.name, player.number, player.team, player.shoots |FROM player |WHERE team ${ if (team == null) "IS" else "=" } ? """.trimMargin(), mapper, 1) { @@ -296,7 +296,7 @@ public class PlayerQueries( override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult { val numberIndexes = createArguments(count = number.size) return driver.executeQuery(null, """ - |SELECT * + |SELECT player.name, player.number, player.team, player.shoots |FROM player |WHERE number IN $numberIndexes """.trimMargin(), mapper, number.size) { @@ -324,7 +324,7 @@ public class PlayerQueries( override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = driver.executeQuery(-1_258_650_806, """ - |SELECT * + |SELECT player.name, player.number, player.team, player.shoots |FROM player |WHERE (number, name) > (?, ?) """.trimMargin(), mapper, 2) { diff --git a/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/TeamQueries.kt b/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/TeamQueries.kt index 256d570c997..7da740190ee 100644 --- a/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/TeamQueries.kt +++ b/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/TeamQueries.kt @@ -109,7 +109,7 @@ public class TeamQueries( override fun execute(mapper: (SqlCursor) -> QueryResult): QueryResult = driver.executeQuery(null, """ - |SELECT * + |SELECT team.name, team.captain, team.inner_type, team.coach |FROM team |WHERE inner_type ${ if (inner_type == null) "IS" else "=" } ? """.trimMargin(), mapper, 1) { From 54442545295fdb9f87c8691d61f9c51345dc63eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 8 Apr 2024 15:52:15 +0100 Subject: [PATCH 120/304] Fixes 5059 add brin gist (#5124) * Update CREATE INDEX grammar Add operator classes e.g jsonb_ops Add index method e.g GIST Add storage parameters e.g fastupdate * Add CreateIndexMixin For annotation Currently validates the storage parameters * Update CREATE INDEX fixture tests Update Sample.s * Remove braces --- .../postgresql/grammar/PostgreSql.bnf | 11 +- .../grammar/mixins/CreateIndexMixin.kt | 146 ++++++++++++++++++ .../fixtures_postgresql/create-index/Sample.s | 46 +++++- 3 files changed, 197 insertions(+), 6 deletions(-) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CreateIndexMixin.kt diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 653d050d6dd..a2fca6faceb 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -169,17 +169,20 @@ table_constraint ::= [ CONSTRAINT {identifier} ] ( override = true } -gin_operator_class_stmt ::= 'array_ops' | 'jsonb_ops' | 'jsonb_path_ops' | 'tsvector_ops' +operator_class_stmt ::= {identifier} [ LP {identifier} EQ ( {identifier} | {numeric_literal} ) { RP ] +storage_parameter ::= TRUE | FALSE | 'ON' | 'OFF' | {identifier} | {numeric_literal} +storage_parameters ::= 'autosummarize' | 'buffering' | 'deduplicate_items' | 'fastupdate' | 'fillfactor' | 'gin_pending_list_limit' | 'pages_per_range' +with_storage_parameter ::= WITH LP storage_parameters EQ ( storage_parameter ) ( COMMA storage_parameters EQ ( storage_parameter ) ) * RP +index_method ::= 'BRIN' | 'BTREE' | 'GIN' | 'GIST' | 'HASH' create_index_stmt ::= CREATE [ UNIQUE ] INDEX [ 'CONCURRENTLY' ] [ IF NOT EXISTS ] [ {database_name} DOT ] {index_name} ON {table_name} - ( USING 'GIN' LP {indexed_column} [ gin_operator_class_stmt ] ( COMMA {indexed_column} [ gin_operator_class_stmt ] ) * RP | LP {indexed_column} ( COMMA {indexed_column} ) * RP [ WHERE <> ] ) { + ( USING index_method LP {indexed_column} [ operator_class_stmt ] ( COMMA {indexed_column} [ operator_class_stmt ] ) * RP [ with_storage_parameter ] | LP {indexed_column} [ operator_class_stmt ] ( COMMA {indexed_column} [ operator_class_stmt ] ) * RP [ WHERE <> ] ) { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.CreateIndexMixin" extends = "com.alecstrong.sql.psi.core.psi.impl.SqlCreateIndexStmtImpl" - implements = "com.alecstrong.sql.psi.core.psi.SqlGeneratedClause" override = true pin = 6 } - identity_clause ::= 'IDENTITY' [ LP [ 'SEQUENCE' 'NAME' sequence_name ] [ sequence_parameters* ] RP ] generated_clause ::= GENERATED ( (ALWAYS AS LP <> RP 'STORED') | ( (ALWAYS | BY DEFAULT) AS identity_clause ) ) { diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CreateIndexMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CreateIndexMixin.kt new file mode 100644 index 00000000000..e7f42e3bc1f --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CreateIndexMixin.kt @@ -0,0 +1,146 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlCreateIndexStmt +import com.alecstrong.sql.psi.core.SqlAnnotationHolder +import com.alecstrong.sql.psi.core.psi.impl.SqlCreateIndexStmtImpl +import com.intellij.lang.ASTNode +import com.intellij.psi.PsiElement +/** + * Storage parameter list 'autosummarize' | 'buffering' | 'deduplicate_items' | 'fastupdate' | 'fillfactor' | 'gin_pending_list_limit' | 'pages_per_range' + * btree, hash, gist = [fillfactor (10-100) ] + * btree = [deduplicate_items (0|1|on|off|true|false)] + * gist = [buffering (auto|on|off)] + * gin = [fastupdate (on|off|true|false), gin_pending_list_limit (64-2147483647) ] + * brin = [autosummarize (on|off|true|false), pages_per_range (1-2147483647) ] + */ +internal abstract class CreateIndexMixin(node: ASTNode) : + SqlCreateIndexStmtImpl(node), PostgreSqlCreateIndexStmt { + + override fun annotate(annotationHolder: SqlAnnotationHolder) { + withStorageParameter?.let { wsp -> + wsp.storageParametersList.zip(wsp.storageParameterList).forEach { + sp -> + indexMethod?.let { im -> + when (im.text.lowercase()) { + "brin" -> when (sp.first.text) { + "autosummarize" -> autoSummarize(sp.second, annotationHolder) + "pages_per_range" -> pagesPerRange(sp.second, annotationHolder) + else -> unrecongizedParameter(sp.first, annotationHolder) + } + "btree" -> when (sp.first.text) { + "fillfactor" -> fillFactor(sp.second, annotationHolder) + "deduplicate_items" -> deduplicateItems(sp.second, annotationHolder) + else -> unrecongizedParameter(sp.first, annotationHolder) + } + "gin" -> when (sp.first.text) { + "fastupdate" -> fastUpdate(sp.second, annotationHolder) + "gin_pending_list_limit" -> ginPendingListLimit(sp.second, annotationHolder) + else -> unrecongizedParameter(sp.first, annotationHolder) + } + "gist" -> when (sp.first.text) { + "fillfactor" -> fillFactor(sp.second, annotationHolder) + "buffering" -> buffering(sp.second, annotationHolder) + else -> unrecongizedParameter(sp.first, annotationHolder) + } + "hash" -> when (sp.first.text) { + "fillfactor" -> fillFactor(sp.second, annotationHolder) + else -> unrecongizedParameter(sp.first, annotationHolder) + } + } + } + } + } + super.annotate(annotationHolder) + } + + companion object { + + private val pgBooleans = listOf("1", "0", "on", "off", "true", "false") + + fun autoSummarize(input: PsiElement, annotationHolder: SqlAnnotationHolder) { + input.text.let { value -> + if (value.lowercase() !in pgBooleans) { + annotationHolder.createErrorAnnotation( + input, + """invalid value for boolean option "autosummarize" $value""", + ) + } + } + } + + fun buffering(input: PsiElement, annotationHolder: SqlAnnotationHolder) { + input.text.let { value -> + if (value.lowercase() !in listOf("auto", "on", "off")) { + annotationHolder.createErrorAnnotation( + input, + """invalid value for enum option "buffering" $value""", + ) + } + } + } + + fun deduplicateItems(input: PsiElement, annotationHolder: SqlAnnotationHolder) { + input.text.let { value -> + if (value.lowercase() !in pgBooleans) { + annotationHolder.createErrorAnnotation( + input, + """invalid value for boolean option "deduplicate_items" $value""", + ) + } + } + } + + fun fastUpdate(input: PsiElement, annotationHolder: SqlAnnotationHolder) { + input.text.let { value -> + if (value.lowercase() !in pgBooleans) { + annotationHolder.createErrorAnnotation( + input, + """invalid value for boolean option "fastupdate" $value""", + ) + } + } + } + + fun fillFactor(input: PsiElement, annotationHolder: SqlAnnotationHolder) { + input.text.toInt().let { value -> + if (value !in 10..100) { + annotationHolder.createErrorAnnotation( + input, + """value $value out of bounds for option "fillfactor"""", + ) + } + } + } + + fun ginPendingListLimit(input: PsiElement, annotationHolder: SqlAnnotationHolder) { + input.text.toInt().let { value -> + if (value !in 64..Int.MAX_VALUE) { + annotationHolder.createErrorAnnotation( + input, + """value $value out of bounds for option "gin_pending_list_limit"""", + ) + } + } + } + + fun pagesPerRange(input: PsiElement, annotationHolder: SqlAnnotationHolder) { + input.text.toInt().let { value -> + if (value !in 1..Int.MAX_VALUE) { + annotationHolder.createErrorAnnotation( + input, + """value $value out of bounds for option "pages_per_range"""", + ) + } + } + } + + fun unrecongizedParameter(input: PsiElement, annotationHolder: SqlAnnotationHolder) { + input.text.let { parameter -> + annotationHolder.createErrorAnnotation( + input, + """unrecognized parameter "$parameter"""", + ) + } + } + } +} diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/create-index/Sample.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/create-index/Sample.s index 175fc0395cb..c8acbaac397 100644 --- a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/create-index/Sample.s +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/create-index/Sample.s @@ -7,14 +7,56 @@ CREATE TABLE abg ( CREATE INDEX CONCURRENTLY beta_gamma_idx ON abg (beta, gamma); +CREATE INDEX gamma_index_name ON abg (gamma) WHERE beta = 'some_value'; + +CREATE INDEX alpha_index_name ON abg USING BTREE (alpha) WITH (fillfactor = 70, deduplicate_items = on); + +CREATE INDEX beta_gamma_index_name ON abg USING HASH (beta) WITH (fillfactor = 20); +-- error[col 87]: invalid value for boolean option "deduplicate_items" yes +CREATE INDEX alpha_index_name_err ON abg USING BTREE (alpha) WITH (deduplicate_items = yes); +-- error[col 83]: value 1 out of bounds for option "fillfactor" +CREATE INDEX beta_gamma_index_name_err ON abg USING HASH (beta) WITH (fillfactor = 1); +-- error[col 76]: unrecognized parameter "autosummarize" +CREATE INDEX beta_gamma_index_name_err_param ON abg USING HASH (beta) WITH (autosummarize = off); CREATE TABLE json_gin( alpha JSONB, beta JSONB ); +CREATE TABLE json_gist( + alpha JSONB, + beta JSONB +); + +CREATE TABLE text_search( + alpha TSVECTOR, + beta TEXT +); + CREATE INDEX gin_alpha_1 ON json_gin USING GIN (alpha); CREATE INDEX gin_alpha_beta_2 ON json_gin USING GIN (alpha, beta); CREATE INDEX gin_alpha_beta_3 ON json_gin USING GIN (alpha jsonb_ops, beta); -CREATE INDEX gin_alpha_beta_4 ON json_gin USING GIN (alpha, beta jsonb_path_ops); -CREATE INDEX gin_alpha_beta_5 ON json_gin USING GIN (alpha jsonb_path_ops, beta jsonb_ops); +CREATE INDEX gin_alpha_beta_4 ON json_gin USING GIN (alpha, beta jsonb_path_ops) WITH (fastupdate = off); +CREATE INDEX gin_alpha_beta_5 ON json_gin USING GIN (alpha jsonb_path_ops, beta jsonb_ops) WITH (gin_pending_list_limit = 2048); + +CREATE INDEX gist_alpha_1 ON text_search USING GIST (alpha) WITH (fillfactor = 75); +CREATE INDEX gist_alpha_2 ON text_search USING GIST (alpha) WITH (buffering = on); + +CREATE INDEX tsv_gist_alpha_1 ON text_search USING GIST (alpha); +CREATE INDEX tsv_gin_alpha_1 ON text_search USING GIN (alpha); +CREATE INDEX trgm_gist_beta_1 ON text_search USING GIST (beta gist_trgm_ops(siglen=32)); +CREATE INDEX trgm_gist_beta_2 ON text_search USING GIN (beta gin_trgm_ops); + +CREATE INDEX beta_index ON text_search (beta varchar_pattern_ops); + +CREATE INDEX ts_brin_beta_1 ON text_search USING BRIN (beta) WITH (autosummarize = on, pages_per_range = 6); + +-- error[col 128]: value 1 out of bounds for option "gin_pending_list_limit" +CREATE INDEX gin_alpha_beta_error_1 ON json_gin USING GIN (alpha jsonb_path_ops, beta jsonb_ops) WITH (gin_pending_list_limit = 1); +-- error[col 106]: invalid value for boolean option "fastupdate" yes +CREATE INDEX gin_alpha_beta_error_2 ON json_gin USING GIN (alpha, beta jsonb_path_ops) WITH (fastupdate = yes); +-- error[col 91]: value 0 out of bounds for option "pages_per_range" +CREATE INDEX ts_brin_beta_error_1 ON text_search USING BRIN (beta) WITH (pages_per_range = 0); +-- error[col 87]: invalid value for boolean option "autosummarize" no +CREATE INDEX ts_brin_beta_error_2 ON text_search USING BRIN (beta) WITH (autosummarize=no); From cfe7ed7143d8f21c6bf699f787f6df2928395b70 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 07:22:09 -0400 Subject: [PATCH 121/304] Update agp to v8.3.2 (#5144) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dbfbf0d6cc0..78700932587 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.2.1" -agp = "8.3.1" +agp = "8.3.2" compileSdk = "34" minSdk = "21" sqlPsi = "0.4.9" From 5d8ba425c5216300c2b0e814d3d51ba4920a52d6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:42:36 +0000 Subject: [PATCH 122/304] Update dependency org.postgresql:r2dbc-postgresql to v1.0.5.RELEASE (#5145) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../src/test/integration-postgresql-async/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle b/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle index 6ac609cda6d..7d38ce10a69 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql-async/build.gradle @@ -17,7 +17,7 @@ dependencies { implementation libs.postgresJdbc implementation libs.testContainers.postgres implementation libs.testContainers.r2dbc - implementation "org.postgresql:r2dbc-postgresql:1.0.4.RELEASE" + implementation "org.postgresql:r2dbc-postgresql:1.0.5.RELEASE" implementation "app.cash.sqldelight:r2dbc-driver:${app.cash.sqldelight.VersionKt.VERSION}" implementation "app.cash.sqldelight:async-extensions:${app.cash.sqldelight.VersionKt.VERSION}" implementation libs.truth From 7615d6b8945a5132e33e7535effb2d8144bc2600 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 23:17:08 +0000 Subject: [PATCH 123/304] Update gradle/wrapper-validation-action action to v3 (#5149) * Update gradle/wrapper-validation-action action to v3 * Update gradleWrapper.yml --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jake Wharton --- .github/workflows/gradleWrapper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradleWrapper.yml b/.github/workflows/gradleWrapper.yml index 097dc824c54..837348b19b8 100644 --- a/.github/workflows/gradleWrapper.yml +++ b/.github/workflows/gradleWrapper.yml @@ -15,4 +15,4 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: gradle/wrapper-validation-action@v2 + - uses: gradle/actions/wrapper-validation@v3 From 1678afbbb576c7700f8561ef9a8e400d279d2089 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 12:51:11 -0400 Subject: [PATCH 124/304] Update plugin com.gradle.develocity to v3.17.1 (#5142) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index 7373f516381..60bb0956182 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17" + id "com.gradle.develocity" version "3.17.1" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index 079b0073b75..20cd9ab0924 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17" + id "com.gradle.develocity" version "3.17.1" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/settings.gradle b/settings.gradle index b13aeec238d..2241aa7456c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17" + id "com.gradle.develocity" version "3.17.1" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } From 1a2a6fcfc010ce207689d6b7b1fde47cca0c6621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:51:55 +0100 Subject: [PATCH 125/304] Add 5137 PostgreSql Regex operators (#5138) * Add regex_match_operator grammar * Add regexMatchOperatorExpression Setup is similar to json ops * Add regexMatchOperator Tests Fixture tests Integration tests * RegExMatchOperatorExpressionMixin Annotation errors for using regex operator with a non-text data type Change message to better understanding The problem here is that Functions and Column can be used with Regex operators however, there appears to be no way to access the typeresolver to get the function return type. We can only validate Column Types and functions we have to let through. TypeResolvers are in core compiler package no available here --- .../postgresql/PostgreSqlTypeResolver.kt | 2 +- .../postgresql/grammar/PostgreSql.bnf | 9 ++++- .../RegExMatchOperatorExpressionMixin.kt | 39 +++++++++++++++++++ .../postgres/PostgreSqlFixturesTest.kt | 2 +- .../regex-match-ops/Test.s | 21 ++++++++++ .../postgresql/integration/RegExOps.sq | 16 ++++++++ .../postgresql/integration/PostgreSqlTest.kt | 19 +++++++++ 7 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/RegExMatchOperatorExpressionMixin.kt create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/regex-match-ops/Test.s create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/RegExOps.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index b1937f9895d..7aeb20c5a88 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -275,7 +275,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes IntermediateType(PostgreSqlType.JSON) } } - matchOperatorExpression != null -> { + matchOperatorExpression != null || regexMatchOperatorExpression != null -> { IntermediateType(BOOLEAN) } else -> parentResolver.resolvedType(this) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index a2fca6faceb..a22cc4abf7c 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -364,7 +364,7 @@ compound_select_stmt ::= [ {with_clause} ] {select_stmt} ( {compound_operator} override = true } -extension_expr ::= match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_literal | boolean_not_expression | window_function_expr { +extension_expr ::= regex_match_operator_expression | match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_literal | boolean_not_expression | window_function_expr { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionExprImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionExpr" override = true @@ -392,6 +392,13 @@ match_operator_expression ::= ( {function_expr} | {column_expr} ) match_operator pin = 2 } +regex_match_operator ::= '~*' | '~' | '!~*' | '!~' + +regex_match_operator_expression ::= ( {function_expr} | {column_expr} ) regex_match_operator <> { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.RegExMatchOperatorExpressionMixin" + pin = 2 +} + extension_stmt ::= create_sequence_stmt | copy_stdin | truncate_stmt | set_stmt | drop_sequence_stmt | alter_sequence_stmt | create_extension_stmt | drop_extension_stmt | alter_extension_stmt { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionStmtImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionStmt" diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/RegExMatchOperatorExpressionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/RegExMatchOperatorExpressionMixin.kt new file mode 100644 index 00000000000..479fb3e3d9b --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/RegExMatchOperatorExpressionMixin.kt @@ -0,0 +1,39 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlRegexMatchOperatorExpression +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlTypeName +import com.alecstrong.sql.psi.core.SqlAnnotationHolder +import com.alecstrong.sql.psi.core.psi.SqlBinaryExpr +import com.alecstrong.sql.psi.core.psi.SqlColumnDef +import com.alecstrong.sql.psi.core.psi.SqlColumnName +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlExpr +import com.intellij.lang.ASTNode +/** + * Regular expression operators provide a more powerful means for pattern matching than the LIKE and SIMILAR TO operators. + */ +internal abstract class RegExMatchOperatorExpressionMixin(node: ASTNode) : + SqlCompositeElementImpl(node), + SqlBinaryExpr, + PostgreSqlRegexMatchOperatorExpression { + + override fun annotate(annotationHolder: SqlAnnotationHolder) { + ((firstChild.firstChild.reference?.resolve() as? SqlColumnName)?.parent as? SqlColumnDef)?.isStringDataType()?.let { isText -> + if (!isText) { + annotationHolder.createErrorAnnotation( + firstChild.firstChild, + """operator ${regexMatchOperator.text} can only be performed on text""", + ) + } + } + super.annotate(annotationHolder) + } + override fun getExprList(): List { + return children.filterIsInstance() + } + + private fun SqlColumnDef.isStringDataType(): Boolean { + val typeName = columnType.typeName as PostgreSqlTypeName + return typeName.stringDataType != null + } +} diff --git a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt index f854343efc0..ca2b67c4feb 100644 --- a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt +++ b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt @@ -18,7 +18,7 @@ class PostgreSqlFixturesTest(name: String, fixtureRoot: File) : FixturesTest(nam "BLOB" to "TEXT", "id TEXT GENERATED ALWAYS AS (2) UNIQUE NOT NULL" to "id TEXT GENERATED ALWAYS AS (2) STORED UNIQUE NOT NULL", "'(', ')', ',', '.', , BETWEEN or IN expected, got ','" - to "'#-', '(', ')', ',', '.', , , , '@@', BETWEEN or IN expected, got ','", + to "'#-', '(', ')', ',', '.', , , , , '@@', BETWEEN or IN expected, got ','", ) override fun setupDialect() { diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/regex-match-ops/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/regex-match-ops/Test.s new file mode 100644 index 00000000000..a008bf0e44a --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/regex-match-ops/Test.s @@ -0,0 +1,21 @@ +CREATE TABLE regexops( + t TEXT NOT NULL, + c VARCHAR(50) NOT NULL, + i INTEGER +); + +SELECT concat(t, 'test') ~ ?, t ~* ?, t !~ ?, t !~* ? +FROM regexops; + +SELECT t +FROM regexops +WHERE t ~ ?; + +SELECT c +FROM regexops +WHERE c ~ ?; + +--error[col 7]: operator ~ can only be performed on text +SELECT i ~ ? +FROM regexops; + diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/RegExOps.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/RegExOps.sq new file mode 100644 index 00000000000..985012bdf16 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/RegExOps.sq @@ -0,0 +1,16 @@ +CREATE TABLE regexops( + t TEXT NOT NULL +); + +insert: +INSERT INTO regexops (t) VALUES (?); + +matchRegExOps: +SELECT concat(t, 'test') ~ ?, t ~* ?, t !~ ?, t !~* ? +FROM regexops; + +matchRegExWhere: +SELECT t +FROM regexops +WHERE t ~ ?; + diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index 10880dd2022..afc961fdef4 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -846,4 +846,23 @@ class PostgreSqlTest { assertThat(first()).isEqualTo("0.030396355") } } + + @Test + fun testMatchRegExOps() { + database.regExOpsQueries.insert("thomas") + with(database.regExOpsQueries.matchRegExOps("t.*ma", "T.*ma", "t.*max", "T.*ma").executeAsList()) { + assertThat(first().expr).isTrue() + assertThat(first().expr_).isTrue() + assertThat(first().expr__).isTrue() + assertThat(first().expr___).isFalse() + } + } + + @Test + fun testMatchRegExWhere() { + database.regExOpsQueries.insert("thomas") + with(database.regExOpsQueries.matchRegExWhere("t.*ma").executeAsList()) { + assertThat(first()).isEqualTo("thomas") + } + } } From 14f9b1cdc480854f2a33ef8d23a627de9f0585e3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 07:20:20 -0400 Subject: [PATCH 126/304] Update dependency org.xerial:sqlite-jdbc to v3.45.3.0 (#5154) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 78700932587..22ab8139706 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -68,7 +68,7 @@ sqlPsiEnvironment = { module = "com.alecstrong.sql.psi:environment", version.ref robolectric = { module = "org.robolectric:robolectric", version = "4.12.1" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } -sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.2.0" } +sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.3.0" } postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.3" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } From d3ab5729edf658be945a23f0de426206dc215e78 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Apr 2024 07:42:18 -0400 Subject: [PATCH 127/304] Update plugin com.gradle.develocity to v3.17.2 (#5164) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index 60bb0956182..de7a3d16148 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.1" + id "com.gradle.develocity" version "3.17.2" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index 20cd9ab0924..9ac786949cb 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.1" + id "com.gradle.develocity" version "3.17.2" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/settings.gradle b/settings.gradle index 2241aa7456c..ae03ef4758d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.1" + id "com.gradle.develocity" version "3.17.2" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } From da8c744012f398f925d68469c9cce6c0047fcc6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Fri, 19 Apr 2024 22:02:50 +0100 Subject: [PATCH 128/304] Fix 5172 PostgreSql select distinct (#5174) * Fix grammar For some reason the additional optional [ distinct_on_expr ] causes the SELECT not to match DISTINCT. Removed as it seems to work with distinct_on_expr or optionally distinct/all * Add fixture tests for distinct There appears not to be tests for SELECT DISTINCT - if so it would have found the regression --- .../dialects/postgresql/grammar/PostgreSql.bnf | 2 +- .../fixtures_postgresql/select-distinct/Test.s | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct/Test.s diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index a22cc4abf7c..b6ad1e398d9 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -351,7 +351,7 @@ distinct_on_expr ::= DISTINCT ON LP {result_column} ( COMMA {result_column} ) * implements = "com.alecstrong.sql.psi.core.psi.SqlCompositeElement" } -select_stmt ::= SELECT ( [ distinct_on_expr ] | [ DISTINCT | ALL ] ) {result_column} ( COMMA {result_column} ) * [ FROM {join_clause} ] [ WHERE <> ] [{group_by}] [HAVING <>] | VALUES {values_expression} ( COMMA {values_expression} ) * { +select_stmt ::= SELECT ( distinct_on_expr | [ DISTINCT | ALL ] ) {result_column} ( COMMA {result_column} ) * [ FROM {join_clause} ] [ WHERE <> ] [{group_by}] [HAVING <>] | VALUES {values_expression} ( COMMA {values_expression} ) * { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlSelectStmtImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlSelectStmt" override = true diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct/Test.s new file mode 100644 index 00000000000..26d58297160 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct/Test.s @@ -0,0 +1,13 @@ +CREATE TABLE person ( + id INTEGER PRIMARY KEY, + name TEXT, + created_at TIMESTAMPTZ +); + +SELECT DISTINCT name FROM person; + +SELECT DISTINCT id, name FROM person ORDER BY name; + +SELECT DISTINCT name FROM person WHERE name LIKE 'A%'; + +SELECT DISTINCT SUBSTR(name, 1, 1) FROM person; From 61ccab1a03ff744b973015b38f3eb2ba6fa6d8a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 22 Apr 2024 14:45:54 +0100 Subject: [PATCH 129/304] Fix 5173 PostgreSql isNull isNotNull types (#5179) * Add missing SqlIsExpr type Not all types are in the list SqlBinaryExpr The actual problem is the missing SqlIsExpr Not working since 2.0.0 when changes were added IS NULL IS NOT NULL * InterfaceGeneration queries tests Checks that compiler produces Boolean type --- .../postgresql/PostgreSqlTypeResolver.kt | 6 + .../core/queries/InterfaceGeneration.kt | 141 ++++++++++++++++++ 2 files changed, 147 insertions(+) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index 7aeb20c5a88..ca2a32de727 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -32,6 +32,7 @@ import com.alecstrong.sql.psi.core.psi.SqlColumnExpr import com.alecstrong.sql.psi.core.psi.SqlCreateTableStmt import com.alecstrong.sql.psi.core.psi.SqlExpr import com.alecstrong.sql.psi.core.psi.SqlFunctionExpr +import com.alecstrong.sql.psi.core.psi.SqlIsExpr import com.alecstrong.sql.psi.core.psi.SqlLiteralExpr import com.alecstrong.sql.psi.core.psi.SqlStmt import com.alecstrong.sql.psi.core.psi.SqlTypeName @@ -224,6 +225,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes } private fun SqlExpr.postgreSqlType(): IntermediateType = when (this) { + is SqlIsExpr -> IntermediateType(BOOLEAN) is SqlBinaryExpr -> { if (node.findChildByType(binaryExprChildTypesResolvingToBool) != null) { IntermediateType(BOOLEAN) @@ -241,9 +243,13 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes REAL, TEXT, BLOB, + BOOLEAN, + DATE, + PostgreSqlType.UUID, PostgreSqlType.INTERVAL, PostgreSqlType.TIMESTAMP_TIMEZONE, PostgreSqlType.TIMESTAMP, + PostgreSqlType.TIME, PostgreSqlType.JSON, PostgreSqlType.TSVECTOR, ) diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt index 8a71e913ed5..b52bab98f3e 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt @@ -1066,6 +1066,147 @@ class InterfaceGeneration { ) } + @Test + fun `postgres SqlIsExpr returns boolean`() { + val result = FixtureCompiler.compileSql( + """ + |CREATE TABLE test( + |big BIGINT, + |bol BOOLEAN, + |byt BYTEA, + |dte DATE, + |inr INTEGER, + |jsn JSON, + |jsb JSON, + |tim TIME, + |tms TIMESTAMP, + |tmz TIMESTAMPTZ, + |ser SERIAL, + |sml SMALLINT, + |tsv TSVECTOR, + |txt TEXT, + |uui UUID, + |var VARCHAR(100) + |); + | + |selectIsNotNull: + |SELECT + |big IS NOT NULL AS has_bigint, + |bol IS NOT NULL AS has_boolean, + |byt IS NOT NULL AS has_byte, + |dte IS NOT NULL AS has_date, + |inr IS NOT NULL AS has_integer, + |jsn IS NOT NULL AS has_json, + |jsb IS NOT NULL AS has_jsob, + |sml IS NOT NULL AS has_smallint, + |tim IS NOT NULL AS has_time, + |tms IS NOT NULL AS has_timestamp, + |tmz IS NOT NULL AS has_timestamptz, + |tsv IS NOT NULL AS has_tsvector, + |uui IS NOT NULL AS has_uuid, + |var IS NULL AS has_varchar + |FROM test; + """.trimMargin(), + temporaryFolder, + fileName = "SqlIsExpr.sq", + overrideDialect = PostgreSqlDialect(), + ) + assertThat(result.errors).isEmpty() + val generatedInterface = result.compilerOutput.get(File(result.outputDirectory, "com/example/SqlIsExprQueries.kt")) + assertThat(generatedInterface).isNotNull() + assertThat(generatedInterface.toString()).isEqualTo( + """ + |package com.example + | + |import app.cash.sqldelight.Query + |import app.cash.sqldelight.TransacterImpl + |import app.cash.sqldelight.db.SqlDriver + |import app.cash.sqldelight.driver.jdbc.JdbcCursor + |import kotlin.Any + |import kotlin.Boolean + | + |public class SqlIsExprQueries( + | driver: SqlDriver, + |) : TransacterImpl(driver) { + | public fun selectIsNotNull(mapper: ( + | has_bigint: Boolean, + | has_boolean: Boolean, + | has_byte: Boolean, + | has_date: Boolean, + | has_integer: Boolean, + | has_json: Boolean, + | has_jsob: Boolean, + | has_smallint: Boolean, + | has_time: Boolean, + | has_timestamp: Boolean, + | has_timestamptz: Boolean, + | has_tsvector: Boolean, + | has_uuid: Boolean, + | has_varchar: Boolean, + | ) -> T): Query = Query(-1_574_646_250, arrayOf("test"), driver, "SqlIsExpr.sq", + | "selectIsNotNull", ""${'"'} + | |SELECT + | |big IS NOT NULL AS has_bigint, + | |bol IS NOT NULL AS has_boolean, + | |byt IS NOT NULL AS has_byte, + | |dte IS NOT NULL AS has_date, + | |inr IS NOT NULL AS has_integer, + | |jsn IS NOT NULL AS has_json, + | |jsb IS NOT NULL AS has_jsob, + | |sml IS NOT NULL AS has_smallint, + | |tim IS NOT NULL AS has_time, + | |tms IS NOT NULL AS has_timestamp, + | |tmz IS NOT NULL AS has_timestamptz, + | |tsv IS NOT NULL AS has_tsvector, + | |uui IS NOT NULL AS has_uuid, + | |var IS NULL AS has_varchar + | |FROM test + | ""${'"'}.trimMargin()) { cursor -> + | check(cursor is JdbcCursor) + | mapper( + | cursor.getBoolean(0)!!, + | cursor.getBoolean(1)!!, + | cursor.getBoolean(2)!!, + | cursor.getBoolean(3)!!, + | cursor.getBoolean(4)!!, + | cursor.getBoolean(5)!!, + | cursor.getBoolean(6)!!, + | cursor.getBoolean(7)!!, + | cursor.getBoolean(8)!!, + | cursor.getBoolean(9)!!, + | cursor.getBoolean(10)!!, + | cursor.getBoolean(11)!!, + | cursor.getBoolean(12)!!, + | cursor.getBoolean(13)!! + | ) + | } + | + | public fun selectIsNotNull(): Query = selectIsNotNull { has_bigint, has_boolean, + | has_byte, has_date, has_integer, has_json, has_jsob, has_smallint, has_time, has_timestamp, + | has_timestamptz, has_tsvector, has_uuid, has_varchar -> + | SelectIsNotNull( + | has_bigint, + | has_boolean, + | has_byte, + | has_date, + | has_integer, + | has_json, + | has_jsob, + | has_smallint, + | has_time, + | has_timestamp, + | has_timestamptz, + | has_tsvector, + | has_uuid, + | has_varchar + | ) + | } + |} + | + """.trimMargin(), + ) + } + private fun checkFixtureCompiles(fixtureRoot: String) { val result = FixtureCompiler.compileFixture( fixtureRoot = "src/test/query-interface-fixtures/$fixtureRoot", From 2a1249d7e6794ea97f4aead0ea2843dbcfd81fcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=ADna?= Date: Tue, 23 Apr 2024 18:14:20 +0200 Subject: [PATCH 130/304] Fix StringBuilder capacity (#5192) --- .../src/commonMain/kotlin/app/cash/sqldelight/Transacter.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runtime/src/commonMain/kotlin/app/cash/sqldelight/Transacter.kt b/runtime/src/commonMain/kotlin/app/cash/sqldelight/Transacter.kt index b47697c6a84..6e036d5c63a 100644 --- a/runtime/src/commonMain/kotlin/app/cash/sqldelight/Transacter.kt +++ b/runtime/src/commonMain/kotlin/app/cash/sqldelight/Transacter.kt @@ -323,12 +323,12 @@ abstract class BaseTransacterImpl(protected val driver: SqlDriver) { } /** - * For internal use, creates a string in the format (?, ?, ?) where there are [count] offset. + * For internal use, creates a string in the format (?, ?, ?) where there are [count] question marks. */ protected fun createArguments(count: Int): String { if (count == 0) return "()" - return buildString(count + 2) { + return buildString(count * 2 + 1) { append("(?") repeat(count - 1) { append(",?") From 031478444aceb424a3452edc5ba532f619b60975 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 26 Apr 2024 07:40:10 -0400 Subject: [PATCH 131/304] Update dependency com.google.testparameterinjector:test-parameter-injector to v1.16 (#5207) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 22ab8139706..7b142a9803d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -81,7 +81,7 @@ stately-concurrency = { module = "co.touchlab:stately-concurrency", version = "2 testhelp = { module = "co.touchlab:testhelp", version = "0.6.12" } burst = { module = "com.squareup.burst:burst-junit4", version = "1.2.0" } -testParameterInjector = { module = "com.google.testparameterinjector:test-parameter-injector", version = "1.15" } +testParameterInjector = { module = "com.google.testparameterinjector:test-parameter-injector", version = "1.16" } r2dbc = { module = "io.r2dbc:r2dbc-spi", version = "1.0.0.RELEASE" } testContainers-mysql = { module = "org.testcontainers:mysql", version.ref = "testContainers" } From 7f6f55eefc747b773c7bebbad94c4a1f09d7c864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Moravec?= Date: Mon, 29 Apr 2024 10:46:40 +0200 Subject: [PATCH 132/304] Fix leaking connections after transaction commit / rollback (#5205) * Fix leaking connections after transaction commit / rollback * Remove temp files --------- Co-authored-by: hfhbd <22521688+hfhbd@users.noreply.github.com> --- .../driver/jdbc/sqlite/JdbcSqliteDriver.kt | 5 +++++ .../src/test/multithreaded-sqlite/test.db-shm | Bin 32768 -> 0 bytes .../src/test/multithreaded-sqlite/test.db-wal | 0 3 files changed, 5 insertions(+) delete mode 100644 sqldelight-gradle-plugin/src/test/multithreaded-sqlite/test.db-shm delete mode 100644 sqldelight-gradle-plugin/src/test/multithreaded-sqlite/test.db-wal diff --git a/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver.kt b/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver.kt index febe1116ca6..026dde712d4 100644 --- a/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver.kt +++ b/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver.kt @@ -115,7 +115,12 @@ private class ThreadedConnectionManager( override var transaction: Transaction? get() = transactions.get() set(value) { + val currentTransaction = transactions.get() transactions.set(value) + + if (value == null && currentTransaction != null) { + closeConnection(currentTransaction.connection) + } } override fun getConnection() = connections.getOrSet { diff --git a/sqldelight-gradle-plugin/src/test/multithreaded-sqlite/test.db-shm b/sqldelight-gradle-plugin/src/test/multithreaded-sqlite/test.db-shm deleted file mode 100644 index fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeIuAr62r3 Date: Tue, 30 Apr 2024 14:59:45 +0100 Subject: [PATCH 133/304] Fix 5155 PostgreSql window functions (#5163) * Change window_function_expr grammar To include `OVER` and `WITHIN` * PostgreSqlTypeResolver Add main window functions Update PostgreSqlTypeResolver.kt * Add Window Function tests fixture tests interface generation integration tests --- .../postgresql/PostgreSqlTypeResolver.kt | 5 +- .../postgresql/grammar/PostgreSql.bnf | 41 ++++++++++- .../grammar/mixins/WindowDefinitionMixin.kt | 14 ++++ .../window_functions/Test.s | 67 ++++++++++++++++++ .../core/queries/InterfaceGeneration.kt | 69 +++++++++++++++++++ .../postgresql/integration/Functions.sq | 1 + .../postgresql/integration/WindowFunctions.sq | 33 +++++++++ .../postgresql/integration/PostgreSqlTest.kt | 30 ++++++++ 8 files changed, 258 insertions(+), 2 deletions(-) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/WindowDefinitionMixin.kt create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/window_functions/Test.s create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/WindowFunctions.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index ca2a32de727..fe4cf0633a9 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -136,7 +136,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "quote_nullable" -> IntermediateType(TEXT).asNullable() "date_trunc" -> encapsulatingType(exprList, TIMESTAMP_TIMEZONE, TIMESTAMP) "date_part" -> IntermediateType(REAL) - "percentile_disc" -> IntermediateType(REAL).asNullable() + "percentile_disc", "cume_dist", "percent_rank" -> IntermediateType(REAL).asNullable() "now" -> IntermediateType(TIMESTAMP_TIMEZONE) "corr", "covar_pop", "covar_samp", "regr_avgx", "regr_avgy", "regr_intercept", "regr_r2", "regr_slope", "regr_sxx", "regr_sxy", "regr_syy", @@ -184,6 +184,9 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "to_tsvector" -> IntermediateType(PostgreSqlType.TSVECTOR) "ts_rank" -> encapsulatingType(exprList, REAL, TEXT) "websearch_to_tsquery" -> IntermediateType(TEXT) + "rank", "dense_rank", "row_number" -> IntermediateType(INTEGER) + "ntile" -> IntermediateType(INTEGER).asNullable() + "lag", "lead", "first_value", "last_value", "nth_value" -> encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() else -> null } diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index b6ad1e398d9..103340f394a 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -13,8 +13,10 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.ALL" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ALTER" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ALWAYS" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.AND" "static com.alecstrong.sql.psi.core.psi.SqlTypes.AS" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ASC" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.BETWEEN" "static com.alecstrong.sql.psi.core.psi.SqlTypes.BY" "static com.alecstrong.sql.psi.core.psi.SqlTypes.CASCADE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.COLLATE" @@ -55,6 +57,7 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.LIMIT" "static com.alecstrong.sql.psi.core.psi.SqlTypes.LP" "static com.alecstrong.sql.psi.core.psi.SqlTypes.MINUS" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.MULTIPLY" "static com.alecstrong.sql.psi.core.psi.SqlTypes.NO" "static com.alecstrong.sql.psi.core.psi.SqlTypes.NOT" "static com.alecstrong.sql.psi.core.psi.SqlTypes.NOTHING" @@ -63,11 +66,13 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.ON" "static com.alecstrong.sql.psi.core.psi.SqlTypes.OR" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ORDER" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.PARTITION" "static com.alecstrong.sql.psi.core.psi.SqlTypes.PLUS" "static com.alecstrong.sql.psi.core.psi.SqlTypes.PRIMARY" "static com.alecstrong.sql.psi.core.psi.SqlTypes.RENAME" "static com.alecstrong.sql.psi.core.psi.SqlTypes.REPLACE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ROLLBACK" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.ROW" "static com.alecstrong.sql.psi.core.psi.SqlTypes.RP" "static com.alecstrong.sql.psi.core.psi.SqlTypes.SELECT" "static com.alecstrong.sql.psi.core.psi.SqlTypes.SET" @@ -96,6 +101,7 @@ overrides ::= type_name | insert_stmt | update_stmt_limited | generated_clause + | result_column | alter_table_rules | compound_select_stmt | extension_expr @@ -370,10 +376,43 @@ extension_expr ::= regex_match_operator_expression | match_operator_expression | override = true } -window_function_expr ::= {function_expr} 'WITHIN' GROUP LP ORDER BY <> ( COMMA <> ) * RP { +window_function_expr ::= {function_expr} + ( ['FILTER' LP WHERE <> RP] 'OVER' ( window_defn | window_name) | 'WITHIN' GROUP LP ORDER BY <> ( COMMA <> ) * RP ) { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.WindowFunctionMixin" } +base_window_name ::= id +window_name ::= id + +window_defn ::= LP [ base_window_name ] + [ PARTITION BY <> ( COMMA <> ) * ] + [ ORDER BY {ordering_term} ( COMMA {ordering_term} ) * ] + [ frame_spec ] +RP { + pin = 1 + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.WindowDefinitionMixin" +} + +frame_spec ::= ( 'RANGE' | 'ROWS' | 'GROUPS' ) + ( + BETWEEN ( + 'UNBOUNDED' 'PRECEDING' | + 'CURRENT' ROW | + <> 'PRECEDING' | + <> 'FOLLOWING' + ) AND ( + 'UNBOUNDED' 'FOLLOWING' | + 'CURRENT' ROW | + <> 'PRECEDING' | + <> 'FOLLOWING' + ) | + 'UNBOUNDED' 'PRECEDING' | + 'CURRENT' ROW | + <> 'PRECEDING' + ) [ 'EXCLUDE' NO 'OTHERS' | 'EXCLUDE' 'CURRENT' ROW | 'EXCLUDE' GROUP | 'EXCLUDE' 'TIES' ] { + pin = 1 +} + boolean_not_expression ::= NOT (boolean_literal | {column_name}) boolean_literal ::= TRUE | FALSE diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/WindowDefinitionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/WindowDefinitionMixin.kt new file mode 100644 index 00000000000..0a464ebe344 --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/WindowDefinitionMixin.kt @@ -0,0 +1,14 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import com.alecstrong.sql.psi.core.psi.FromQuery +import com.alecstrong.sql.psi.core.psi.QueryElement +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.intellij.lang.ASTNode +import com.intellij.psi.PsiElement +import com.intellij.psi.util.parentOfType + +abstract class WindowDefinitionMixin(node: ASTNode) : SqlCompositeElementImpl(node) { + override fun queryAvailable(child: PsiElement): Collection { + return parentOfType()!!.fromQuery() + } +} diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/window_functions/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/window_functions/Test.s new file mode 100644 index 00000000000..c2ca82271cd --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/window_functions/Test.s @@ -0,0 +1,67 @@ +CREATE TABLE scores ( + id INTEGER NOT NULL, + name TEXT NOT NULL, + points INTEGER NOT NULL +); + +SELECT + name, + RANK() OVER (ORDER BY points DESC) rank, + DENSE_RANK() OVER (ORDER BY points DESC) dense_rank, + ROW_NUMBER() OVER (ORDER BY points DESC) row_num, + LAG(points) OVER (ORDER BY points DESC) lag, + LEAD(points) OVER (ORDER BY points DESC) lead, + NTILE(6) OVER (ORDER BY points DESC) ntile, + CUME_DIST() OVER (ORDER BY points DESC) cume_dist, + PERCENT_RANK() OVER (ORDER BY points DESC) percent_rank +FROM scores; + +SELECT + name, + avg(points) OVER ( + PARTITION BY name + ORDER BY points + ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW + ) AS moving_avg +FROM scores; + +SELECT + name, + sum(points) OVER ( + PARTITION BY name + ORDER BY points + RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW + ) AS running_total +FROM scores; + +SELECT + name, + sum(points) OVER ( + PARTITION BY name + ORDER BY points + RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW + EXCLUDE CURRENT ROW + ) AS running_total +FROM scores; + +SELECT + name, + points, + lag(points) OVER ( + PARTITION BY name + ORDER BY points + ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING + EXCLUDE GROUP + ) AS prev_point +FROM scores; + +SELECT + name, + points, + lag(points) OVER ( + PARTITION BY name + ORDER BY points + ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING + EXCLUDE NO OTHERS + ) AS prev_point +FROM scores; diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt index b52bab98f3e..f54d00ea7bc 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt @@ -1066,6 +1066,75 @@ class InterfaceGeneration { ) } + @Test fun `postgresql windows function generates correct result columns`() { + val result = FixtureCompiler.compileSql( + """ + |CREATE TABLE scores ( + | name TEXT NOT NULL, + | points INTEGER NOT NULL + |); + | + |selectRank: + |SELECT + | name, + | RANK () OVER ( + | ORDER BY points DESC + | ) rank + |FROM scores; + """.trimMargin(), + temporaryFolder, + fileName = "WindowsFunctions.sq", + overrideDialect = PostgreSqlDialect(), + ) + + assertThat(result.errors).isEmpty() + val generatedInterface = result.compilerOutput.get( + File(result.outputDirectory, "com/example/WindowsFunctionsQueries.kt"), + ) + assertThat(generatedInterface).isNotNull() + assertThat(generatedInterface.toString()).isEqualTo( + """ + |package com.example + | + |import app.cash.sqldelight.Query + |import app.cash.sqldelight.TransacterImpl + |import app.cash.sqldelight.db.SqlDriver + |import app.cash.sqldelight.driver.jdbc.JdbcCursor + |import kotlin.Any + |import kotlin.Long + |import kotlin.String + | + |public class WindowsFunctionsQueries( + | driver: SqlDriver, + |) : TransacterImpl(driver) { + | public fun selectRank(mapper: (name: String, rank: Long) -> T): Query = + | Query(-1_725_152_245, arrayOf("scores"), driver, "WindowsFunctions.sq", "selectRank", ""${'"'} + | |SELECT + | | name, + | | RANK () OVER ( + | | ORDER BY points DESC + | | ) rank + | |FROM scores + | ""${'"'}.trimMargin()) { cursor -> + | check(cursor is JdbcCursor) + | mapper( + | cursor.getString(0)!!, + | cursor.getLong(1)!! + | ) + | } + | + | public fun selectRank(): Query = selectRank { name, rank -> + | SelectRank( + | name, + | rank + | ) + | } + |} + | + """.trimMargin(), + ) + } + @Test fun `postgres SqlIsExpr returns boolean`() { val result = FixtureCompiler.compileSql( diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Functions.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Functions.sq index 7674724a692..2302defcb57 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Functions.sq +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Functions.sq @@ -23,3 +23,4 @@ SELECT generate_series( CAST(:finish AS TIMESTAMPTZ), CAST('1 hour' AS INTERVAL) ); + diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/WindowFunctions.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/WindowFunctions.sq new file mode 100644 index 00000000000..83f50c5cc6c --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/WindowFunctions.sq @@ -0,0 +1,33 @@ +CREATE TABLE scores ( + name TEXT NOT NULL, + points INTEGER NOT NULL +); + +insert: +INSERT INTO scores (name, points) +VALUES (?, ?); + +selectRank: +SELECT + name, + RANK () OVER ( + ORDER BY points DESC + ) rank +FROM scores; + +selectOver: +SELECT + name, + DENSE_RANK() OVER (ORDER BY points DESC) dense_rank, + ROW_NUMBER() OVER (ORDER BY points DESC) row_num, + LAG(3) OVER (ORDER BY points DESC) lag, + LEAD(points) OVER (ORDER BY points DESC) lead, + NTILE(6) OVER (ORDER BY points DESC) ntile, + CUME_DIST() OVER (ORDER BY points DESC) cume_dist, + PERCENT_RANK() OVER ( + PARTITION BY name + ORDER BY points DESC + ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING + EXCLUDE NO OTHERS + ) percent_rank +FROM scores; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index afc961fdef4..7948c9d3959 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -865,4 +865,34 @@ class PostgreSqlTest { assertThat(first()).isEqualTo("thomas") } } + + @Test + fun testRankOver() { + database.windowFunctionsQueries.insert("t", 2) + database.windowFunctionsQueries.insert("q", 3) + database.windowFunctionsQueries.insert("p", 1) + + with(database.windowFunctionsQueries.selectRank().executeAsList()) { + assertThat(first().name).isEqualTo("q") + assertThat(first().rank).isEqualTo(1) + } + } + + @Test + fun testOver() { + database.windowFunctionsQueries.insert("a", 10) + database.windowFunctionsQueries.insert("b", 11) + database.windowFunctionsQueries.insert("c", 12) + + with(database.windowFunctionsQueries.selectOver().executeAsList()) { + assertThat(first().name).isEqualTo("c") + assertThat(first().dense_rank).isEqualTo(1) + assertThat(first().row_num).isEqualTo(1) + assertThat(first().lag).isNull() + assertThat(first().lead).isEqualTo(11) + assertThat(first().ntile).isEqualTo(1) + assertThat(first().cume_dist).isEqualTo(0.3333333333333333) + assertThat(first().percent_rank).isEqualTo(0) + } + } } From 2df6f74cbc8b1c772f3daccc433fec7863a8ce94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Moravec?= Date: Tue, 30 Apr 2024 16:03:42 +0200 Subject: [PATCH 134/304] Run SQLite migrations inside transaction as mentioned in documentation (#5218) --- .../driver/jdbc/sqlite/JdbcSqliteSchema.kt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteSchema.kt b/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteSchema.kt index bbf4146c9a7..955f9a00d55 100644 --- a/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteSchema.kt +++ b/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteSchema.kt @@ -1,5 +1,6 @@ package app.cash.sqldelight.driver.jdbc.sqlite +import app.cash.sqldelight.TransacterImpl import app.cash.sqldelight.db.AfterVersion import app.cash.sqldelight.db.QueryResult import app.cash.sqldelight.db.SqlCursor @@ -24,14 +25,18 @@ fun JdbcSqliteDriver( vararg callbacks: AfterVersion, ): JdbcSqliteDriver { val driver = JdbcSqliteDriver(url, properties) - val version = driver.getVersion() + val transacter = object : TransacterImpl(driver) {} - if (version == 0L && !migrateEmptySchema) { - schema.create(driver).value - driver.setVersion(schema.version) - } else if (version < schema.version) { - schema.migrate(driver, version, schema.version, *callbacks).value - driver.setVersion(schema.version) + transacter.transaction { + val version = driver.getVersion() + + if (version == 0L && !migrateEmptySchema) { + schema.create(driver).value + driver.setVersion(schema.version) + } else if (version < schema.version) { + schema.migrate(driver, version, schema.version, *callbacks).value + driver.setVersion(schema.version) + } } return driver From 8d8eabc1daf01d3a31466dcf86b5cd1293ce36f5 Mon Sep 17 00:00:00 2001 From: Oren Kislev <111307003+orenkislev-faire@users.noreply.github.com> Date: Tue, 30 Apr 2024 09:37:59 -0700 Subject: [PATCH 135/304] Support RENAME INDEX for MySql dialect (#5212) * Support RENAME INDEX for MySql dialect * Added DROP INDEX to fixture test --- .../dialects/mysql/MySqlMigrationSquasher.kt | 8 ++++++++ .../sqldelight/dialects/mysql/grammar/MySql.bnf | 4 ++++ .../fixtures_mysql/alter-table-rename-index/1.s | 14 ++++++++++++++ .../test/migration-squash/expected/mysql/_8.sqm | 2 +- .../src/main/sqldelight/mysql/migrations/3.sqm | 4 +++- 5 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 dialects/mysql/src/testFixtures/resources/fixtures_mysql/alter-table-rename-index/1.s diff --git a/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/MySqlMigrationSquasher.kt b/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/MySqlMigrationSquasher.kt index b69e6db5a59..207c7dff52e 100644 --- a/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/MySqlMigrationSquasher.kt +++ b/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/MySqlMigrationSquasher.kt @@ -36,6 +36,14 @@ internal class MySqlMigrationSquasher( .single { it.indexName.textMatches(indexName.text) } into.text.removeRange(createIndex.textRange.startOffset..createIndex.textRange.endOffset) } + alterTableRules.alterTableRenameIndex != null -> { + val indexNames = PsiTreeUtil.getChildrenOfTypeAsList(alterTableRules.alterTableRenameIndex, SqlIndexName::class.java) + val oldName = indexNames.first() + val createIndex = into.sqlStmtList!!.stmtList.mapNotNull { it.createIndexStmt } + .single { it.indexName.textMatches(oldName.text) } + val newName = indexNames.last() + into.text.replaceRange(createIndex.indexName.textRange.startOffset until createIndex.indexName.textRange.endOffset, newName.text) + } alterTableRules.alterTableAddColumn != null -> { val placement = alterTableRules.alterTableAddColumn!!.placementClause val columnDef = PsiTreeUtil.getChildOfType(alterTableRules.alterTableAddColumn!!, SqlColumnDef::class.java)!! diff --git a/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/grammar/MySql.bnf b/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/grammar/MySql.bnf index 8686587c06a..bf27548ef45 100644 --- a/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/grammar/MySql.bnf +++ b/dialects/mysql/src/main/kotlin/app/cash/sqldelight/dialects/mysql/grammar/MySql.bnf @@ -46,6 +46,7 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.ON" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ORDER" "static com.alecstrong.sql.psi.core.psi.SqlTypes.PRIMARY" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.RENAME" "static com.alecstrong.sql.psi.core.psi.SqlTypes.REPLACE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.RP" "static com.alecstrong.sql.psi.core.psi.SqlTypes.SET" @@ -219,6 +220,7 @@ alter_table_rules ::= ( | alter_table_modify_column | alter_table_add_index | alter_table_drop_index + | alter_table_rename_index | alter_table_drop_column | alter_table_convert_character_set | row_format_clause @@ -256,6 +258,8 @@ alter_table_add_index ::= ADD [ UNIQUE ] [ INDEX | KEY ] [ {index_name} ] LP {in alter_table_drop_index ::= DROP ( INDEX | KEY ) {index_name} +alter_table_rename_index ::= RENAME ( INDEX | KEY ) {index_name} TO {index_name} + placement_clause ::= 'FIRST' | ( AFTER {column_name} ) alter_table_convert_character_set ::= 'CONVERT' TO 'CHARACTER' SET {identifier} [COLLATE {identifier}] diff --git a/dialects/mysql/src/testFixtures/resources/fixtures_mysql/alter-table-rename-index/1.s b/dialects/mysql/src/testFixtures/resources/fixtures_mysql/alter-table-rename-index/1.s new file mode 100644 index 00000000000..9b56676033b --- /dev/null +++ b/dialects/mysql/src/testFixtures/resources/fixtures_mysql/alter-table-rename-index/1.s @@ -0,0 +1,14 @@ +CREATE TABLE animals ( + id BIGINT AUTO_INCREMENT, + name VARCHAR(30) NOT NULL, + species VARCHAR(30) NOT NULL, + UNIQUE KEY unq_name (name), + KEY idx_species (species) +); + +ALTER TABLE animals + RENAME INDEX `unq_name` TO `unq_animals_name`, + RENAME KEY `idx_species` TO `idx_animals_species`; + +ALTER TABLE animals + DROP INDEX `unq_animals_name`; diff --git a/sqldelight-gradle-plugin/src/test/migration-squash/expected/mysql/_8.sqm b/sqldelight-gradle-plugin/src/test/migration-squash/expected/mysql/_8.sqm index f26963cc2e3..ae48c862a2c 100644 --- a/sqldelight-gradle-plugin/src/test/migration-squash/expected/mysql/_8.sqm +++ b/sqldelight-gradle-plugin/src/test/migration-squash/expected/mysql/_8.sqm @@ -4,7 +4,7 @@ CREATE TABLE test3 ( value VARCHAR(8) ); -CREATE INDEX index1 ON test3(value); +CREATE INDEX idx_value ON test3(value); CREATE VIEW view1 AS diff --git a/sqldelight-gradle-plugin/src/test/migration-squash/src/main/sqldelight/mysql/migrations/3.sqm b/sqldelight-gradle-plugin/src/test/migration-squash/src/main/sqldelight/mysql/migrations/3.sqm index 5674af73567..15c04753704 100644 --- a/sqldelight-gradle-plugin/src/test/migration-squash/src/main/sqldelight/mysql/migrations/3.sqm +++ b/sqldelight-gradle-plugin/src/test/migration-squash/src/main/sqldelight/mysql/migrations/3.sqm @@ -1 +1,3 @@ -ALTER TABLE test DROP INDEX index2; \ No newline at end of file +ALTER TABLE test DROP INDEX index2; + +ALTER TABLE test RENAME INDEX index1 TO idx_value; From 70226c2665cc8afea453c2a74812ee8b59da062b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 19:18:24 -0400 Subject: [PATCH 136/304] Update agp to v8.4.0 (#5221) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7b142a9803d..4a1b6743723 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.2.1" -agp = "8.3.2" +agp = "8.4.0" compileSdk = "34" minSdk = "21" sqlPsi = "0.4.9" From e9d8414107fc391fcdd49cd0e0aec534cb7c669b Mon Sep 17 00:00:00 2001 From: Drew Dobson Date: Thu, 2 May 2024 10:04:35 -0500 Subject: [PATCH 137/304] Align error underlines properly when tabs are involved (#5224) --- .../sqldelight/core/SqlDelightEnvironment.kt | 12 +++++++----- .../src/test/bad-underlines/build.gradle | 12 ++++++++++++ .../src/test/bad-underlines/settings.gradle | 7 +++++++ .../src/main/sqldelight/Test1.sq | 3 +++ .../app/cash/sqldelight/tests/FailureTest.kt | 19 +++++++++++++++++++ 5 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 sqldelight-gradle-plugin/src/test/bad-underlines/build.gradle create mode 100644 sqldelight-gradle-plugin/src/test/bad-underlines/settings.gradle create mode 100644 sqldelight-gradle-plugin/src/test/bad-underlines/src/main/sqldelight/Test1.sq diff --git a/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/SqlDelightEnvironment.kt b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/SqlDelightEnvironment.kt index 5759ae874b5..001c2e5c0a3 100644 --- a/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/SqlDelightEnvironment.kt +++ b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/core/SqlDelightEnvironment.kt @@ -229,13 +229,15 @@ class SqlDelightEnvironment( val maxDigits = (log10(context.lineEnd.toDouble()) + 1).toInt() for (line in context.lineStart..context.lineEnd) { if (!tokenizer.hasMoreTokens()) break - result.append(("%0${maxDigits}d %s\n").format(line, tokenizer.nextToken())) + val lineValue = tokenizer.nextToken() + result.append(("%0${maxDigits}d %s\n").format(line, lineValue)) if (element.lineStart == element.lineEnd && element.lineStart == line) { - // If its an error on a single line highlight where on the line. + // If it's an error on a single line highlight where on the line. result.append(("%${maxDigits}s ").format("")) - if (element.charPositionInLine > 0) { - result.append(("%${element.charPositionInLine}s").format("")) - } + // Print tabs when you see it, spaces for everything else. + lineValue.subSequence(0 until element.charPositionInLine) + .map { char -> if (char != '\t') " " else char } + .forEach(result::append) result.append(("%s\n").format("^".repeat(element.textLength))) } } diff --git a/sqldelight-gradle-plugin/src/test/bad-underlines/build.gradle b/sqldelight-gradle-plugin/src/test/bad-underlines/build.gradle new file mode 100644 index 00000000000..eea2e83e061 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/bad-underlines/build.gradle @@ -0,0 +1,12 @@ +plugins { + alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.sqldelight) +} + +sqldelight { + databases { + Database { + packageName = "com.example" + } + } +} diff --git a/sqldelight-gradle-plugin/src/test/bad-underlines/settings.gradle b/sqldelight-gradle-plugin/src/test/bad-underlines/settings.gradle new file mode 100644 index 00000000000..e993e2cffd9 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/bad-underlines/settings.gradle @@ -0,0 +1,7 @@ +pluginManagement { + includeBuild("../build-logic-tests") +} + +plugins { + id("sqldelightTests") +} diff --git a/sqldelight-gradle-plugin/src/test/bad-underlines/src/main/sqldelight/Test1.sq b/sqldelight-gradle-plugin/src/test/bad-underlines/src/main/sqldelight/Test1.sq new file mode 100644 index 00000000000..0a6b64f8873 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/bad-underlines/src/main/sqldelight/Test1.sq @@ -0,0 +1,3 @@ +CREATE TABLE test1( + value BIGINT +); diff --git a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/FailureTest.kt b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/FailureTest.kt index 0fbe6ea8a5e..038cca7f09e 100644 --- a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/FailureTest.kt +++ b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/FailureTest.kt @@ -26,4 +26,23 @@ class FailureTest { """.trimMargin(), ) } + + @Test fun `errors with tabs in line underline properly`() { + val fixtureRoot = File("src/test/bad-underlines") + + val output = GradleRunner.create() + .withCommonConfiguration(fixtureRoot) + .withArguments("clean", "generateMainDatabaseInterface", "--stacktrace") + .buildAndFail() + + assertThat(output.output).contains( + """ + |Test1.sq: (2, 7): expected, got 'BIGINT' + |1 CREATE TABLE test1( + |2 value BIGINT + | ^^^^^^ + |3 ) + """.trimMargin(), + ) + } } From 50551cc98657d684f64e026b7cfb61311002d150 Mon Sep 17 00:00:00 2001 From: Drew Dobson Date: Fri, 3 May 2024 13:41:57 -0500 Subject: [PATCH 138/304] Add PostgreSQL current date/time function support (#5226) --- .../postgresql/grammar/PostgreSql.bnf | 13 +++++++---- .../localtimestamp-literals/Test.s | 22 +++++++++++++++++++ .../localtimestamp-with-precission/Test.s | 22 +++++++++++++++++++ .../timestamp-with-precission/Test.s | 22 +++++++++++++++++++ 4 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/localtimestamp-literals/Test.s create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/localtimestamp-with-precission/Test.s create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/timestamp-with-precission/Test.s diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 103340f394a..3ab64db6d99 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -124,7 +124,7 @@ column_constraint ::= [ CONSTRAINT {identifier} ] ( override = true } -current_timestamp_with_optional_interval ::= ( CURRENT_TIMESTAMP | 'NOW()' | interval_expression ) [ [ PLUS | MINUS ] interval_expression ] * +current_timestamp_with_optional_interval ::= ( current_date_time_functions | 'NOW()' | interval_expression ) [ [ PLUS | MINUS ] interval_expression ] * default_constraint ::= [ NOT NULL | NULL ] DEFAULT ( current_timestamp_with_optional_interval | {signed_number} | @@ -244,13 +244,18 @@ string_literal ::= string { override = true } +precision_literal ::= ( '0' | '1' | '2' | '3' | '4' | '5' | '6' ) +current_date_time_functions ::= CURRENT_DATE + | 'CURRENT_TIME' [ LP precision_literal RP] + | 'CURRENT_TIMESTAMP' [ LP precision_literal RP] + | 'LOCALTIME' [ LP precision_literal RP] + | 'LOCALTIMESTAMP' [ LP precision_literal RP] + literal_value ::= ( {numeric_literal} | string_literal | {blob_literal} | NULL - | CURRENT_TIME - | CURRENT_DATE - | CURRENT_TIMESTAMP + | current_date_time_functions | interval_expression ) { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.LiteralValueMixin" implements = "com.alecstrong.sql.psi.core.psi.SqlLiteralValue" diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/localtimestamp-literals/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/localtimestamp-literals/Test.s new file mode 100644 index 00000000000..d4145e3d85c --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/localtimestamp-literals/Test.s @@ -0,0 +1,22 @@ +CREATE TABLE test ( + _id INTEGER NOT NULL PRIMARY KEY, + date1 TEXT NOT NULL DEFAULT LOCALTIME, + date2 TEXT NOT NULL DEFAULT LOCALTIMESTAMP +); + +-- Throws no errors. +CREATE TRIGGER on_update_trigger +AFTER UPDATE +ON test +BEGIN + UPDATE test SET date1 = LOCALTIME WHERE new._id = old._id; +END; + +UPDATE test +SET date1 = LOCALTIME, + date2 = LOCALTIMESTAMP; + +UPDATE test +SET date1 = LOCALTIME, + date2 = LOCALTIMESTAMP +WHERE date1 > LOCALTIME; diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/localtimestamp-with-precission/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/localtimestamp-with-precission/Test.s new file mode 100644 index 00000000000..3660352ccfd --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/localtimestamp-with-precission/Test.s @@ -0,0 +1,22 @@ +CREATE TABLE test ( + _id INTEGER NOT NULL PRIMARY KEY, + date1 TEXT NOT NULL DEFAULT LOCALTIME(2), + date2 TEXT NOT NULL DEFAULT LOCALTIMESTAMP(3) +); + +-- Throws no errors. +CREATE TRIGGER on_update_trigger +AFTER UPDATE +ON test +BEGIN + UPDATE test SET date1 = LOCALTIME(1) WHERE new._id = old._id; +END; + +UPDATE test +SET date1 = LOCALTIME(6), + date2 = LOCALTIMESTAMP(2); + +UPDATE test +SET date1 = LOCALTIME(2), + date2 = LOCALTIMESTAMP(3) +WHERE date1 > LOCALTIME(1); diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/timestamp-with-precission/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/timestamp-with-precission/Test.s new file mode 100644 index 00000000000..17617f9c576 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/timestamp-with-precission/Test.s @@ -0,0 +1,22 @@ +CREATE TABLE test ( + _id INTEGER NOT NULL PRIMARY KEY, + date1 TEXT NOT NULL DEFAULT CURRENT_TIME(2), + date2 TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP(3) +); + +-- Throws no errors. +CREATE TRIGGER on_update_trigger +AFTER UPDATE +ON test +BEGIN + UPDATE test SET date1 = CURRENT_TIME(1) WHERE new._id = old._id; +END; + +UPDATE test +SET date1 = CURRENT_TIME(6), + date2 = CURRENT_TIMESTAMP(2); + +UPDATE test +SET date1 = CURRENT_TIME(2), + date2 = CURRENT_TIMESTAMP(3) +WHERE date1 > CURRENT_TIME(1); From 97e84131aab0983e68ef42abf328723f4063921c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 01:40:46 +0000 Subject: [PATCH 139/304] Update kotlin monorepo to v1.9.24 (#5230) * Update kotlin monorepo to v1.9.24 * Update plugin ksp to v1.9.24-1.0.20 (#5236) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4a1b6743723..0a3e322e88a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlin = "1.9.23" +kotlin = "1.9.24" dokka = "1.9.20" kotlinCoroutines = "1.8.0" idea = "231.9392.1" # Hedgehog | 2023.1.1 Patch 2 (see https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html) @@ -108,5 +108,5 @@ publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } -ksp = { id = "com.google.devtools.ksp", version = "1.9.23-1.0.20" } +ksp = { id = "com.google.devtools.ksp", version = "1.9.24-1.0.20" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.14.0" } From 51e4536c1e9c0d59bc4789531753914acf1119ec Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 02:52:32 +0000 Subject: [PATCH 140/304] Update testcontainers-java monorepo to v1.19.8 (#5239) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0a3e322e88a..f4eef84bf43 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ agp = "8.4.0" compileSdk = "34" minSdk = "21" sqlPsi = "0.4.9" -testContainers = "1.19.7" +testContainers = "1.19.8" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } From 3f9618a996570a88541936b1a39db6b439dbff22 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 10 May 2024 07:08:25 -0400 Subject: [PATCH 141/304] Update plugin com.gradle.develocity to v3.17.3 (#5245) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index de7a3d16148..a3058dcaf53 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.2" + id "com.gradle.develocity" version "3.17.3" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index 9ac786949cb..ec9d429ec5f 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.2" + id "com.gradle.develocity" version "3.17.3" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/settings.gradle b/settings.gradle index ae03ef4758d..9c5e8e0d5c8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.2" + id "com.gradle.develocity" version "3.17.3" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } From 3d309726013f2506cffad5f48a0dc534f2effae0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 10 May 2024 13:56:13 +0200 Subject: [PATCH 142/304] Update dependency org.jetbrains.kotlinx:kotlinx-coroutines-reactive to v1.8.1 (#5246) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f4eef84bf43..0a12bb1bbff 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] kotlin = "1.9.24" dokka = "1.9.20" -kotlinCoroutines = "1.8.0" +kotlinCoroutines = "1.8.1" idea = "231.9392.1" # Hedgehog | 2023.1.1 Patch 2 (see https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html) androidxSqlite = "2.4.0" schemaCrawler = "16.19.2" From 2e033dceb374e83414026c6bcadd16c3c4351bbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Fri, 10 May 2024 12:57:03 +0100 Subject: [PATCH 143/304] Add 5199 support postgresql order by nulls (#5229) * Add PostgreSql Order By Nulls Add grammar * Add fixture tests --- .../postgresql/grammar/PostgreSql.bnf | 7 +++++ .../order-by-nulls/Sample.s | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/order-by-nulls/Sample.s diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 3ab64db6d99..a0fe4aefde0 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -108,6 +108,7 @@ overrides ::= type_name | extension_stmt | create_index_stmt | select_stmt + | ordering_term column_constraint ::= [ CONSTRAINT {identifier} ] ( PRIMARY KEY [ ASC | DESC ] {conflict_clause} | @@ -532,3 +533,9 @@ set_timezone ::= 'TIME' 'ZONE' | 'LOCAL' | set_value ) + +ordering_term ::= <> [ ASC | DESC ] [ 'NULLS' ( 'FIRST' | 'LAST' ) ] { + extends = "com.alecstrong.sql.psi.core.psi.impl.SqlOrderingTermImpl" + implements = "com.alecstrong.sql.psi.core.psi.SqlOrderingTerm" + override = true +} diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/order-by-nulls/Sample.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/order-by-nulls/Sample.s new file mode 100644 index 00000000000..ea967c2a41a --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/order-by-nulls/Sample.s @@ -0,0 +1,28 @@ +CREATE TABLE table_name( + column1 TEXT, + column2 DATE, + column3 INTEGER +); + +SELECT column1, column2 +FROM table_name +ORDER BY column1 NULLS FIRST, column2 DESC; + +SELECT column1, column2 +FROM table_name +ORDER BY column1 DESC NULLS LAST, column2; + +SELECT column1, column2, column3 +FROM table_name +ORDER BY column1 NULLS FIRST, column2 NULLS LAST, column3; + +SELECT + column1, + column2, + column3 +FROM + table_name +ORDER BY + column1 ASC, + column2 DESC, + column3; From afa89af092089f42a8628698b7ea7a8a18e71681 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 19:37:17 +0000 Subject: [PATCH 144/304] Update plugin com.gradle.develocity to v3.17.4 (#5259) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index a3058dcaf53..af8e50b7299 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.3" + id "com.gradle.develocity" version "3.17.4" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index ec9d429ec5f..066e501bade 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.3" + id "com.gradle.develocity" version "3.17.4" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/settings.gradle b/settings.gradle index 9c5e8e0d5c8..10c6fb8358b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.3" + id "com.gradle.develocity" version "3.17.4" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } From 617875f31434908b8ac0b65e209170f0096d84b0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 18 May 2024 07:01:38 -0400 Subject: [PATCH 145/304] Update dependency org.robolectric:robolectric to v4.12.2 (#5260) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0a12bb1bbff..ae5ff554943 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -65,7 +65,7 @@ intellij-util = { module = "com.jetbrains.intellij.platform:util", version.ref = sqlPsi = { module = "com.alecstrong.sql.psi:core", version.ref = "sqlPsi" } sqlPsiEnvironment = { module = "com.alecstrong.sql.psi:environment", version.ref = "sqlPsi" } -robolectric = { module = "org.robolectric:robolectric", version = "4.12.1" } +robolectric = { module = "org.robolectric:robolectric", version = "4.12.2" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.3.0" } From 08e929a13f40f4e094d4b56d4c6d3a35a8793a0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 20 May 2024 15:57:08 +0100 Subject: [PATCH 146/304] Fixes 5262 PostgreSql boolean literals (#5263) --- .../dialects/postgresql/PostgreSqlTypeResolver.kt | 3 ++- .../dialects/postgresql/grammar/PostgreSql.bnf | 4 +++- .../sqldelight/postgresql/integration/Booleans.sq | 10 ++++++++++ .../postgresql/integration/PostgreSqlTest.kt | 13 +++++++++++++ 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Booleans.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index fe4cf0633a9..31ba43fb599 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -259,6 +259,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes } } is SqlLiteralExpr -> when { + literalValue.text == "TRUE" || literalValue.text == "FALSE" -> IntermediateType(BOOLEAN) literalValue.text == "CURRENT_DATE" -> IntermediateType(PostgreSqlType.DATE) literalValue.text == "CURRENT_TIME" -> IntermediateType(PostgreSqlType.TIME) literalValue.text == "CURRENT_TIMESTAMP" -> IntermediateType(PostgreSqlType.TIMESTAMP) @@ -284,7 +285,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes IntermediateType(PostgreSqlType.JSON) } } - matchOperatorExpression != null || regexMatchOperatorExpression != null -> { + matchOperatorExpression != null || regexMatchOperatorExpression != null || booleanNotExpression != null -> { IntermediateType(BOOLEAN) } else -> parentResolver.resolvedType(this) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index a0fe4aefde0..f2bcb8bb97d 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -109,6 +109,7 @@ overrides ::= type_name | create_index_stmt | select_stmt | ordering_term + | literal_value column_constraint ::= [ CONSTRAINT {identifier} ] ( PRIMARY KEY [ ASC | DESC ] {conflict_clause} | @@ -256,6 +257,7 @@ literal_value ::= ( {numeric_literal} | string_literal | {blob_literal} | NULL + | boolean_literal | current_date_time_functions | interval_expression ) { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.LiteralValueMixin" @@ -376,7 +378,7 @@ compound_select_stmt ::= [ {with_clause} ] {select_stmt} ( {compound_operator} override = true } -extension_expr ::= regex_match_operator_expression | match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_literal | boolean_not_expression | window_function_expr { +extension_expr ::= regex_match_operator_expression | match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_not_expression | window_function_expr { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionExprImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionExpr" override = true diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Booleans.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Booleans.sq new file mode 100644 index 00000000000..56f17c13c02 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Booleans.sq @@ -0,0 +1,10 @@ +CREATE TABLE T( + b BOOLEAN NOT NULL +); + +insert: +INSERT INTO T(b) VALUES (?); + +select: +SELECT TRUE, FALSE, NOT TRUE, NOT FALSE, b +FROM T; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index 7948c9d3959..4a9b5c7e53c 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -895,4 +895,17 @@ class PostgreSqlTest { assertThat(first().percent_rank).isEqualTo(0) } } + + @Test + fun testBooleans() { + database.booleansQueries.insert(true) + + with(database.booleansQueries.select().executeAsOne()) { + assertThat(expr).isTrue() + assertThat(expr_).isFalse() + assertThat(expr__).isFalse() + assertThat(expr___).isTrue() + assertThat(b).isTrue() + } + } } From 0fe6f6bbcee6b7a7012435e1d1bff25d378a0329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 20 May 2024 17:47:42 +0100 Subject: [PATCH 147/304] Fixes 5243 add PostgreSql AT TIME ZONE (#5253) --- .../postgresql/PostgreSqlTypeResolver.kt | 23 ++++++++++++++++- .../postgresql/grammar/PostgreSql.bnf | 19 +++++++++++--- .../AtTimeZoneOperatorExpressionMixin.kt | 23 +++++++++++++++++ .../grammar/mixins/AtTimeZoneOperatorMixin.kt | 14 +++++++++++ .../postgres/PostgreSqlFixturesTest.kt | 2 +- .../fixtures_postgresql/at-time-zone/Test.s | 25 +++++++++++++++++++ .../postgresql/integration/TimeZone.sq | 22 ++++++++++++++++ .../postgresql/integration/PostgreSqlTest.kt | 20 +++++++++++++++ 8 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AtTimeZoneOperatorExpressionMixin.kt create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AtTimeZoneOperatorMixin.kt create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/at-time-zone/Test.s create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/TimeZone.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index 31ba43fb599..35142c9e3a0 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -18,7 +18,9 @@ import app.cash.sqldelight.dialects.postgresql.PostgreSqlType.SMALL_INT import app.cash.sqldelight.dialects.postgresql.PostgreSqlType.TIMESTAMP import app.cash.sqldelight.dialects.postgresql.PostgreSqlType.TIMESTAMP_TIMEZONE import app.cash.sqldelight.dialects.postgresql.grammar.mixins.AggregateExpressionMixin +import app.cash.sqldelight.dialects.postgresql.grammar.mixins.AtTimeZoneOperatorExpressionMixin import app.cash.sqldelight.dialects.postgresql.grammar.mixins.WindowFunctionMixin +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlAtTimeZoneOperator import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlDeleteStmtLimited import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlExtensionExpr import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlInsertStmt @@ -37,6 +39,7 @@ import com.alecstrong.sql.psi.core.psi.SqlLiteralExpr import com.alecstrong.sql.psi.core.psi.SqlStmt import com.alecstrong.sql.psi.core.psi.SqlTypeName import com.alecstrong.sql.psi.core.psi.SqlTypes +import com.intellij.psi.PsiElement import com.intellij.psi.tree.TokenSet import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy @@ -227,6 +230,14 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes return expr.postgreSqlType() } + override fun argumentType(parent: PsiElement, argument: SqlExpr): IntermediateType { + return if (argument.parent is PostgreSqlAtTimeZoneOperator) { + IntermediateType(TEXT) + } else { + parentResolver.argumentType(parent, argument) + } + } + private fun SqlExpr.postgreSqlType(): IntermediateType = when (this) { is SqlIsExpr -> IntermediateType(BOOLEAN) is SqlBinaryExpr -> { @@ -262,10 +273,14 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes literalValue.text == "TRUE" || literalValue.text == "FALSE" -> IntermediateType(BOOLEAN) literalValue.text == "CURRENT_DATE" -> IntermediateType(PostgreSqlType.DATE) literalValue.text == "CURRENT_TIME" -> IntermediateType(PostgreSqlType.TIME) - literalValue.text == "CURRENT_TIMESTAMP" -> IntermediateType(PostgreSqlType.TIMESTAMP) + literalValue.text.startsWith("CURRENT_TIMESTAMP") -> IntermediateType(PostgreSqlType.TIMESTAMP_TIMEZONE) + literalValue.text.startsWith("TIMESTAMP WITH TIME ZONE") -> IntermediateType(PostgreSqlType.TIMESTAMP_TIMEZONE) + literalValue.text.startsWith("TIMESTAMP WITHOUT TIME ZONE") -> IntermediateType(TIMESTAMP) + literalValue.text.startsWith("TIMESTAMP") -> IntermediateType(TIMESTAMP) literalValue.text.startsWith("INTERVAL") -> IntermediateType(PostgreSqlType.INTERVAL) else -> parentResolver.resolvedType(this) } + is PostgreSqlAtTimeZoneOperator -> IntermediateType(TEXT) is PostgreSqlExtensionExpr -> when { arrayAggStmt != null -> { val typeForArray = (arrayAggStmt as AggregateExpressionMixin).expr.postgreSqlType() // same as resolvedType(expr) @@ -288,6 +303,12 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes matchOperatorExpression != null || regexMatchOperatorExpression != null || booleanNotExpression != null -> { IntermediateType(BOOLEAN) } + atTimeZoneOperatorExpression != null -> { + val timeStamp = (atTimeZoneOperatorExpression as AtTimeZoneOperatorExpressionMixin).postgreSqlType() + atTimeZoneOperatorExpression?.atTimeZoneOperatorList?.fold(timeStamp) { acc, _ -> + if (acc.dialectType == TIMESTAMP) IntermediateType(TIMESTAMP_TIMEZONE) else IntermediateType(TIMESTAMP) + } ?: if (timeStamp.dialectType == TIMESTAMP) IntermediateType(TIMESTAMP_TIMEZONE) else IntermediateType(TIMESTAMP) + } else -> parentResolver.resolvedType(this) } diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index f2bcb8bb97d..e6591a608cd 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -226,6 +226,8 @@ tsvector_data_type ::= 'TSVECTOR' interval_expression ::= 'INTERVAL' string_literal +timestamp_expression ::= 'TIMESTAMP' [ (WITH | WITHOUT) 'TIME' 'ZONE' ] {string_literal} + with_clause_auxiliary_stmt ::= {compound_select_stmt} | delete_stmt_limited | insert_stmt | update_stmt_limited { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlWithClauseAuxiliaryStmtImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlWithClauseAuxiliaryStmt" @@ -259,7 +261,8 @@ literal_value ::= ( {numeric_literal} | NULL | boolean_literal | current_date_time_functions - | interval_expression ) { + | interval_expression + | timestamp_expression) { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.LiteralValueMixin" implements = "com.alecstrong.sql.psi.core.psi.SqlLiteralValue" override = true @@ -378,7 +381,7 @@ compound_select_stmt ::= [ {with_clause} ] {select_stmt} ( {compound_operator} override = true } -extension_expr ::= regex_match_operator_expression | match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_not_expression | window_function_expr { +extension_expr ::= at_time_zone_operator_expression | regex_match_operator_expression | match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_not_expression | window_function_expr { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionExprImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionExpr" override = true @@ -446,7 +449,17 @@ regex_match_operator_expression ::= ( {function_expr} | {column_expr} ) regex_ma pin = 2 } -extension_stmt ::= create_sequence_stmt | copy_stdin | truncate_stmt | set_stmt | drop_sequence_stmt | alter_sequence_stmt | create_extension_stmt | drop_extension_stmt | alter_extension_stmt { +at_time_zone_operator ::= 'AT' 'TIME' 'ZONE' <> { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.AtTimeZoneOperatorMixin" +} + +at_time_zone_operator_expression ::= ( {literal_expr} | {cast_expr} | {function_expr} | {column_expr} ) at_time_zone_operator [ at_time_zone_operator ] * { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.AtTimeZoneOperatorExpressionMixin" + pin = 2 +} + +extension_stmt ::= create_sequence_stmt | copy_stdin | truncate_stmt | set_stmt | drop_sequence_stmt | + alter_sequence_stmt | create_extension_stmt | drop_extension_stmt | alter_extension_stmt { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionStmtImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionStmt" override = true diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AtTimeZoneOperatorExpressionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AtTimeZoneOperatorExpressionMixin.kt new file mode 100644 index 00000000000..5a0c44108d6 --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AtTimeZoneOperatorExpressionMixin.kt @@ -0,0 +1,23 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlAtTimeZoneOperatorExpression +import com.alecstrong.sql.psi.core.psi.SqlBinaryExpr +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlExpr +import com.intellij.lang.ASTNode + +/** + * The AT TIME ZONE operator converts time stamp without time zone to/from time stamp with time zone, + * and time with time zone values to different time zones (Note: time is not currently supported) + * timestamp without time zone AT TIME ZONE zone → timestamp with time zone + * timestamp with time zone AT TIME ZONE zone → timestamp without time zone + */ +internal abstract class AtTimeZoneOperatorExpressionMixin(node: ASTNode) : + SqlCompositeElementImpl(node), + SqlBinaryExpr, + PostgreSqlAtTimeZoneOperatorExpression { + + override fun getExprList(): List { + return children.filterIsInstance() + } +} diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AtTimeZoneOperatorMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AtTimeZoneOperatorMixin.kt new file mode 100644 index 00000000000..06ad1363e82 --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AtTimeZoneOperatorMixin.kt @@ -0,0 +1,14 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlAtTimeZoneOperator +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlExpr +import com.intellij.lang.ASTNode + +/** + * + */ +internal abstract class AtTimeZoneOperatorMixin(node: ASTNode) : + SqlCompositeElementImpl(node), + SqlExpr, + PostgreSqlAtTimeZoneOperator diff --git a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt index ca2b67c4feb..2273c7df799 100644 --- a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt +++ b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt @@ -18,7 +18,7 @@ class PostgreSqlFixturesTest(name: String, fixtureRoot: File) : FixturesTest(nam "BLOB" to "TEXT", "id TEXT GENERATED ALWAYS AS (2) UNIQUE NOT NULL" to "id TEXT GENERATED ALWAYS AS (2) STORED UNIQUE NOT NULL", "'(', ')', ',', '.', , BETWEEN or IN expected, got ','" - to "'#-', '(', ')', ',', '.', , , , , '@@', BETWEEN or IN expected, got ','", + to "'#-', '(', ')', ',', '.', , , , , '@@', AT, BETWEEN or IN expected, got ','", ) override fun setupDialect() { diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/at-time-zone/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/at-time-zone/Test.s new file mode 100644 index 00000000000..2960b89eb3d --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/at-time-zone/Test.s @@ -0,0 +1,25 @@ +CREATE TABLE Tz( + ts TIMESTAMP WITHOUT TIME ZONE, + tstz TIMESTAMPTZ, + z TEXT +); + +SELECT CAST('2024-05-10T00:28:36+03' AS TIMESTAMPTZ) AT TIME ZONE 'America/Denver'; + +SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'America/Chicago'; + +SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'America/Denver'; + +SELECT TIMESTAMP WITHOUT TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'America/Chicago'; + +SELECT CURRENT_TIMESTAMP AT TIME ZONE 'America/Chicago'; + +SELECT CURRENT_TIMESTAMP(3) AT TIME ZONE 'America/Denver'; + +SELECT ts AT TIME ZONE 'America/Chicago' FROM Tz; + +SELECT tstz AT TIME ZONE 'America/Denver' FROM Tz; + +SELECT CAST(? AS TIMESTAMP) AT TIME ZONE 'America/Denver' FROM Tz; + +SELECT CAST(? AS TIMESTAMP) AT TIME ZONE z FROM Tz; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/TimeZone.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/TimeZone.sq new file mode 100644 index 00000000000..127fc7f9ac0 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/TimeZone.sq @@ -0,0 +1,22 @@ +CREATE TABLE Tz( + ts TIMESTAMP WITHOUT TIME ZONE, + tstz TIMESTAMPTZ, + zn TEXT DEFAULT 'America/Chicago' +); + +insert: +INSERT INTO Tz (ts, tstz) VALUES (?, ?); + +select: +SELECT +CAST('2024-05-10T00:28:36+03' AS TIMESTAMPTZ) AT TIME ZONE 'America/Denver', +TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'America/Chicago', +TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'America/Denver', +TIMESTAMP WITHOUT TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'America/Chicago', +ts AT TIME ZONE zn, +tstz AT TIME ZONE 'America/Denver', +CURRENT_TIMESTAMP AT TIME ZONE 'America/Chicago', +CURRENT_TIMESTAMP(3) AT TIME ZONE 'America/Denver', +CAST(? AS TIMESTAMPTZ) AT TIME ZONE 'America/Chicago', +CAST(? AS TIMESTAMP) AT TIME ZONE ? +FROM Tz; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index 4a9b5c7e53c..ef1283ab17f 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -908,4 +908,24 @@ class PostgreSqlTest { assertThat(b).isTrue() } } + + @Test + fun testAtTimeZone() { + val ts = LocalDateTime.of(2001, 2, 16, 20, 38, 40) + val tstz = OffsetDateTime.of(2001, 2, 16, 20, 38, 40, 0, ZoneOffset.ofHours(0)) + database.timeZoneQueries.insert(ts, tstz) + + with(database.timeZoneQueries.select(tstz, ts, "America/Chicago").executeAsOne()) { + assertThat(expr).isEqualTo(LocalDateTime.of(2024, 5, 9, 15, 28, 36)) + assertThat(expr_).isEqualTo(OffsetDateTime.of(2001, 2, 17, 2, 38, 40, 0, ZoneOffset.ofHours(0))) + assertThat(expr__).isEqualTo(LocalDateTime.of(2001, 2, 16, 18, 38, 40)) + assertThat(expr___).isEqualTo(OffsetDateTime.of(2001, 2, 17, 2, 38, 40, 0, ZoneOffset.ofHours(0))) + assertThat(expr____).isEqualTo(OffsetDateTime.of(2001, 2, 17, 2, 38, 40, 0, ZoneOffset.ofHours(0))) + assertThat(expr_____).isEqualTo(LocalDateTime.of(2001, 2, 16, 13, 38, 40)) + assertThat(expr______).isGreaterThan(LocalDateTime.MIN) + assertThat(expr_______).isGreaterThan(LocalDateTime.MIN) + assertThat(expr________).isEqualTo(LocalDateTime.of(2001, 2, 16, 14, 38, 40)) + assertThat(expr_________).isEqualTo(OffsetDateTime.of(2001, 2, 17, 2, 38, 40, 0, ZoneOffset.ofHours(0))) + } + } } From 5606c7ea71a0bb8162682a000582daacf2f577bf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 20 May 2024 20:33:28 -0400 Subject: [PATCH 148/304] Update agp to v8.4.1 (#5264) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ae5ff554943..d0c1bb2c378 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.2.1" -agp = "8.4.0" +agp = "8.4.1" compileSdk = "34" minSdk = "21" sqlPsi = "0.4.9" From a2b5696edf8e378b1372043f6d0c0ef48540b193 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 17:17:09 +0000 Subject: [PATCH 149/304] Update dependency org.xerial:sqlite-jdbc to v3.46.0.0 (#5276) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d0c1bb2c378..8f4d10280ce 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -68,7 +68,7 @@ sqlPsiEnvironment = { module = "com.alecstrong.sql.psi:environment", version.ref robolectric = { module = "org.robolectric:robolectric", version = "4.12.2" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } -sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.45.3.0" } +sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.46.0.0" } postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.3" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } From 06da7d5c8dec2e9155b874cce4c5da02c7910e68 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 29 May 2024 14:29:41 -0400 Subject: [PATCH 150/304] Update dependency com.squareup:kotlinpoet to v1.17.0 (#5272) * Update dependency com.squareup:kotlinpoet to v1.17.0 * Formatting * One more --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jake Wharton --- gradle/libs.versions.toml | 2 +- .../example/testmodule/TestDatabaseImpl.kt | 3 +- .../cash/sqldelight/core/QueriesTypeTest.kt | 15 ++++++---- .../cash/sqldelight/core/QueryWrapperTest.kt | 30 ++++++++++++------- .../core/async/AsyncQueriesTypeTest.kt | 3 +- .../core/async/AsyncQueryWrapperTest.kt | 3 +- .../cash/sqldelight/tests/MigrationTest.kt | 3 +- 7 files changed, 39 insertions(+), 20 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8f4d10280ce..c51fd78849a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -35,7 +35,7 @@ androidx-paging3-runtime = { module = "androidx.paging:paging-runtime", version. androidx-recyclerView = { module = "androidx.recyclerview:recyclerview", version = "1.3.2" } android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp" } -kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.16.0" } +kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.17.0" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } truth = { module = "com.google.truth:truth", version = "1.4.2" } diff --git a/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/testmodule/TestDatabaseImpl.kt b/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/testmodule/TestDatabaseImpl.kt index a535ba98c7e..518e6f68edf 100644 --- a/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/testmodule/TestDatabaseImpl.kt +++ b/sqldelight-compiler/integration-tests/src/test/kotlin/com/example/testmodule/TestDatabaseImpl.kt @@ -28,7 +28,8 @@ private class TestDatabaseImpl( driver: SqlDriver, playerAdapter: Player.Adapter, teamAdapter: Team.Adapter, -) : TransacterImpl(driver), TestDatabase { +) : TransacterImpl(driver), + TestDatabase { override val groupQueries: GroupQueries = GroupQueries(driver) override val playerQueries: PlayerQueries = PlayerQueries(driver, playerAdapter) diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt index 4802248de22..4a6fef64bc6 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt @@ -79,7 +79,8 @@ class QueriesTypeTest { | driver: SqlDriver, | data_Adapter: Data_.Adapter, | otherAdapter: Other.Adapter, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | override val dataQueries: DataQueries = DataQueries(driver, data_Adapter, otherAdapter) | | public object Schema : SqlSchema> { @@ -264,7 +265,8 @@ class QueriesTypeTest { |private class TestDatabaseImpl( | driver: SqlDriver, | data_Adapter: Data_.Adapter, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | override val dataQueries: DataQueries = DataQueries(driver, data_Adapter) | | public object Schema : SqlSchema> { @@ -362,7 +364,8 @@ class QueriesTypeTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | public object Schema : SqlSchema> { | override val version: Long | get() = 1 @@ -442,7 +445,8 @@ class QueriesTypeTest { |private class TestDatabaseImpl( | driver: SqlDriver, | data_Adapter: Data_.Adapter, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | override val dataQueries: DataQueries = DataQueries(driver, data_Adapter) | | public object Schema : SqlSchema> { @@ -598,7 +602,8 @@ class QueriesTypeTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | override val searchQueries: SearchQueries = SearchQueries(driver) | | public object Schema : SqlSchema> { diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueryWrapperTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueryWrapperTest.kt index 1a06f3d93d6..2ae409dc316 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueryWrapperTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueryWrapperTest.kt @@ -53,7 +53,8 @@ class QueryWrapperTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | public object Schema : SqlSchema> { | override val version: Long | get() = 1 @@ -141,7 +142,8 @@ class QueryWrapperTest { | driver: SqlDriver, | test_table2Adapter: Test_table2.Adapter, | test_tableAdapter: Test_table.Adapter, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | override val testQueries: TestQueries = TestQueries(driver, test_tableAdapter, test_table2Adapter) | | public object Schema : SqlSchema> { @@ -219,7 +221,8 @@ class QueryWrapperTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | public object Schema : SqlSchema> { | override val version: Long | get() = 1 @@ -313,7 +316,8 @@ class QueryWrapperTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | public object Schema : SqlSchema> { | override val version: Long | get() = 1 @@ -399,7 +403,8 @@ class QueryWrapperTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | public object Schema : SqlSchema> { | override val version: Long | get() = 1 @@ -483,7 +488,8 @@ class QueryWrapperTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | public object Schema : SqlSchema> { | override val version: Long | get() = 1 @@ -558,7 +564,8 @@ class QueryWrapperTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | public object Schema : SqlSchema> { | override val version: Long | get() = 1 @@ -654,7 +661,8 @@ class QueryWrapperTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | public object Schema : SqlSchema> { | override val version: Long | get() = 3 @@ -770,7 +778,8 @@ class QueryWrapperTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | override val queryQueries: QueryQueries = QueryQueries(driver) | | public object Schema : SqlSchema> { @@ -883,7 +892,8 @@ class QueryWrapperTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), TestDatabase { + |) : TransacterImpl(driver), + | TestDatabase { | public object Schema : SqlSchema> { | override val version: Long | get() = 1 diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueriesTypeTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueriesTypeTest.kt index 705a9d8e2ec..8ac3c14c456 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueriesTypeTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueriesTypeTest.kt @@ -80,7 +80,8 @@ class AsyncQueriesTypeTest { | driver: SqlDriver, | data_Adapter: Data_.Adapter, | otherAdapter: Other.Adapter, - |) : SuspendingTransacterImpl(driver), TestDatabase { + |) : SuspendingTransacterImpl(driver), + | TestDatabase { | override val dataQueries: DataQueries = DataQueries(driver, data_Adapter, otherAdapter) | | public object Schema : SqlSchema> { diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueryWrapperTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueryWrapperTest.kt index eaeb30bc187..c1d0b64214f 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueryWrapperTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/async/AsyncQueryWrapperTest.kt @@ -73,7 +73,8 @@ class AsyncQueryWrapperTest { | |private class TestDatabaseImpl( | driver: SqlDriver, - |) : SuspendingTransacterImpl(driver), TestDatabase { + |) : SuspendingTransacterImpl(driver), + | TestDatabase { | public object Schema : SqlSchema> { | override val version: Long | get() = 3 diff --git a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/MigrationTest.kt b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/MigrationTest.kt index 5fce8c39f7e..c54dc7d18c0 100644 --- a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/MigrationTest.kt +++ b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/MigrationTest.kt @@ -259,7 +259,8 @@ class MigrationTest { """ |private class DatabaseImpl( | driver: SqlDriver, - |) : TransacterImpl(driver), Database { + |) : TransacterImpl(driver), + | Database { | override val testQueries: TestQueries = TestQueries(driver) | | public object Schema : SqlSchema> { From a7d11d0fe97c583d9fb4eadee0117d5accdb35c0 Mon Sep 17 00:00:00 2001 From: Kyle Robinson Young Date: Sat, 1 Jun 2024 05:20:38 -0700 Subject: [PATCH 151/304] Fix typo in generateAsync description. (#5281) --- docs/common/gradle.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/common/gradle.md b/docs/common/gradle.md index 470002470a5..5c2b668bb8b 100644 --- a/docs/common/gradle.md +++ b/docs/common/gradle.md @@ -214,7 +214,7 @@ Defaults to `false`. Type: `Property` -If set to true, SQLDelight will generate suspending query methods for us with asynchronous drivers. +If set to true, SQLDelight will generate suspending query methods for use with asynchronous drivers. Defaults to `false`. From fb48f4682c4f086d7d2f34e383b901ba4b91fd1a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 1 Jun 2024 09:59:15 -0400 Subject: [PATCH 152/304] Update dependency gradle to v8.8 (#5280) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 2 +- sample-web/gradle/wrapper/gradle-wrapper.properties | 2 +- sample/gradle/wrapper/gradle-wrapper.properties | 2 +- sample/gradlew | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b82aa23a4f0..a4413138c96 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 1aa94a42690..b740cf13397 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. diff --git a/sample-web/gradle/wrapper/gradle-wrapper.properties b/sample-web/gradle/wrapper/gradle-wrapper.properties index b82aa23a4f0..a4413138c96 100644 --- a/sample-web/gradle/wrapper/gradle-wrapper.properties +++ b/sample-web/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample/gradle/wrapper/gradle-wrapper.properties b/sample/gradle/wrapper/gradle-wrapper.properties index b82aa23a4f0..a4413138c96 100644 --- a/sample/gradle/wrapper/gradle-wrapper.properties +++ b/sample/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample/gradlew b/sample/gradlew index 1aa94a42690..b740cf13397 100755 --- a/sample/gradlew +++ b/sample/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. From f77d50a58413c5c74bc0db919d821275d6ac9438 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 20:43:17 +0000 Subject: [PATCH 153/304] Update agp to v8.4.2 (#5295) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c51fd78849a..99654db28ad 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.2.1" -agp = "8.4.1" +agp = "8.4.2" compileSdk = "34" minSdk = "21" sqlPsi = "0.4.9" From 6fa1522ca3e87b8e1379891a7d30422489198753 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 12 Jun 2024 16:45:54 -0400 Subject: [PATCH 154/304] Update plugin com.gradle.develocity to v3.17.5 (#5299) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index af8e50b7299..73510e3b9b4 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.4" + id "com.gradle.develocity" version "3.17.5" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index 066e501bade..c492a90b09e 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.4" + id "com.gradle.develocity" version "3.17.5" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/settings.gradle b/settings.gradle index 10c6fb8358b..c83b02e7f03 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.4" + id "com.gradle.develocity" version "3.17.5" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } From 2b8c4374dc6d5669c5047e80e47cb849b8aaa5fa Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 19:07:51 +0000 Subject: [PATCH 155/304] Update agp to v8.5.0 (#5300) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 99654db28ad..bb501d604d0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.2.1" -agp = "8.4.2" +agp = "8.5.0" compileSdk = "34" minSdk = "21" sqlPsi = "0.4.9" From f8ea13615a5978fdf9125a92b3f16df9918c25b3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 10:08:42 -0400 Subject: [PATCH 156/304] Update dependency org.hsqldb:hsqldb to v2.7.3 (#5279) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sqldelight-gradle-plugin/src/test/integration-hsql/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldelight-gradle-plugin/src/test/integration-hsql/build.gradle b/sqldelight-gradle-plugin/src/test/integration-hsql/build.gradle index 3cf3fb35908..229226f6569 100644 --- a/sqldelight-gradle-plugin/src/test/integration-hsql/build.gradle +++ b/sqldelight-gradle-plugin/src/test/integration-hsql/build.gradle @@ -13,7 +13,7 @@ sqldelight { } dependencies { - implementation "org.hsqldb:hsqldb:2.7.2" + implementation "org.hsqldb:hsqldb:2.7.3" implementation "app.cash.sqldelight:jdbc-driver:${app.cash.sqldelight.VersionKt.VERSION}" implementation libs.truth } From 6aa2924c49dff814e1d4f757e15d723848969724 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Jun 2024 18:45:12 +0000 Subject: [PATCH 157/304] Update dependency com.pinterest.ktlint:ktlint-cli to v1.3.0 (#5285) * Update dependency com.pinterest.ktlint:ktlint-cli to v1.3.0 * Disable expression rule * Reformat * Reformat again * Manual format --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jake Wharton --- build.gradle | 2 ++ .../hsql/grammar/mixins/ResultColumnMixin.kt | 4 +++- .../postgresql/grammar/mixins/ColumnDefMixin.kt | 4 +++- .../postgresql/grammar/mixins/CopyMixin.kt | 4 +++- .../postgresql/grammar/mixins/CreateIndexMixin.kt | 6 +++--- .../grammar/mixins/DistinctOnExpressionMixin.kt | 3 ++- .../grammar/mixins/ReturningClauseMixin.kt | 4 +++- .../grammar/mixins/SqlDeleteStmtLimitedMixin.kt | 3 ++- .../grammar/mixins/SqlInsertStmtMixin.kt | 3 ++- .../sqlite_3_24/grammar/mixins/InsertStmtMixin.kt | 6 ++++-- .../grammar/mixins/ResultColumnMixin.kt | 4 +++- .../sqlite_3_35/grammar/mixins/InsertStmtMixin.kt | 6 ++++-- .../dialects/sqlite/json/module/JsonModule.kt | 3 +-- .../module/grammar/mixins/TableOrSubqueryMixin.kt | 9 +++++++-- .../driver/android/AndroidSqliteDriver.kt | 3 ++- .../app/cash/sqldelight/driver/jdbc/JdbcDriver.kt | 4 +++- .../sqldelight/driver/native/NativeSqlDatabase.kt | 3 ++- .../cash/sqldelight/driver/r2dbc/R2dbcDriver.kt | 4 +++- .../driver/jdbc/sqlite/JdbcSqliteDriver.kt | 3 ++- .../widget/BatchingListUpdateCallback.kt | 9 ++++++--- .../app/cash/sqldelight/rx2/RxJavaExtensions.kt | 4 +++- .../app/cash/sqldelight/rx2/RecordingObserver.kt | 3 ++- .../app/cash/sqldelight/rx3/RxJavaExtensions.kt | 4 +++- .../app/cash/sqldelight/rx3/RecordingObserver.kt | 3 ++- gradle/libs.versions.toml | 2 +- .../kotlin/app/cash/sqldelight/Transacter.kt | 14 ++++++++++---- .../cash/sqldelight/db/OptimisticLockException.kt | 3 +-- .../sqldelight/dialect/api/PragmaWithResults.kt | 4 +++- .../dialect/grammar/mixins/BindParameterMixin.kt | 4 +++- .../core/compiler/MutatorQueryGenerator.kt | 9 +++++---- .../sqldelight/core/compiler/model/NamedQuery.kt | 3 ++- .../sqldelight/core/lang/psi/ColumnTypeMixin.kt | 3 ++- .../shared/common/data/SqlDriverFactoryProvider.kt | 2 +- .../app/cash/sqldelight/intellij/ProjectService.kt | 4 +++- .../intellij/SqlDelightReferenceContributor.kt | 3 +-- .../intellij/actions/BaseGenerateAction.kt | 5 +++-- .../intellij/inspections/UnusedColumnInspection.kt | 3 +-- .../suppression/SqlDelightInspectionSuppressor.kt | 9 +++++---- .../SqlDelightSuppressInspectionQuickFix.kt | 3 +-- .../intellij/intentions/AddImportIntention.kt | 4 +++- .../intentions/AddOptimisticLockIntention.kt | 4 +++- .../intellij/lang/SqlDelightFoldingBuilder.kt | 4 +++- .../intellij/lang/SqlDelightHighlightVisitor.kt | 4 +++- .../notifications/FileIndexingNotification.kt | 3 ++- .../intellij/run/ArgumentsInputDialogImpl.kt | 3 ++- .../testData/find-usages/ExampleQueries.kt | 2 +- .../unused-query-inspection/SomeTableQueries.kt | 2 +- 47 files changed, 130 insertions(+), 68 deletions(-) diff --git a/build.gradle b/build.gradle index 9db7c9dfdae..09872f490d8 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,8 @@ spotless { ktlint(libs.versions.ktlint.get()).editorConfigOverride([ "ktlint_standard_discouraged-comment-location": "disabled", "ktlint_standard_package-name": "disabled", + // Making something an expression body should be a choice around readability. + 'ktlint_standard_function-expression-body': 'disabled', ]) } } diff --git a/dialects/hsql/src/main/kotlin/app/cash/sqldelight/dialects/hsql/grammar/mixins/ResultColumnMixin.kt b/dialects/hsql/src/main/kotlin/app/cash/sqldelight/dialects/hsql/grammar/mixins/ResultColumnMixin.kt index b24ad4ea305..fc4b96f7aec 100644 --- a/dialects/hsql/src/main/kotlin/app/cash/sqldelight/dialects/hsql/grammar/mixins/ResultColumnMixin.kt +++ b/dialects/hsql/src/main/kotlin/app/cash/sqldelight/dialects/hsql/grammar/mixins/ResultColumnMixin.kt @@ -7,7 +7,9 @@ import com.alecstrong.sql.psi.core.psi.QueryElement.QueryResult import com.alecstrong.sql.psi.core.psi.impl.SqlResultColumnImpl import com.intellij.lang.ASTNode -internal abstract class ResultColumnMixin(node: ASTNode) : SqlResultColumnImpl(node), HsqlResultColumn { +internal abstract class ResultColumnMixin(node: ASTNode) : + SqlResultColumnImpl(node), + HsqlResultColumn { private val queryExposed = ModifiableFileLazy lazy@{ if (windowFunctionInvocation != null) { var column = QueryElement.QueryColumn(this) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ColumnDefMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ColumnDefMixin.kt index fdc2b40143b..e84667c02da 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ColumnDefMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ColumnDefMixin.kt @@ -5,7 +5,9 @@ import com.alecstrong.sql.psi.core.psi.SqlColumnDef import com.alecstrong.sql.psi.core.psi.impl.SqlColumnDefImpl import com.intellij.lang.ASTNode -internal open class ColumnDefMixin(node: ASTNode) : SqlColumnDefImpl(node), SqlColumnDef { +internal open class ColumnDefMixin(node: ASTNode) : + SqlColumnDefImpl(node), + SqlColumnDef { override fun hasDefaultValue(): Boolean { return isSerial() || super.hasDefaultValue() diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CopyMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CopyMixin.kt index 8c69b7603f3..2725cfb1cb4 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CopyMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CopyMixin.kt @@ -7,7 +7,9 @@ import com.alecstrong.sql.psi.core.psi.SqlTableName import com.intellij.lang.ASTNode import com.intellij.psi.PsiElement -internal abstract class CopyMixin(node: ASTNode) : SqlCompositeElementImpl(node), PostgreSqlCopyStdin { +internal abstract class CopyMixin(node: ASTNode) : + SqlCompositeElementImpl(node), + PostgreSqlCopyStdin { override fun queryAvailable(child: PsiElement): Collection { val tableName = child.parent.children.filterIsInstance().single() return tableAvailable(child, tableName.name) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CreateIndexMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CreateIndexMixin.kt index e7f42e3bc1f..9281344d544 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CreateIndexMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/CreateIndexMixin.kt @@ -14,12 +14,12 @@ import com.intellij.psi.PsiElement * brin = [autosummarize (on|off|true|false), pages_per_range (1-2147483647) ] */ internal abstract class CreateIndexMixin(node: ASTNode) : - SqlCreateIndexStmtImpl(node), PostgreSqlCreateIndexStmt { + SqlCreateIndexStmtImpl(node), + PostgreSqlCreateIndexStmt { override fun annotate(annotationHolder: SqlAnnotationHolder) { withStorageParameter?.let { wsp -> - wsp.storageParametersList.zip(wsp.storageParameterList).forEach { - sp -> + wsp.storageParametersList.zip(wsp.storageParameterList).forEach { sp -> indexMethod?.let { im -> when (im.text.lowercase()) { "brin" -> when (sp.first.text) { diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DistinctOnExpressionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DistinctOnExpressionMixin.kt index 6ebe4fb1aba..16f69b4938b 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DistinctOnExpressionMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DistinctOnExpressionMixin.kt @@ -13,7 +13,8 @@ import com.intellij.psi.PsiElement import com.intellij.psi.util.PsiTreeUtil internal abstract class DistinctOnExpressionMixin(node: ASTNode) : - SqlCompositeElementImpl(node), PostgreSqlDistinctOnExpr { + SqlCompositeElementImpl(node), + PostgreSqlDistinctOnExpr { private val distinctOnColumns get() = children.filterIsInstance() diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ReturningClauseMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ReturningClauseMixin.kt index 892a3dab661..08814215572 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ReturningClauseMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ReturningClauseMixin.kt @@ -16,7 +16,9 @@ import com.intellij.lang.ASTNode import com.intellij.psi.util.PsiTreeUtil internal abstract class ReturningClauseMixin(node: ASTNode) : - SqlCompositeElementImpl(node), PostgreSqlReturningClause, FromQuery { + SqlCompositeElementImpl(node), + PostgreSqlReturningClause, + FromQuery { private val queryExposed = ModifiableFileLazy { listOf( diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlDeleteStmtLimitedMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlDeleteStmtLimitedMixin.kt index f041548bff9..5bd5e92eea0 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlDeleteStmtLimitedMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlDeleteStmtLimitedMixin.kt @@ -10,7 +10,8 @@ import com.intellij.psi.PsiElement internal abstract class SqlDeleteStmtLimitedMixin( node: ASTNode, -) : SqlDeleteStmtLimitedImpl(node), PostgreSqlDeleteStmtLimited { +) : SqlDeleteStmtLimitedImpl(node), + PostgreSqlDeleteStmtLimited { override fun tablesAvailable(child: PsiElement): Collection { val tablesAvailable = super.tablesAvailable(child) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlInsertStmtMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlInsertStmtMixin.kt index c43a4d3f868..e92263556c1 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlInsertStmtMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlInsertStmtMixin.kt @@ -10,7 +10,8 @@ import com.intellij.psi.PsiElement internal abstract class SqlInsertStmtMixin( node: ASTNode, -) : SqlInsertStmtImpl(node), PostgreSqlInsertStmt { +) : SqlInsertStmtImpl(node), + PostgreSqlInsertStmt { override fun tablesAvailable(child: PsiElement): Collection { val tablesAvailable = super.tablesAvailable(child) diff --git a/dialects/sqlite-3-24/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_24/grammar/mixins/InsertStmtMixin.kt b/dialects/sqlite-3-24/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_24/grammar/mixins/InsertStmtMixin.kt index fafdf234922..73ab5a77b17 100644 --- a/dialects/sqlite-3-24/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_24/grammar/mixins/InsertStmtMixin.kt +++ b/dialects/sqlite-3-24/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_24/grammar/mixins/InsertStmtMixin.kt @@ -33,8 +33,10 @@ internal abstract class InsertStmtMixin( insertOr != null && insertOr.elementType == SqlTypes.OR -> { val type = insertOr.treeNext.elementType check( - type == SqlTypes.ROLLBACK || type == SqlTypes.ABORT || - type == SqlTypes.FAIL || type == SqlTypes.IGNORE, + type == SqlTypes.ROLLBACK || + type == SqlTypes.ABORT || + type == SqlTypes.FAIL || + type == SqlTypes.IGNORE, ) type } diff --git a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/ResultColumnMixin.kt b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/ResultColumnMixin.kt index 9eeff1bac85..db37d7a7d07 100644 --- a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/ResultColumnMixin.kt +++ b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/ResultColumnMixin.kt @@ -7,7 +7,9 @@ import com.alecstrong.sql.psi.core.psi.QueryElement.QueryResult import com.alecstrong.sql.psi.core.psi.impl.SqlResultColumnImpl import com.intellij.lang.ASTNode -internal abstract class ResultColumnMixin(node: ASTNode) : SqlResultColumnImpl(node), SqliteResultColumn { +internal abstract class ResultColumnMixin(node: ASTNode) : + SqlResultColumnImpl(node), + SqliteResultColumn { private val queryExposed = ModifiableFileLazy lazy@{ if (windowFunctionInvocation != null) { var column = QueryElement.QueryColumn(this) diff --git a/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/grammar/mixins/InsertStmtMixin.kt b/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/grammar/mixins/InsertStmtMixin.kt index f805d2c9ad2..e2a68e65910 100644 --- a/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/grammar/mixins/InsertStmtMixin.kt +++ b/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/grammar/mixins/InsertStmtMixin.kt @@ -37,8 +37,10 @@ internal abstract class InsertStmtMixin( insertOr != null && insertOr.elementType == SqlTypes.OR -> { val type = insertOr.treeNext.elementType check( - type == SqlTypes.ROLLBACK || type == SqlTypes.ABORT || - type == SqlTypes.FAIL || type == SqlTypes.IGNORE, + type == SqlTypes.ROLLBACK || + type == SqlTypes.ABORT || + type == SqlTypes.FAIL || + type == SqlTypes.IGNORE, ) type } diff --git a/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/JsonModule.kt b/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/JsonModule.kt index 44c1176a6d2..a25516da920 100644 --- a/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/JsonModule.kt +++ b/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/JsonModule.kt @@ -17,8 +17,7 @@ class JsonModule : SqlDelightModule { } } -private class JsonTypeResolver(private val parentResolver: TypeResolver) : - TypeResolver by parentResolver { +private class JsonTypeResolver(private val parentResolver: TypeResolver) : TypeResolver by parentResolver { override fun functionType(functionExpr: SqlFunctionExpr): IntermediateType? { when (functionExpr.functionName.text) { "json_array", "json", "json_insert", "json_replace", "json_set", "json_object", "json_patch", diff --git a/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/mixins/TableOrSubqueryMixin.kt b/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/mixins/TableOrSubqueryMixin.kt index 528d33c6b48..c99acd30f72 100644 --- a/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/mixins/TableOrSubqueryMixin.kt +++ b/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/mixins/TableOrSubqueryMixin.kt @@ -17,7 +17,9 @@ import com.intellij.lang.ASTNode import com.intellij.lang.PsiBuilder import com.intellij.psi.PsiElement -internal abstract class TableOrSubqueryMixin(node: ASTNode?) : SqlTableOrSubqueryImpl(node), SqliteJsonTableOrSubquery { +internal abstract class TableOrSubqueryMixin(node: ASTNode?) : + SqlTableOrSubqueryImpl(node), + SqliteJsonTableOrSubquery { private val queryExposed = ModifiableFileLazy lazy@{ if (jsonFunctionName != null) { return@lazy listOf( @@ -44,7 +46,10 @@ internal abstract class TableOrSubqueryMixin(node: ASTNode?) : SqlTableOrSubquer } } -internal abstract class JsonFunctionNameMixin(node: ASTNode) : SqlNamedElementImpl(node), SqlTableName, ExposableType { +internal abstract class JsonFunctionNameMixin(node: ASTNode) : + SqlNamedElementImpl(node), + SqlTableName, + ExposableType { override fun getId(): PsiElement? = null override fun getString(): PsiElement? = null override val parseRule: (PsiBuilder, Int) -> Boolean = JsonParser::json_function_name_real diff --git a/drivers/android-driver/src/main/java/app/cash/sqldelight/driver/android/AndroidSqliteDriver.kt b/drivers/android-driver/src/main/java/app/cash/sqldelight/driver/android/AndroidSqliteDriver.kt index a48a0cc0b44..4a6a957312f 100644 --- a/drivers/android-driver/src/main/java/app/cash/sqldelight/driver/android/AndroidSqliteDriver.kt +++ b/drivers/android-driver/src/main/java/app/cash/sqldelight/driver/android/AndroidSqliteDriver.kt @@ -271,7 +271,8 @@ private class AndroidQuery( private val database: SupportSQLiteDatabase, override val argCount: Int, private val windowSizeBytes: Long?, -) : SupportSQLiteQuery, AndroidStatement { +) : SupportSQLiteQuery, + AndroidStatement { private val binds = MutableList<((SupportSQLiteProgram) -> Unit)?>(argCount) { null } override fun bindBytes(index: Int, bytes: ByteArray?) { diff --git a/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt b/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt index 58f9d6e727f..a7d1ac54b1e 100644 --- a/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt +++ b/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt @@ -74,7 +74,9 @@ interface ConnectionManager { } } -abstract class JdbcDriver : SqlDriver, ConnectionManager { +abstract class JdbcDriver : + SqlDriver, + ConnectionManager { override fun close() { } diff --git a/drivers/native-driver/src/nativeMain/kotlin/app/cash/sqldelight/driver/native/NativeSqlDatabase.kt b/drivers/native-driver/src/nativeMain/kotlin/app/cash/sqldelight/driver/native/NativeSqlDatabase.kt index 9ab1950735c..dd9a6fa0ff8 100644 --- a/drivers/native-driver/src/nativeMain/kotlin/app/cash/sqldelight/driver/native/NativeSqlDatabase.kt +++ b/drivers/native-driver/src/nativeMain/kotlin/app/cash/sqldelight/driver/native/NativeSqlDatabase.kt @@ -100,7 +100,8 @@ sealed class ConnectionWrapper : SqlDriver { class NativeSqliteDriver( private val databaseManager: DatabaseManager, maxReaderConnections: Int = 1, -) : ConnectionWrapper(), SqlDriver { +) : ConnectionWrapper(), + SqlDriver { constructor( configuration: DatabaseConfiguration, maxReaderConnections: Int = 1, diff --git a/drivers/r2dbc-driver/src/main/kotlin/app/cash/sqldelight/driver/r2dbc/R2dbcDriver.kt b/drivers/r2dbc-driver/src/main/kotlin/app/cash/sqldelight/driver/r2dbc/R2dbcDriver.kt index dcf5ab466ea..42b3219c976 100644 --- a/drivers/r2dbc-driver/src/main/kotlin/app/cash/sqldelight/driver/r2dbc/R2dbcDriver.kt +++ b/drivers/r2dbc-driver/src/main/kotlin/app/cash/sqldelight/driver/r2dbc/R2dbcDriver.kt @@ -299,7 +299,9 @@ internal class AsyncPublisherIterator( } class R2dbcCursor -internal constructor(private val results: AsyncPublisherIterator>) : SqlCursor { +internal constructor( + private val results: AsyncPublisherIterator>, +) : SqlCursor { private lateinit var currentRow: List override fun next(): QueryResult.AsyncValue = QueryResult.AsyncValue { diff --git a/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver.kt b/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver.kt index 026dde712d4..08dba1e3535 100644 --- a/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver.kt +++ b/drivers/sqlite-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/sqlite/JdbcSqliteDriver.kt @@ -34,7 +34,8 @@ class JdbcSqliteDriver constructor( */ url: String, properties: Properties = Properties(), -) : JdbcDriver(), ConnectionManager by connectionManager(url, properties) { +) : JdbcDriver(), + ConnectionManager by connectionManager(url, properties) { private val listeners = linkedMapOf>() override fun addListener(vararg queryKeys: String, listener: Query.Listener) { diff --git a/extensions/androidx-paging3/src/commonTest/kotlin/androidx/recyclerview/widget/BatchingListUpdateCallback.kt b/extensions/androidx-paging3/src/commonTest/kotlin/androidx/recyclerview/widget/BatchingListUpdateCallback.kt index 6b988362997..9552e8918b9 100755 --- a/extensions/androidx-paging3/src/commonTest/kotlin/androidx/recyclerview/widget/BatchingListUpdateCallback.kt +++ b/extensions/androidx-paging3/src/commonTest/kotlin/androidx/recyclerview/widget/BatchingListUpdateCallback.kt @@ -67,7 +67,8 @@ class BatchingListUpdateCallback(callback: ListUpdateCallback) : ListUpdateCallb } override fun onInserted(position: Int, count: Int) { - if (mLastEventType == TYPE_ADD && position >= mLastEventPosition && + if (mLastEventType == TYPE_ADD && + position >= mLastEventPosition && position <= mLastEventPosition + mLastEventCount ) { mLastEventCount += count @@ -81,7 +82,8 @@ class BatchingListUpdateCallback(callback: ListUpdateCallback) : ListUpdateCallb } override fun onRemoved(position: Int, count: Int) { - if (mLastEventType == TYPE_REMOVE && mLastEventPosition >= position && + if (mLastEventType == TYPE_REMOVE && + mLastEventPosition >= position && mLastEventPosition <= position + count ) { mLastEventCount += count @@ -103,7 +105,8 @@ class BatchingListUpdateCallback(callback: ListUpdateCallback) : ListUpdateCallb if (mLastEventType == TYPE_CHANGE && !( position > mLastEventPosition + mLastEventCount || - position + count < mLastEventPosition || mLastEventPayload != payload + position + count < mLastEventPosition || + mLastEventPayload != payload ) ) { // take potential overlap into account diff --git a/extensions/rxjava2-extensions/src/main/kotlin/app/cash/sqldelight/rx2/RxJavaExtensions.kt b/extensions/rxjava2-extensions/src/main/kotlin/app/cash/sqldelight/rx2/RxJavaExtensions.kt index 85a1a5829b1..b7c715e72ae 100644 --- a/extensions/rxjava2-extensions/src/main/kotlin/app/cash/sqldelight/rx2/RxJavaExtensions.kt +++ b/extensions/rxjava2-extensions/src/main/kotlin/app/cash/sqldelight/rx2/RxJavaExtensions.kt @@ -40,7 +40,9 @@ private class QueryOnSubscribe( private class QueryListenerAndDisposable( private val emitter: ObservableEmitter>, private val query: Query, -) : AtomicBoolean(), Query.Listener, Disposable { +) : AtomicBoolean(), + Query.Listener, + Disposable { override fun queryResultsChanged() { emitter.onNext(query) } diff --git a/extensions/rxjava2-extensions/src/test/kotlin/app/cash/sqldelight/rx2/RecordingObserver.kt b/extensions/rxjava2-extensions/src/test/kotlin/app/cash/sqldelight/rx2/RecordingObserver.kt index 1b2f40a1975..a86df96b0da 100644 --- a/extensions/rxjava2-extensions/src/test/kotlin/app/cash/sqldelight/rx2/RecordingObserver.kt +++ b/extensions/rxjava2-extensions/src/test/kotlin/app/cash/sqldelight/rx2/RecordingObserver.kt @@ -38,8 +38,9 @@ internal class RecordingObserver(val numberOfColumns: Int) : DisposableObserver< override fun onNext(value: Query<*>) { val allRows = value.execute { cursor -> val data = mutableListOf>() - while (cursor.next().value) + while (cursor.next().value) { data.add((0 until numberOfColumns).map(cursor::getString)) + } QueryResult.Value(data) }.value events.add(allRows) diff --git a/extensions/rxjava3-extensions/src/main/kotlin/app/cash/sqldelight/rx3/RxJavaExtensions.kt b/extensions/rxjava3-extensions/src/main/kotlin/app/cash/sqldelight/rx3/RxJavaExtensions.kt index be2c77d839c..b0634580a17 100644 --- a/extensions/rxjava3-extensions/src/main/kotlin/app/cash/sqldelight/rx3/RxJavaExtensions.kt +++ b/extensions/rxjava3-extensions/src/main/kotlin/app/cash/sqldelight/rx3/RxJavaExtensions.kt @@ -40,7 +40,9 @@ private class QueryOnSubscribe( private class QueryListenerAndDisposable( private val emitter: ObservableEmitter>, private val query: Query, -) : AtomicBoolean(), Query.Listener, Disposable { +) : AtomicBoolean(), + Query.Listener, + Disposable { override fun queryResultsChanged() { emitter.onNext(query) } diff --git a/extensions/rxjava3-extensions/src/test/kotlin/app/cash/sqldelight/rx3/RecordingObserver.kt b/extensions/rxjava3-extensions/src/test/kotlin/app/cash/sqldelight/rx3/RecordingObserver.kt index e0fc3ba94b7..8eef5dd05d8 100644 --- a/extensions/rxjava3-extensions/src/test/kotlin/app/cash/sqldelight/rx3/RecordingObserver.kt +++ b/extensions/rxjava3-extensions/src/test/kotlin/app/cash/sqldelight/rx3/RecordingObserver.kt @@ -38,8 +38,9 @@ internal class RecordingObserver(val numberOfColumns: Int) : DisposableObserver< override fun onNext(value: Query<*>) { val allRows = value.execute { cursor -> val data = mutableListOf>() - while (cursor.next().value) + while (cursor.next().value) { data.add((0 until numberOfColumns).map(cursor::getString)) + } QueryResult.Value(data) }.value events.add(allRows) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bb501d604d0..b2824c6a24c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ sqliter = "1.3.1" sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" -ktlint = "1.2.1" +ktlint = "1.3.0" agp = "8.5.0" compileSdk = "34" minSdk = "21" diff --git a/runtime/src/commonMain/kotlin/app/cash/sqldelight/Transacter.kt b/runtime/src/commonMain/kotlin/app/cash/sqldelight/Transacter.kt index 6e036d5c63a..1abf6ec5759 100644 --- a/runtime/src/commonMain/kotlin/app/cash/sqldelight/Transacter.kt +++ b/runtime/src/commonMain/kotlin/app/cash/sqldelight/Transacter.kt @@ -191,7 +191,8 @@ private class RollbackException(val value: Any? = null) : Throwable() private class TransactionWrapper( val transaction: Transaction, -) : TransactionWithoutReturn, TransactionWithReturn { +) : TransactionWithoutReturn, + TransactionWithReturn { override fun rollback(): Nothing { transaction.checkThreadConfinement() throw RollbackException() @@ -226,7 +227,8 @@ private class TransactionWrapper( private class SuspendingTransactionWrapper( val transaction: Transaction, -) : SuspendingTransactionWithoutReturn, SuspendingTransactionWithReturn { +) : SuspendingTransactionWithoutReturn, + SuspendingTransactionWithReturn { override fun rollback(): Nothing { transaction.checkThreadConfinement() throw RollbackException() @@ -341,7 +343,9 @@ abstract class BaseTransacterImpl(protected val driver: SqlDriver) { /** * A transaction-aware [SqlDriver] wrapper which can begin a [Transaction] on the current connection. */ -abstract class TransacterImpl(driver: SqlDriver) : BaseTransacterImpl(driver), Transacter { +abstract class TransacterImpl(driver: SqlDriver) : + BaseTransacterImpl(driver), + Transacter { override fun transaction( noEnclosing: Boolean, body: TransactionWithoutReturn.() -> Unit, @@ -378,7 +382,9 @@ abstract class TransacterImpl(driver: SqlDriver) : BaseTransacterImpl(driver), T } } -abstract class SuspendingTransacterImpl(driver: SqlDriver) : BaseTransacterImpl(driver), SuspendingTransacter { +abstract class SuspendingTransacterImpl(driver: SqlDriver) : + BaseTransacterImpl(driver), + SuspendingTransacter { override suspend fun transactionWithResult( noEnclosing: Boolean, bodyWithReturn: suspend SuspendingTransactionWithReturn.() -> R, diff --git a/runtime/src/commonMain/kotlin/app/cash/sqldelight/db/OptimisticLockException.kt b/runtime/src/commonMain/kotlin/app/cash/sqldelight/db/OptimisticLockException.kt index f0d7f29f56b..1aea5456407 100644 --- a/runtime/src/commonMain/kotlin/app/cash/sqldelight/db/OptimisticLockException.kt +++ b/runtime/src/commonMain/kotlin/app/cash/sqldelight/db/OptimisticLockException.kt @@ -1,4 +1,3 @@ package app.cash.sqldelight.db -class OptimisticLockException(message: String?, cause: Throwable? = null) : - IllegalStateException(message, cause) +class OptimisticLockException(message: String?, cause: Throwable? = null) : IllegalStateException(message, cause) diff --git a/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/PragmaWithResults.kt b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/PragmaWithResults.kt index aec00728404..06c5c09e9ae 100644 --- a/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/PragmaWithResults.kt +++ b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/api/PragmaWithResults.kt @@ -14,7 +14,9 @@ class PragmaWithResults(pragmaStmt: SqlPragmaStmt) : QueryWithResults { override val pureTable: NamedElement? = null } -class SqlDelightPragmaName(node: ASTNode?) : SqlPragmaNameImpl(node), QueryElement { +class SqlDelightPragmaName(node: ASTNode?) : + SqlPragmaNameImpl(node), + QueryElement { override fun queryExposed() = listOf( QueryResult( column = this, diff --git a/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/grammar/mixins/BindParameterMixin.kt b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/grammar/mixins/BindParameterMixin.kt index ec7aa13969d..6f0ecaf2a65 100644 --- a/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/grammar/mixins/BindParameterMixin.kt +++ b/sqldelight-compiler/dialect/src/main/kotlin/app/cash/sqldelight/dialect/grammar/mixins/BindParameterMixin.kt @@ -4,7 +4,9 @@ import com.alecstrong.sql.psi.core.psi.SqlBindParameter import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl import com.intellij.lang.ASTNode -abstract class BindParameterMixin(node: ASTNode) : SqlCompositeElementImpl(node), SqlBindParameter { +abstract class BindParameterMixin(node: ASTNode) : + SqlCompositeElementImpl(node), + SqlBindParameter { /** * Overwrite, if the user provided sql parameter should be overwritten by sqldelight with [replaceWith]. * diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/MutatorQueryGenerator.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/MutatorQueryGenerator.kt index 77d2de40709..73052f6fb24 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/MutatorQueryGenerator.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/MutatorQueryGenerator.kt @@ -43,10 +43,11 @@ class MutatorQueryGenerator( val columns = trigger.columnNameList.map { it.name } val updateColumns = query.update.updateStmtSubsequentSetterList.map { it.columnName?.name } + query.update.columnNameList.map { it.name } - trigger.childOfType(SqlTypes.UPDATE) != null && ( - columns.isEmpty() || - updateColumns.any { it in columns } - ) + trigger.childOfType(SqlTypes.UPDATE) != null && + ( + columns.isEmpty() || + updateColumns.any { it in columns } + ) } } diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/NamedQuery.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/NamedQuery.kt index 7e868e80020..14c50649b7f 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/NamedQuery.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/compiler/model/NamedQuery.kt @@ -192,7 +192,8 @@ data class NamedQuery( if (typeOne.column !== typeTwo.column && typeOne.asNonNullable().cursorGetter(0) != typeTwo.asNonNullable().cursorGetter(0) && - typeOne.column != null && typeTwo.column != null + typeOne.column != null && + typeTwo.column != null ) { // Incompatible adapters. Revert to unadapted java type. return if (typeOne.javaType.copy(nullable = false) == typeTwo.javaType.copy(nullable = false)) { diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt index 379f59ae90f..50a50d5663f 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/ColumnTypeMixin.kt @@ -83,7 +83,8 @@ internal abstract class ColumnTypeMixin( }.singleOrNull() // Foreign Key ?.columnNameList?.singleOrNull() // Foreign Column - (tableForeignKeyClause ?: columnConstraint)?.reference?.resolve()?.let { resolvedKey -> // Resolved Column + (tableForeignKeyClause ?: columnConstraint)?.reference?.resolve()?.let { resolvedKey -> + // Resolved Column val dialectType = resolvedKey.asSafely() // Column Name ?.parent?.asSafely() // Column Definition ?.columnType?.asSafely() // Column type diff --git a/sqldelight-gradle-plugin/src/test/integration-multiplatform-async/src/jvmMain/kotlin/app/sqltest/shared/common/data/SqlDriverFactoryProvider.kt b/sqldelight-gradle-plugin/src/test/integration-multiplatform-async/src/jvmMain/kotlin/app/sqltest/shared/common/data/SqlDriverFactoryProvider.kt index 58d50921279..4cb66e77757 100644 --- a/sqldelight-gradle-plugin/src/test/integration-multiplatform-async/src/jvmMain/kotlin/app/sqltest/shared/common/data/SqlDriverFactoryProvider.kt +++ b/sqldelight-gradle-plugin/src/test/integration-multiplatform-async/src/jvmMain/kotlin/app/sqltest/shared/common/data/SqlDriverFactoryProvider.kt @@ -3,7 +3,7 @@ package app.sqltest.shared.common.data import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver -actual class SqlDriverFactoryProvider() { +actual class SqlDriverFactoryProvider { actual fun getDriverFactory(name: String): DriverFactory { return object : DriverFactory { override suspend fun createDriver(): SqlDriver { diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/ProjectService.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/ProjectService.kt index 5bc1d668c59..c4b2bfddc7a 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/ProjectService.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/ProjectService.kt @@ -58,7 +58,9 @@ import kotlin.reflect.jvm.jvmName import org.jetbrains.kotlin.idea.util.projectStructure.getModule import timber.log.Timber -class ProjectService(val project: Project) : SqlDelightProjectService, Disposable { +class ProjectService(val project: Project) : + SqlDelightProjectService, + Disposable { private var fileIndexes: FileIndexMap? private val loggingTree = LoggerTree(Logger.getInstance("SQLDelight[${project.name}]")) diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightReferenceContributor.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightReferenceContributor.kt index a2d38e461e4..ccc5b71ef7b 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightReferenceContributor.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/SqlDelightReferenceContributor.kt @@ -36,8 +36,7 @@ internal class SqlDelightReferenceContributor : PsiReferenceContributor() { ) } - internal class JavaTypeReference(element: JavaTypeMixin) : - PsiReferenceBase(element, element.lastChild.textRangeInParent) { + internal class JavaTypeReference(element: JavaTypeMixin) : PsiReferenceBase(element, element.lastChild.textRangeInParent) { override fun handleElementRename(newElementName: String): PsiElement { return element.setName(newElementName) diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/actions/BaseGenerateAction.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/actions/BaseGenerateAction.kt index 9621a7698f5..e07f5312561 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/actions/BaseGenerateAction.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/actions/BaseGenerateAction.kt @@ -13,8 +13,9 @@ internal abstract class BaseGenerateAction(private val handler: CodeInsightActio override fun isValidForFile(project: Project, editor: Editor, file: PsiFile): Boolean { val offset = editor.caretModel.offset - return file is SqlDelightFile && file.findElementAt(offset) - ?.parentOfType(true) != null + return file is SqlDelightFile && + file.findElementAt(offset) + ?.parentOfType(true) != null } override fun getHandler(): CodeInsightActionHandler = handler diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/UnusedColumnInspection.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/UnusedColumnInspection.kt index 5347d5a4040..25b692e70d7 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/UnusedColumnInspection.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/UnusedColumnInspection.kt @@ -69,8 +69,7 @@ internal class UnusedColumnInspection : LocalInspectionTool() { } } - class SafeDeleteQuickFix(createTableStmt: SqlCreateTableStmt, columnDef: SqlColumnDef) : - LocalQuickFixOnPsiElement(createTableStmt) { + class SafeDeleteQuickFix(createTableStmt: SqlCreateTableStmt, columnDef: SqlColumnDef) : LocalQuickFixOnPsiElement(createTableStmt) { private val createTableRef = SmartPointerManager.getInstance(createTableStmt.project) .createSmartPsiElementPointer(createTableStmt, createTableStmt.containingFile) diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/suppression/SqlDelightInspectionSuppressor.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/suppression/SqlDelightInspectionSuppressor.kt index 00fefe5fd54..942753f715f 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/suppression/SqlDelightInspectionSuppressor.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/suppression/SqlDelightInspectionSuppressor.kt @@ -58,10 +58,11 @@ internal class SqlDelightInspectionSuppressor : InspectionSuppressor { } ?: return false val matcher = commentPattern.matcher(comment.text) - return matcher.matches() && SuppressionUtil.isInspectionToolIdMentioned( - matcher.group(1), - toolId, - ) + return matcher.matches() && + SuppressionUtil.isInspectionToolIdMentioned( + matcher.group(1), + toolId, + ) } override fun getSuppressActions(element: PsiElement?, toolId: String): Array { diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/suppression/SqlDelightSuppressInspectionQuickFix.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/suppression/SqlDelightSuppressInspectionQuickFix.kt index dca311fde31..c8b4dfe3041 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/suppression/SqlDelightSuppressInspectionQuickFix.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/inspections/suppression/SqlDelightSuppressInspectionQuickFix.kt @@ -18,8 +18,7 @@ import com.intellij.psi.PsiParserFacade import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.parentOfTypes -internal class SqlDelightSuppressInspectionQuickFix(toolId: String) : - SuppressByCommentFix(toolId, PsiElement::class.java) { +internal class SqlDelightSuppressInspectionQuickFix(toolId: String) : SuppressByCommentFix(toolId, PsiElement::class.java) { override fun createSuppression(project: Project, element: PsiElement, container: PsiElement) { val commenter = LanguageCommenters.INSTANCE.forLanguage(SqlDelightLanguage) diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddImportIntention.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddImportIntention.kt index 17c70668401..bc2508102be 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddImportIntention.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddImportIntention.kt @@ -33,7 +33,9 @@ internal class AddImportIntention( private val element: PsiElement, private val classes: List, private val isAvailable: Boolean, -) : BaseElementAtCaretIntentionAction(), HintAction, QuestionAction { +) : BaseElementAtCaretIntentionAction(), + HintAction, + QuestionAction { override fun getFamilyName(): String = INTENTIONS_FAMILY_NAME_IMPORTS diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddOptimisticLockIntention.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddOptimisticLockIntention.kt index 10788c797b1..f47feea9733 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddOptimisticLockIntention.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/intentions/AddOptimisticLockIntention.kt @@ -18,7 +18,9 @@ import org.jetbrains.kotlin.idea.inspections.findExistingEditor class AddOptimisticLockIntention( private val updateElement: PsiElement, private val lock: ColumnDefMixin, -) : BaseElementAtCaretIntentionAction(), HintAction, QuestionAction { +) : BaseElementAtCaretIntentionAction(), + HintAction, + QuestionAction { override fun getFamilyName() = INTENTIONS_FAMILY_NAME_LOCK_FIX override fun isAvailable(project: Project, editor: Editor, element: PsiElement): Boolean { diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/lang/SqlDelightFoldingBuilder.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/lang/SqlDelightFoldingBuilder.kt index ccd98c8c9ee..7e0a35aa52c 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/lang/SqlDelightFoldingBuilder.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/lang/SqlDelightFoldingBuilder.kt @@ -33,7 +33,9 @@ import com.intellij.psi.PsiWhiteSpace import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.getChildOfType -class SqlDelightFoldingBuilder : FoldingBuilder, DumbAware { +class SqlDelightFoldingBuilder : + FoldingBuilder, + DumbAware { override fun buildFoldRegions(root: ASTNode, document: Document) = root.createFoldingDescriptors() diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/lang/SqlDelightHighlightVisitor.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/lang/SqlDelightHighlightVisitor.kt index 71a315673b4..20bcccbebaa 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/lang/SqlDelightHighlightVisitor.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/lang/SqlDelightHighlightVisitor.kt @@ -20,7 +20,9 @@ import com.intellij.openapi.editor.colors.TextAttributesKey import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile -class SqlDelightHighlightVisitor : SqlVisitor(), HighlightVisitor { +class SqlDelightHighlightVisitor : + SqlVisitor(), + HighlightVisitor { private var myHolder: HighlightInfoHolder? = null diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/notifications/FileIndexingNotification.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/notifications/FileIndexingNotification.kt index 41ee09c93d7..2a1ca4033bc 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/notifications/FileIndexingNotification.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/notifications/FileIndexingNotification.kt @@ -32,7 +32,8 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance class FileIndexingNotification( private val project: Project, -) : DumbAware, EditorNotificationProvider { +) : DumbAware, + EditorNotificationProvider { internal var unconfiguredReason: UnconfiguredReason = GradleSyncing set(value) { field = value diff --git a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/run/ArgumentsInputDialogImpl.kt b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/run/ArgumentsInputDialogImpl.kt index d87a53befd5..1b473237477 100644 --- a/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/run/ArgumentsInputDialogImpl.kt +++ b/sqldelight-idea-plugin/src/main/kotlin/app/cash/sqldelight/intellij/run/ArgumentsInputDialogImpl.kt @@ -18,7 +18,8 @@ internal interface ArgumentsInputDialog { internal class ArgumentsInputDialogImpl( project: Project, private val parameters: List, -) : DialogWrapper(project), ArgumentsInputDialog { +) : DialogWrapper(project), + ArgumentsInputDialog { init { init() diff --git a/sqldelight-idea-plugin/testData/find-usages/ExampleQueries.kt b/sqldelight-idea-plugin/testData/find-usages/ExampleQueries.kt index f026955d330..595248c3806 100644 --- a/sqldelight-idea-plugin/testData/find-usages/ExampleQueries.kt +++ b/sqldelight-idea-plugin/testData/find-usages/ExampleQueries.kt @@ -3,7 +3,7 @@ package com.example import Query import kotlin.Long -public class ExampleQueries() { +public class ExampleQueries { public fun selectById(id: Long): Query { return Query(Example(1, "foo")) diff --git a/sqldelight-idea-plugin/testData/unused-query-inspection/SomeTableQueries.kt b/sqldelight-idea-plugin/testData/unused-query-inspection/SomeTableQueries.kt index 1d197ecfff9..bf45e3205fd 100644 --- a/sqldelight-idea-plugin/testData/unused-query-inspection/SomeTableQueries.kt +++ b/sqldelight-idea-plugin/testData/unused-query-inspection/SomeTableQueries.kt @@ -3,7 +3,7 @@ package com.example import Query import kotlin.Long -public class SomeTableQueries() { +public class SomeTableQueries { public fun selectAll(): Query { return Query(Example(1, "foo")) From 6a8142b6fbbdd81874285114de4ffe3fbd43003f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:16:18 +0000 Subject: [PATCH 158/304] Update dependency org.mariadb:r2dbc-mariadb to v1.2.1 (#5314) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../src/test/integration-mysql-async/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldelight-gradle-plugin/src/test/integration-mysql-async/build.gradle b/sqldelight-gradle-plugin/src/test/integration-mysql-async/build.gradle index 2efdbcfc0e3..459685f861e 100644 --- a/sqldelight-gradle-plugin/src/test/integration-mysql-async/build.gradle +++ b/sqldelight-gradle-plugin/src/test/integration-mysql-async/build.gradle @@ -17,7 +17,7 @@ dependencies { implementation libs.mysqlJdbc implementation libs.testContainers.mysql implementation libs.testContainers.r2dbc - implementation "org.mariadb:r2dbc-mariadb:1.2.0" + implementation "org.mariadb:r2dbc-mariadb:1.2.1" implementation "app.cash.sqldelight:r2dbc-driver:${app.cash.sqldelight.VersionKt.VERSION}" implementation "app.cash.sqldelight:async-extensions:${app.cash.sqldelight.VersionKt.VERSION}" implementation libs.truth From 63ffbab7b24583be686a12406798d1e1bb8c420a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Wed, 26 Jun 2024 02:34:26 +0100 Subject: [PATCH 159/304] Fix 5313 Postgresql async bind parameter (#5319) * Add support for async bind params Async uses index from 1..column size $index sync uses "?" * Add test * Change test name --- .../sqldelight/core/lang/util/TreeUtil.kt | 9 +++- .../async/AsyncMutatorQueryTypeTest.kt | 42 +++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt index 8fc5b7a6d1e..ae24eaf8373 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt @@ -26,8 +26,10 @@ import app.cash.sqldelight.dialect.api.IntermediateType import app.cash.sqldelight.dialect.api.PrimitiveType import app.cash.sqldelight.dialect.api.PrimitiveType.INTEGER import app.cash.sqldelight.dialect.api.PrimitiveType.TEXT +import app.cash.sqldelight.dialect.grammar.mixins.BindParameterMixin import com.alecstrong.sql.psi.core.psi.AliasElement import com.alecstrong.sql.psi.core.psi.SqlAnnotatedElement +import com.alecstrong.sql.psi.core.psi.SqlBindExpr import com.alecstrong.sql.psi.core.psi.SqlColumnName import com.alecstrong.sql.psi.core.psi.SqlCreateTableStmt import com.alecstrong.sql.psi.core.psi.SqlCreateViewStmt @@ -176,6 +178,9 @@ private fun PsiElement.rangesToReplace(): List> { ), ) } else if (this is InsertStmtValuesMixin && parent?.acceptsTableInterface() == true) { + val generateAsync = this.sqFile().generateAsync + val bindExpr = childOfType(SqlTypes.BIND_EXPR) as SqlBindExpr + val bindParameterMixin = bindExpr.bindParameter as BindParameterMixin buildList { if (parent!!.columnNameList.isEmpty()) { add( @@ -191,8 +196,8 @@ private fun PsiElement.rangesToReplace(): List> { } add( Pair( - first = childOfType(SqlTypes.BIND_EXPR)!!.range, - second = parent!!.columns.joinToString(separator = ", ", prefix = "(", postfix = ")") { "?" }, + first = bindExpr.range, + second = (1..parent!!.columns.size).joinToString(separator = ", ", prefix = "(", postfix = ")") { bindParameterMixin.replaceWith(generateAsync, it) }, ), ) } diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/async/AsyncMutatorQueryTypeTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/async/AsyncMutatorQueryTypeTest.kt index 0b6891e17b8..9866e127a79 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/async/AsyncMutatorQueryTypeTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/async/AsyncMutatorQueryTypeTest.kt @@ -1,6 +1,7 @@ package app.cash.sqldelight.core.queries.async import app.cash.sqldelight.core.compiler.MutatorQueryGenerator +import app.cash.sqldelight.dialects.postgresql.PostgreSqlDialect import app.cash.sqldelight.test.util.FixtureCompiler import app.cash.sqldelight.test.util.withUnderscores import com.google.common.truth.Truth.assertThat @@ -142,4 +143,45 @@ class AsyncMutatorQueryTypeTest { """.trimMargin(), ) } + + @Test fun `Async Postgresql INSERT VALUES use correct bind parameter with the table data class`() { + val file = FixtureCompiler.parseSql( + """ + |CREATE TABLE data ( + | id INTEGER PRIMARY KEY, + | value TEXT + |); + | + |insertData: + |INSERT INTO data + |VALUES ?; + """.trimMargin(), + tempFolder, + dialect = PostgreSqlDialect(), + fileName = "Data.sq", + generateAsync = true, + ) + + val mutator = file.namedMutators.first() + val generator = MutatorQueryGenerator(mutator) + + assertThat(generator.function().toString()).isEqualTo( + """ + |public suspend fun insertData(data_: com.example.Data_) { + | driver.execute(208_179_736, ""${'"'} + | |INSERT INTO data (id, value) + | |VALUES (${'$'}1, ${'$'}2) + | ""${'"'}.trimMargin(), 2) { + | check(this is app.cash.sqldelight.driver.r2dbc.R2dbcPreparedStatement) + | bindInt(0, data_.id) + | bindString(1, data_.value_) + | }.await() + | notifyQueries(208_179_736) { emit -> + | emit("data") + | } + |} + | + """.trimMargin(), + ) + } } From 5c05adb0d61e5a4cd86d57277b8a8a032ea6ba57 Mon Sep 17 00:00:00 2001 From: Jake Wharton Date: Thu, 27 Jun 2024 16:24:04 -0400 Subject: [PATCH 160/304] Fix Spotless (#5323) --- .../app/cash/sqldelight/core/lang/psi/StmtIdentifierMixin.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/StmtIdentifierMixin.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/StmtIdentifierMixin.kt index 9a74736ab5e..59a4653bd7e 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/StmtIdentifierMixin.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/psi/StmtIdentifierMixin.kt @@ -51,7 +51,8 @@ abstract class StmtIdentifierMixin( } override fun annotate(annotationHolder: SqlAnnotationHolder) { - if (name != null && (containingFile as SqlDelightQueriesFile).sqlStatements() + if (name != null && + (containingFile as SqlDelightQueriesFile).sqlStatements() .filterNot { it.identifier == this } .any { it.identifier.name == name } ) { From 752f01dcfc9c3f44fc898db459d4ec98b487656c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Jun 2024 16:24:30 -0400 Subject: [PATCH 161/304] Update dependency androidx.test:core to v1.6.1 (#5315) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b2824c6a24c..049f1a98b9f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,7 +25,7 @@ kotlin-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-te kotlin-coroutines-reactive = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-reactive", version.ref = "kotlinCoroutines" } kotlin-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } -androidx-test-core = "androidx.test:core:1.5.0" +androidx-test-core = "androidx.test:core:1.6.1" androidx-test-runner = "androidx.test:runner:1.5.2" androidx-sqlite = { module = "androidx.sqlite:sqlite", version.ref = "androidxSqlite" } androidx-sqliteFramework = { module = "androidx.sqlite:sqlite-framework", version.ref = "androidxSqlite" } From deae6d788e8e19baa4e314e36fd7b78a3e16208a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Jun 2024 20:50:35 +0000 Subject: [PATCH 162/304] Update dependency androidx.test:runner to v1.6.1 (#5316) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 049f1a98b9f..88811c755fc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -26,7 +26,7 @@ kotlin-coroutines-reactive = { module = "org.jetbrains.kotlinx:kotlinx-coroutine kotlin-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } androidx-test-core = "androidx.test:core:1.6.1" -androidx-test-runner = "androidx.test:runner:1.5.2" +androidx-test-runner = "androidx.test:runner:1.6.1" androidx-sqlite = { module = "androidx.sqlite:sqlite", version.ref = "androidxSqlite" } androidx-sqliteFramework = { module = "androidx.sqlite:sqlite-framework", version.ref = "androidxSqlite" } app-cash-paging-common = { module = "app.cash.paging:paging-common", version.ref = "paging-mpp" } From 048cd53f3dc736cffa698ca794bb1d6d9641af1c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:34:12 +0000 Subject: [PATCH 163/304] Update dependency com.google.truth:truth to v1.4.3 (#5322) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 88811c755fc..49c595ef89e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -38,7 +38,7 @@ android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.17.0" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } -truth = { module = "com.google.truth:truth", version = "1.4.2" } +truth = { module = "com.google.truth:truth", version = "1.4.3" } turbine = { module = "app.cash.turbine:turbine", version = "1.1.0" } bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.1" } picnic = { module = "com.jakewharton.picnic:picnic", version = "0.7.0" } From 28b600b1c127d4b4ac906a52ab5d2143a34acd71 Mon Sep 17 00:00:00 2001 From: Vitor Hugo Schwaab Date: Mon, 1 Jul 2024 16:50:56 +0200 Subject: [PATCH 164/304] Add MacOS native targets (#5324) --- extensions/androidx-paging3/build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/extensions/androidx-paging3/build.gradle b/extensions/androidx-paging3/build.gradle index de43548be3f..239a690acfe 100755 --- a/extensions/androidx-paging3/build.gradle +++ b/extensions/androidx-paging3/build.gradle @@ -11,6 +11,8 @@ plugins { archivesBaseName = 'sqldelight-androidx-paging3' kotlin { + macosX64() + macosArm64() iosX64() iosArm64() iosSimulatorArm64() @@ -54,7 +56,7 @@ kotlin { } } - configure([targets.iosX64, targets.iosArm64, targets.iosSimulatorArm64]) { + configure([targets.iosX64, targets.iosArm64, targets.iosSimulatorArm64, targets.macosX64, targets.macosArm64]) { binaries.configureEach { // we only need to link sqlite for the test binaries if (outputKind == NativeOutputKind.TEST) { From 6060eed8d93818b080529c8b196305998cf9920a Mon Sep 17 00:00:00 2001 From: Leon Linhart Date: Tue, 2 Jul 2024 13:55:31 +0200 Subject: [PATCH 165/304] Consider foreign key table constraints when sorting initialization statements (#5325) --- .../sqldelight/core/lang/util/TreeUtil.kt | 2 +- .../cash/sqldelight/core/QueryWrapperTest.kt | 79 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt index ae24eaf8373..770b5c5d1b9 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt @@ -300,7 +300,7 @@ private fun ArrayList.buildGraph(): Graph graph.addVertex(table) table.columnDefList.forEach { column -> - column.columnConstraintList.mapNotNull { it.foreignKeyClause?.foreignTable }.forEach { fk -> + (column.columnConstraintList.mapNotNull { it.foreignKeyClause?.foreignTable } + table.tableConstraintList.mapNotNull { it.foreignKeyClause?.foreignTable }).forEach { fk -> try { val foreignTable = namedStatements[fk.name] graph.apply { diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueryWrapperTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueryWrapperTest.kt index 2ae409dc316..b32039a25bc 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueryWrapperTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueryWrapperTest.kt @@ -600,6 +600,85 @@ class QueryWrapperTest { ) } + @Test fun `queryWrapper puts foreign key constraint in correct order`() { + val result = FixtureCompiler.compileSql( + """ + CREATE TABLE child( + parent_id INTEGER, + + FOREIGN KEY (parent_id) REFERENCES parent(id) + ); + + CREATE TABLE parent( + id INTEGER PRIMARY KEY + ); + """.trimIndent(), + tempFolder, + overrideDialect = PostgreSqlDialect(), + ) + + assertThat(result.errors).isEmpty() + + val queryWrapperFile = result.compilerOutput[File(result.outputDirectory, "com/example/testmodule/TestDatabaseImpl.kt")] + + assertThat(queryWrapperFile).isNotNull() + assertThat(queryWrapperFile.toString()).isEqualTo( + """ + |package com.example.testmodule + | + |import app.cash.sqldelight.TransacterImpl + |import app.cash.sqldelight.db.AfterVersion + |import app.cash.sqldelight.db.QueryResult + |import app.cash.sqldelight.db.SqlDriver + |import app.cash.sqldelight.db.SqlSchema + |import com.example.TestDatabase + |import kotlin.Long + |import kotlin.Unit + |import kotlin.reflect.KClass + | + |internal val KClass.schema: SqlSchema> + | get() = TestDatabaseImpl.Schema + | + |internal fun KClass.newInstance(driver: SqlDriver): TestDatabase = + | TestDatabaseImpl(driver) + | + |private class TestDatabaseImpl( + | driver: SqlDriver, + |) : TransacterImpl(driver), + | TestDatabase { + | public object Schema : SqlSchema> { + | override val version: Long + | get() = 1 + | + | override fun create(driver: SqlDriver): QueryResult.Value { + | driver.execute(null, ""${'"'} + | |CREATE TABLE parent( + | | id INTEGER PRIMARY KEY + | |) + | ""${'"'}.trimMargin(), 0) + | driver.execute(null, ""${'"'} + | |CREATE TABLE child( + | | parent_id INTEGER, + | | + | | FOREIGN KEY (parent_id) REFERENCES parent(id) + | |) + | ""${'"'}.trimMargin(), 0) + | return QueryResult.Unit + | } + | + | override fun migrate( + | driver: SqlDriver, + | oldVersion: Long, + | newVersion: Long, + | vararg callbacks: AfterVersion, + | ): QueryResult.Value = QueryResult.Unit + | } + |} + | + """.trimMargin(), + ) + } + @Test fun `queryWrapper generates with migration statements`() { FixtureCompiler.writeSql( """ From c9a08cfad44aec55aec4699253e503891ca1b374 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 20:11:22 +0000 Subject: [PATCH 166/304] Update dependency com.pinterest.ktlint:ktlint-cli to v1.3.1 (#5327) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 49c595ef89e..fe7ceed7f74 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ sqliter = "1.3.1" sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" -ktlint = "1.3.0" +ktlint = "1.3.1" agp = "8.5.0" compileSdk = "34" minSdk = "21" From 6ae0693a5627bd37f9df5e292117a0337f228888 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 16:42:38 +0000 Subject: [PATCH 167/304] Update dependency com.squareup:kotlinpoet to v1.18.0 (#5329) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fe7ceed7f74..d94fa95d923 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -35,7 +35,7 @@ androidx-paging3-runtime = { module = "androidx.paging:paging-runtime", version. androidx-recyclerView = { module = "androidx.recyclerview:recyclerview", version = "1.3.2" } android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp" } -kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.17.0" } +kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.18.0" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } truth = { module = "com.google.truth:truth", version = "1.4.3" } From 38f977aa0f949edbc4731e04d5ba42ae6e6896f9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:30:43 -0400 Subject: [PATCH 168/304] Update dependency org.robolectric:robolectric to v4.13 (#5335) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d94fa95d923..af69ac319b5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -65,7 +65,7 @@ intellij-util = { module = "com.jetbrains.intellij.platform:util", version.ref = sqlPsi = { module = "com.alecstrong.sql.psi:core", version.ref = "sqlPsi" } sqlPsiEnvironment = { module = "com.alecstrong.sql.psi:environment", version.ref = "sqlPsi" } -robolectric = { module = "org.robolectric:robolectric", version = "4.12.2" } +robolectric = { module = "org.robolectric:robolectric", version = "4.13" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.46.0.0" } From 045f80991b1e7a43188faf3a5bdcdf34e88a3825 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 10:00:03 -0400 Subject: [PATCH 169/304] Update plugin binaryCompatibilityValidator to v0.15.0 (#5336) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index af69ac319b5..e159b414c21 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -109,4 +109,4 @@ spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } ksp = { id = "com.google.devtools.ksp", version = "1.9.24-1.0.20" } -binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.14.0" } +binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.15.0" } From 19e393a3fa13b4a1282ab448e355dadaa33cc92d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 8 Jul 2024 15:37:32 +0100 Subject: [PATCH 170/304] Fix 5331 add PostgreSql XML type (#5334) * add XML data type Map to SQLXML type on bind and String for results * Add tests fixture test integration test --- .../sqldelight/dialects/postgresql/PostgreSqlType.kt | 9 ++++++++- .../dialects/postgresql/PostgreSqlTypeResolver.kt | 1 + .../dialects/postgresql/grammar/PostgreSql.bnf | 5 ++++- .../resources/fixtures_postgresql/xml-type/Test.s | 7 +++++++ .../app/cash/sqldelight/postgresql/integration/Xml.sq | 11 +++++++++++ .../postgresql/integration/PostgreSqlTest.kt | 11 +++++++++++ 6 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/xml-type/Test.s create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Xml.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt index eb81fca6bd6..cb66bc336c1 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt @@ -23,6 +23,7 @@ internal enum class PostgreSqlType(override val javaType: TypeName) : DialectTyp NUMERIC(ClassName("java.math", "BigDecimal")), JSON(STRING), TSVECTOR(STRING), + XML(STRING), ; override fun prepareStatementBinder(columnIndex: CodeBlock, value: CodeBlock): CodeBlock { @@ -43,6 +44,12 @@ internal enum class PostgreSqlType(override val javaType: TypeName) : DialectTyp value, MemberName(ClassName("java.sql", "Types"), "OTHER"), ) + XML -> CodeBlock.of( + "bindObject(%L, %L, %M)\n", + columnIndex, + value, + MemberName(ClassName("java.sql", "Types"), "SQLXML"), + ) } } @@ -54,7 +61,7 @@ internal enum class PostgreSqlType(override val javaType: TypeName) : DialectTyp BIG_INT -> "$cursorName.getLong($columnIndex)" DATE, TIME, TIMESTAMP, TIMESTAMP_TIMEZONE, INTERVAL, UUID -> "$cursorName.getObject<%T>($columnIndex)" NUMERIC -> "$cursorName.getBigDecimal($columnIndex)" - JSON, TSVECTOR -> "$cursorName.getString($columnIndex)" + JSON, TSVECTOR, XML -> "$cursorName.getString($columnIndex)" }, javaType, ) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index 35142c9e3a0..5da25812ee2 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -74,6 +74,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes booleanDataType != null -> BOOLEAN blobDataType != null -> BLOB tsvectorDataType != null -> PostgreSqlType.TSVECTOR + xmlDataType != null -> PostgreSqlType.XML else -> throw IllegalArgumentException("Unknown kotlin type for sql type ${this.text}") }, ) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index e6591a608cd..1590622aa23 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -155,7 +155,8 @@ type_name ::= ( boolean_data_type | json_data_type | blob_data_type | - tsvector_data_type + tsvector_data_type | + xml_data_type ) [ '[]' ] { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlTypeNameImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlTypeName" @@ -224,6 +225,8 @@ blob_data_type ::= 'BYTEA' tsvector_data_type ::= 'TSVECTOR' +xml_data_type ::= 'XML' + interval_expression ::= 'INTERVAL' string_literal timestamp_expression ::= 'TIMESTAMP' [ (WITH | WITHOUT) 'TIME' 'ZONE' ] {string_literal} diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/xml-type/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/xml-type/Test.s new file mode 100644 index 00000000000..fb6f5e79749 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/xml-type/Test.s @@ -0,0 +1,7 @@ +CREATE TABLE Test ( + x1 XML NOT NULL, + x2 XML +); + +SELECT x1, x2 +FROM Test; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Xml.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Xml.sq new file mode 100644 index 00000000000..6cca4d6ae42 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Xml.sq @@ -0,0 +1,11 @@ +CREATE TABLE Xml_Test( + x1 XML NOT NULL, + x2 XML +); + +insert: +INSERT INTO Xml_Test (x1, x2) VALUES (?, ?); + +select: +SELECT x1, x2 +FROM Xml_Test; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index ef1283ab17f..e09f4518b4d 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -928,4 +928,15 @@ class PostgreSqlTest { assertThat(expr_________).isEqualTo(OffsetDateTime.of(2001, 2, 17, 2, 38, 40, 0, ZoneOffset.ofHours(0))) } } + + @Test + fun testXml() { + val a = "Codestin Search Apptest" + val b = "Codestin Search Apptest" + database.xmlQueries.insert(a, b) + with(database.xmlQueries.select().executeAsOne()) { + assertThat(x1).isEqualTo(b) // results are returned without + assertThat(x2).isEqualTo(b) + } + } } From a407d5c462824886bac504e9c3fb4526f3f3b21b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Mon, 8 Jul 2024 18:47:24 +0100 Subject: [PATCH 171/304] Fix 5330 add Postgresql ILIKE operator (#5333) * override binary_like_operator Add `ILIKE` to `binary_like_operator` Postgresql doesn't use `GLOB | REGEXP | MATCH` keywords It would require rewriting the mixin just to add `ILIKE` Add like and ilike patterns to regex_match_operator regex_match_operator is ordered by shortest matching characters first as the parser gets confused * Add tests fixture test integration tests --- .../postgresql/grammar/PostgreSql.bnf | 13 ++++++- .../fixtures_postgresql/like-operators/Test.s | 17 +++++++++ .../sqldelight/postgresql/integration/Like.sq | 24 +++++++++++++ .../postgresql/integration/PostgreSqlTest.kt | 36 +++++++++++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/like-operators/Test.s create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Like.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 1590622aa23..b76edb749c6 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -44,6 +44,7 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.FOREIGN" "static com.alecstrong.sql.psi.core.psi.SqlTypes.FROM" "static com.alecstrong.sql.psi.core.psi.SqlTypes.GENERATED" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.GLOB" "static com.alecstrong.sql.psi.core.psi.SqlTypes.GROUP" "static com.alecstrong.sql.psi.core.psi.SqlTypes.HAVING" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ID" @@ -54,8 +55,10 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.INSERT" "static com.alecstrong.sql.psi.core.psi.SqlTypes.INTO" "static com.alecstrong.sql.psi.core.psi.SqlTypes.KEY" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.LIKE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.LIMIT" "static com.alecstrong.sql.psi.core.psi.SqlTypes.LP" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.MATCH" "static com.alecstrong.sql.psi.core.psi.SqlTypes.MINUS" "static com.alecstrong.sql.psi.core.psi.SqlTypes.MULTIPLY" "static com.alecstrong.sql.psi.core.psi.SqlTypes.NO" @@ -69,6 +72,7 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.PARTITION" "static com.alecstrong.sql.psi.core.psi.SqlTypes.PLUS" "static com.alecstrong.sql.psi.core.psi.SqlTypes.PRIMARY" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.REGEXP" "static com.alecstrong.sql.psi.core.psi.SqlTypes.RENAME" "static com.alecstrong.sql.psi.core.psi.SqlTypes.REPLACE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ROLLBACK" @@ -109,6 +113,7 @@ overrides ::= type_name | create_index_stmt | select_stmt | ordering_term + | binary_like_operator | literal_value column_constraint ::= [ CONSTRAINT {identifier} ] ( @@ -192,6 +197,12 @@ create_index_stmt ::= CREATE [ UNIQUE ] INDEX [ 'CONCURRENTLY' ] [ IF NOT EXISTS pin = 6 } +binary_like_operator ::= ( 'ILIKE' | LIKE | GLOB | REGEXP | MATCH ) { + extends = "com.alecstrong.sql.psi.core.psi.impl.SqlBinaryLikeOperatorImpl" + implements = "com.alecstrong.sql.psi.core.psi.SqlBinaryLikeOperator" + override = true +} + identity_clause ::= 'IDENTITY' [ LP [ 'SEQUENCE' 'NAME' sequence_name ] [ sequence_parameters* ] RP ] generated_clause ::= GENERATED ( (ALWAYS AS LP <> RP 'STORED') | ( (ALWAYS | BY DEFAULT) AS identity_clause ) ) { @@ -445,7 +456,7 @@ match_operator_expression ::= ( {function_expr} | {column_expr} ) match_operator pin = 2 } -regex_match_operator ::= '~*' | '~' | '!~*' | '!~' +regex_match_operator ::= '~~*' | '~*' | '!~~*' | '!~*' | '~~' | '~' | '!~~' | '!~' regex_match_operator_expression ::= ( {function_expr} | {column_expr} ) regex_match_operator <> { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.RegExMatchOperatorExpressionMixin" diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/like-operators/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/like-operators/Test.s new file mode 100644 index 00000000000..16e796062f8 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/like-operators/Test.s @@ -0,0 +1,17 @@ +CREATE TABLE Test ( + txt TEXT NOT NULL +); + +SELECT * FROM Test WHERE txt LIKE 'testing%'; + +SELECT * FROM Test WHERE txt ILIKE 'test%'; + +SELECT * FROM Test WHERE txt ~~ 'testin%'; + +SELECT * FROM Test WHERE txt ~~* '%esting%'; + +SELECT txt !~~ 'testing%' FROM Test; + +SELECT txt !~~* 'testing%' FROM Test; + +SELECT txt ILIKE 'test%' FROM Test; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Like.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Like.sq new file mode 100644 index 00000000000..91982c8af74 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Like.sq @@ -0,0 +1,24 @@ +CREATE TABLE Test_Like ( + txt TEXT NOT NULL +); + +insert: +INSERT INTO Test_Like (txt) VALUES(?); + +selectWhereLike: +SELECT * FROM Test_Like WHERE txt LIKE ?; + +selectWhereILike: +SELECT * FROM Test_Like WHERE txt ILIKE ?; + +selectWhereLikeRegex: +SELECT * FROM Test_Like WHERE txt ~~ 'testin%'; + +selectWhereILikeRegex: +SELECT * FROM Test_Like WHERE txt ~~* '%esting%'; + +selectLikeRegex: +SELECT txt ~~ 'testing%', txt !~~ 'testing%' FROM Test_Like; + +selectILikeRegex: +SELECT txt ~~* 'testing%', txt !~~* 'testing%' FROM Test_Like; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index e09f4518b4d..4d8e86618a2 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -866,6 +866,42 @@ class PostgreSqlTest { } } + @Test + fun testLike() { + database.likeQueries.insert("testing") + + with(database.likeQueries.selectWhereLike("test%").executeAsList()) { + assertThat(first()).isEqualTo("testing") + } + + with(database.likeQueries.selectWhereLikeRegex().executeAsList()) { + assertThat(first()).isEqualTo("testing") + } + + with(database.likeQueries.selectLikeRegex().executeAsList()) { + assertThat(first().expr).isTrue() + assertThat(first().expr_).isFalse() + } + } + + @Test + fun testILike() { + database.likeQueries.insert("TESTING") + + with(database.likeQueries.selectWhereILike("test%").executeAsList()) { + assertThat(first()).isEqualTo("TESTING") + } + + with(database.likeQueries.selectWhereILikeRegex().executeAsList()) { + assertThat(first()).isEqualTo("TESTING") + } + + with(database.likeQueries.selectILikeRegex().executeAsList()) { + assertThat(first().expr).isTrue() + assertThat(first().expr_).isFalse() + } + } + @Test fun testRankOver() { database.windowFunctionsQueries.insert("t", 2) From e6ed856589db0fb2e3e828d71bb080bdbe78e431 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 08:14:23 -0400 Subject: [PATCH 172/304] Update plugin binaryCompatibilityValidator to v0.15.1 (#5338) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e159b414c21..7cb2467b259 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -109,4 +109,4 @@ spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } ksp = { id = "com.google.devtools.ksp", version = "1.9.24-1.0.20" } -binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.15.0" } +binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.15.1" } From a9c61fdd91ef2ff5a6e1f4d4bb308959d5adb9d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 9 Jul 2024 15:46:55 +0100 Subject: [PATCH 173/304] Fix 5288 adds PostgreSql drop constraint (#5289) * Add grammar ensure that DROP CONSTRAINT is higher than DROP COLUMN as would match first * Fixture test consider constraint doesn't exist in table schema --- .../postgresql/grammar/PostgreSql.bnf | 6 +++++ .../alter-table-drop-constraint/1.s | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-drop-constraint/1.s diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index b76edb749c6..da43b53b2ce 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -75,6 +75,7 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.REGEXP" "static com.alecstrong.sql.psi.core.psi.SqlTypes.RENAME" "static com.alecstrong.sql.psi.core.psi.SqlTypes.REPLACE" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.RESTRICT" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ROLLBACK" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ROW" "static com.alecstrong.sql.psi.core.psi.SqlTypes.RP" @@ -327,6 +328,7 @@ alter_table_rules ::= ( {alter_table_add_column} | {alter_table_rename_table} | alter_table_rename_column + | alter_table_drop_constraint | alter_table_drop_column | alter_table_add_constraint | alter_table_alter_column @@ -360,6 +362,10 @@ alter_table_add_constraint ::= ADD table_constraint { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.AlterTableAddConstraintMixin" } +alter_table_drop_constraint ::= DROP CONSTRAINT [ IF EXISTS ] {identifier} [ RESTRICT | CASCADE ] { + pin = 2 +} + type_clause ::= 'TYPE' data_clause ::= 'DATA' diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-drop-constraint/1.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-drop-constraint/1.s new file mode 100644 index 00000000000..1487e063ba2 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-drop-constraint/1.s @@ -0,0 +1,27 @@ +CREATE TABLE test ( + external_event_id TEXT +); + +ALTER TABLE test + ADD CONSTRAINT idx_external_event_id + UNIQUE (external_event_id); + +CREATE TABLE t1 ( + c1 INTEGER, + t1 TEXT, + t2 VARCHAR(255), + t3 CHAR(10) +); + +ALTER TABLE t1 + ADD CONSTRAINT chk_c1 CHECK (c1 > 0), + ADD CONSTRAINT chk_t2 CHECK (CHAR_LENGTH(t2) > 0); + +ALTER TABLE t1 + DROP CONSTRAINT chk_c1; + +ALTER TABLE t1 + DROP CONSTRAINT chk_t2 RESTRICT; + +ALTER TABLE test + DROP CONSTRAINT IF EXISTS idx_external_event_id CASCADE; From 1f402116fbe7e046efc6550b1728c26a6f8300b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 9 Jul 2024 15:48:56 +0100 Subject: [PATCH 174/304] Fix 5309 alter table add column if not exists (#5311) * Add if not exists Add mixin to handle IF NOT EXISTS clause The new column will not be added if it already exists and IF NOT EXISTS clause is specified * Add fixture test * Add integration test migration file test --- .../postgresql/grammar/PostgreSql.bnf | 9 +++++ .../mixins/AlterTableAddColumnMixin.kt | 39 +++++++++++++++++++ .../alter-table-add-column/1.s | 7 ++++ .../postgresql/integration/v202406218000.sqm | 5 +++ .../postgresql/integration/v202406219000.sqm | 2 + 5 files changed, 62 insertions(+) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAddColumnMixin.kt create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-add-column/1.s create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql-migrations/src/main/sqldelight/migrations/app/cash/sqldelight/postgresql/integration/v202406218000.sqm create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql-migrations/src/main/sqldelight/migrations/app/cash/sqldelight/postgresql/integration/v202406219000.sqm diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index da43b53b2ce..3a1f82ad403 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -107,6 +107,7 @@ overrides ::= type_name | update_stmt_limited | generated_clause | result_column + | alter_table_add_column | alter_table_rules | compound_select_stmt | extension_expr @@ -373,6 +374,14 @@ data_clause ::= 'DATA' column_not_null_clause ::= (SET | DROP) NOT NULL column_default_clause ::= SET {default_constraint} | DROP DEFAULT +if_not_exists ::= IF NOT EXISTS +alter_table_add_column ::= ADD [ COLUMN ] [ if_not_exists + ] {column_def} { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.AlterTableAddColumnMixin" + implements = "com.alecstrong.sql.psi.core.psi.SqlAlterTableAddColumn" + override = true +} + alter_table_alter_column ::= ALTER [COLUMN] {column_name} ( [ SET data_clause ] type_clause {column_type} [USING {column_name}'::'{column_type}] | column_not_null_clause diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAddColumnMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAddColumnMixin.kt new file mode 100644 index 00000000000..cd480b88577 --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/AlterTableAddColumnMixin.kt @@ -0,0 +1,39 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlAlterTableAddColumn +import com.alecstrong.sql.psi.core.psi.AlterTableApplier +import com.alecstrong.sql.psi.core.psi.LazyQuery +import com.alecstrong.sql.psi.core.psi.NamedElement +import com.alecstrong.sql.psi.core.psi.QueryElement +import com.alecstrong.sql.psi.core.psi.SqlAlterTableAddColumn +import com.alecstrong.sql.psi.core.psi.SqlColumnDef +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.intellij.lang.ASTNode +import com.intellij.psi.util.PsiTreeUtil + +internal abstract class AlterTableAddColumnMixin( + node: ASTNode, +) : SqlCompositeElementImpl(node), + SqlAlterTableAddColumn, + PostgreSqlAlterTableAddColumn, + AlterTableApplier { + override fun applyTo(lazyQuery: LazyQuery): LazyQuery { + return LazyQuery( + tableName = lazyQuery.tableName, + query = { + val columns = lazyQuery.query.columns + val existingColumn = columns.singleOrNull { + (it.element as NamedElement).textMatches(columnDef.columnName) + } + + lazyQuery.query.copy( + columns = if (ifNotExists != null && existingColumn != null) lazyQuery.query.columns else columns + QueryElement.QueryColumn(columnDef.columnName), + ) + }, + ) + } + + override fun getColumnDef(): SqlColumnDef { + return notNullChild(PsiTreeUtil.getChildOfType(this, SqlColumnDef::class.java)) + } +} diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-add-column/1.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-add-column/1.s new file mode 100644 index 00000000000..0bf5d9a7674 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/alter-table-add-column/1.s @@ -0,0 +1,7 @@ +CREATE TABLE T ( + id INTEGER +); + +ALTER TABLE T ADD COLUMN other_id INTEGER; + +ALTER TABLE T ADD COLUMN IF NOT EXISTS txt VARCHAR[] DEFAULT '{}'; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql-migrations/src/main/sqldelight/migrations/app/cash/sqldelight/postgresql/integration/v202406218000.sqm b/sqldelight-gradle-plugin/src/test/integration-postgresql-migrations/src/main/sqldelight/migrations/app/cash/sqldelight/postgresql/integration/v202406218000.sqm new file mode 100644 index 00000000000..f63ec2147e7 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql-migrations/src/main/sqldelight/migrations/app/cash/sqldelight/postgresql/integration/v202406218000.sqm @@ -0,0 +1,5 @@ +CREATE TABLE X ( + id INT NOT NULL, + txt TEXT NOT NULL +); + diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql-migrations/src/main/sqldelight/migrations/app/cash/sqldelight/postgresql/integration/v202406219000.sqm b/sqldelight-gradle-plugin/src/test/integration-postgresql-migrations/src/main/sqldelight/migrations/app/cash/sqldelight/postgresql/integration/v202406219000.sqm new file mode 100644 index 00000000000..2e5970641ae --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql-migrations/src/main/sqldelight/migrations/app/cash/sqldelight/postgresql/integration/v202406219000.sqm @@ -0,0 +1,2 @@ +ALTER TABLE X ADD COLUMN test INTEGER NOT NULL; +ALTER TABLE X ADD COLUMN IF NOT EXISTS txt TEXT NOT NULL; From 33f69056f467c8589a1bf4b30804bdd5ee509820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 9 Jul 2024 15:51:38 +0100 Subject: [PATCH 175/304] Fix 5089 add postgresql type casting (#5261) * Add grammar Add operator Add Type Resolver Needs to handle chained '::' operators e.g '2023-04-25 10:30:00+02'::TIMESTAMP::DATE * Add Tests Fixture test Integration test * Type resolver Add Mixin expr to enable resolving of nullable type * Tests Fixture test Integration test * Add bindexpr Update PostgreSqlTypeResolver.kt support ?::data_type same as CAST(? AS DATA_TYPE) This types the bind parameter * Tests --- .../postgresql/PostgreSqlTypeResolver.kt | 21 ++++++++-- .../postgresql/grammar/PostgreSql.bnf | 9 ++++- .../DoubleColonCastOperatorExpressionMixin.kt | 18 +++++++++ .../postgres/PostgreSqlFixturesTest.kt | 2 +- .../typecast-expressions/Test.s | 39 +++++++++++++++++++ .../postgresql/integration/DataTypeCasts.sq | 16 ++++++++ .../postgresql/integration/PostgreSqlTest.kt | 26 +++++++++++++ 7 files changed, 125 insertions(+), 6 deletions(-) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DoubleColonCastOperatorExpressionMixin.kt create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/typecast-expressions/Test.s create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/DataTypeCasts.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index 5da25812ee2..173841bdb5c 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -19,9 +19,11 @@ import app.cash.sqldelight.dialects.postgresql.PostgreSqlType.TIMESTAMP import app.cash.sqldelight.dialects.postgresql.PostgreSqlType.TIMESTAMP_TIMEZONE import app.cash.sqldelight.dialects.postgresql.grammar.mixins.AggregateExpressionMixin import app.cash.sqldelight.dialects.postgresql.grammar.mixins.AtTimeZoneOperatorExpressionMixin +import app.cash.sqldelight.dialects.postgresql.grammar.mixins.DoubleColonCastOperatorExpressionMixin import app.cash.sqldelight.dialects.postgresql.grammar.mixins.WindowFunctionMixin import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlAtTimeZoneOperator import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlDeleteStmtLimited +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlDoubleColonCastOperatorExpression import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlExtensionExpr import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlInsertStmt import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlTypeName @@ -232,10 +234,16 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes } override fun argumentType(parent: PsiElement, argument: SqlExpr): IntermediateType { - return if (argument.parent is PostgreSqlAtTimeZoneOperator) { - IntermediateType(TEXT) - } else { - parentResolver.argumentType(parent, argument) + return when (argument.parent) { + is PostgreSqlAtTimeZoneOperator -> { + IntermediateType(TEXT) + } + is PostgreSqlDoubleColonCastOperatorExpression -> { + (argument.parent.parent as SqlExpr).postgreSqlType() + } + else -> { + parentResolver.argumentType(parent, argument) + } } } @@ -310,6 +318,11 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes if (acc.dialectType == TIMESTAMP) IntermediateType(TIMESTAMP_TIMEZONE) else IntermediateType(TIMESTAMP) } ?: if (timeStamp.dialectType == TIMESTAMP) IntermediateType(TIMESTAMP_TIMEZONE) else IntermediateType(TIMESTAMP) } + doubleColonCastOperatorExpression != null -> { + val expType: IntermediateType = (doubleColonCastOperatorExpression as DoubleColonCastOperatorExpressionMixin).expr.postgreSqlType() + val lastTypeCast = doubleColonCastOperatorExpression!!.doubleColonCastOperatorList.last().typeName + definitionType(lastTypeCast).nullableIf(expType.javaType.isNullable) + } else -> parentResolver.resolvedType(this) } diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 3a1f82ad403..b5a5784488d 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -410,7 +410,7 @@ compound_select_stmt ::= [ {with_clause} ] {select_stmt} ( {compound_operator} override = true } -extension_expr ::= at_time_zone_operator_expression | regex_match_operator_expression | match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_not_expression | window_function_expr { +extension_expr ::= double_colon_cast_operator_expression | at_time_zone_operator_expression | regex_match_operator_expression | match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_not_expression | window_function_expr { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionExprImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionExpr" override = true @@ -478,6 +478,13 @@ regex_match_operator_expression ::= ( {function_expr} | {column_expr} ) regex_ma pin = 2 } +double_colon_cast_operator ::= '::' type_name + +double_colon_cast_operator_expression ::= ( {bind_expr} | {literal_expr} | {cast_expr} | {function_expr} | {column_expr} ) double_colon_cast_operator [ double_colon_cast_operator ] * { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.DoubleColonCastOperatorExpressionMixin" + pin = 2 +} + at_time_zone_operator ::= 'AT' 'TIME' 'ZONE' <> { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.AtTimeZoneOperatorMixin" } diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DoubleColonCastOperatorExpressionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DoubleColonCastOperatorExpressionMixin.kt new file mode 100644 index 00000000000..b2619fbf9e1 --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DoubleColonCastOperatorExpressionMixin.kt @@ -0,0 +1,18 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlDoubleColonCastOperatorExpression +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlExpr +import com.intellij.lang.ASTNode + +/** + * Support historical double colon casts + * :: + * The expr is used to determine nullable when resolver casts to new type + */ +internal abstract class DoubleColonCastOperatorExpressionMixin(node: ASTNode) : + SqlCompositeElementImpl(node), + SqlExpr, + PostgreSqlDoubleColonCastOperatorExpression { + val expr get() = children.filterIsInstance().first() +} diff --git a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt index 2273c7df799..8727c647a02 100644 --- a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt +++ b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt @@ -18,7 +18,7 @@ class PostgreSqlFixturesTest(name: String, fixtureRoot: File) : FixturesTest(nam "BLOB" to "TEXT", "id TEXT GENERATED ALWAYS AS (2) UNIQUE NOT NULL" to "id TEXT GENERATED ALWAYS AS (2) STORED UNIQUE NOT NULL", "'(', ')', ',', '.', , BETWEEN or IN expected, got ','" - to "'#-', '(', ')', ',', '.', , , , , '@@', AT, BETWEEN or IN expected, got ','", + to "'#-', '(', ')', ',', '.', '::', , , , , '@@', AT, BETWEEN or IN expected, got ','", ) override fun setupDialect() { diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/typecast-expressions/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/typecast-expressions/Test.s new file mode 100644 index 00000000000..3a783ee4e98 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/typecast-expressions/Test.s @@ -0,0 +1,39 @@ +SELECT '1'::text; + +SELECT 3.14::text; + +SELECT '42'::integer; + +SELECT 'true'::boolean; + +SELECT concat('tru','e')::boolean; + +WITH numbers AS ( + SELECT generate_series(-3.5, 3.5, 1) AS x +) +SELECT x, + round(x::numeric) AS num_round, + round(x::double precision) AS dbl_round +FROM numbers; + +SELECT '2023-05-01 12:34:56'::TIMESTAMP::DATE; + +SELECT '6ba7b810-9dad-11d1-80b4-00c04fd430c8'::UUID; + +SELECT '{"a":42}'::JSON; + +SELECT '[1,2,3]'::INT[]; + +SELECT 42::BIGINT; + +SELECT 3.14::DOUBLE PRECISION; + +SELECT 'f'::BOOLEAN; + +SELECT 'hello world'::VARCHAR(5); + +SELECT '2023-04-25 10:30:00+02'::TIMESTAMP WITH TIME ZONE; + +SELECT '2023-04-25 10:30:00+02'::TIMESTAMP::DATE; + +SELECT ?::INT; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/DataTypeCasts.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/DataTypeCasts.sq new file mode 100644 index 00000000000..44c964f4d97 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/DataTypeCasts.sq @@ -0,0 +1,16 @@ +CREATE TABLE TypeCast( + answer TEXT NOT NULL, + ts TEXT +); + +insert: +INSERT INTO TypeCast (answer, ts) VALUES(?, ?); + +select: +SELECT '1'::TEXT, 3.14::TEXT, '42'::INTEGER, 'false'::BOOLEAN, concat('tru','e')::BOOLEAN, +'2023-05-01 12:34:56'::TIMESTAMP, '6ba7b810-9dad-11d1-80b4-00c04fd430c8'::UUID, '{"a":42}'::JSON, +'{1,2,3}'::INT[], 42::BIGINT, 3.14::DOUBLE PRECISION, 'f'::BOOLEAN, 'hello world'::VARCHAR(5), +'2023-04-25 10:30:00+02'::TIMESTAMP WITH TIME ZONE, '2023-04-25 10:30:00+02'::TIMESTAMP::DATE, +answer::INTEGER, ts::TIMESTAMP, +?::INTEGER +FROM TypeCast; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index 4d8e86618a2..2a953c85d49 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -965,6 +965,32 @@ class PostgreSqlTest { } } + @Test + fun testDataTypeCasts() { + database.dataTypeCastsQueries.insert("42", null) + + with(database.dataTypeCastsQueries.select(42).executeAsOne()) { + assertThat(expr).isEqualTo("1") + assertThat(expr_).isEqualTo("3.14") + assertThat(expr__).isEqualTo(42) + assertThat(expr___).isFalse() + assertThat(expr____).isTrue() + assertThat(expr_____).isEqualTo(LocalDateTime.of(2023, 5, 1, 12, 34, 56)) + assertThat(expr______).isEqualTo(java.util.UUID.fromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8")) + assertThat(expr_______).isEqualTo("""{"a":42}""") + assertThat(expr________).isEqualTo(arrayOf(1, 2, 3)) + assertThat(expr_________).isEqualTo(42L) + assertThat(expr__________).isEqualTo(3.14) + assertThat(expr___________).isFalse() + assertThat(expr____________).isEqualTo("hello") + assertThat(expr_____________).isEqualTo(OffsetDateTime.of(2023, 4, 25, 8, 30, 0, 0, ZoneOffset.ofHours(0))) + assertThat(expr______________).isEqualTo(LocalDate.of(2023, 4, 25)) + assertThat(expr_______________).isEqualTo(42) + assertThat(expr________________).isNull() + assertThat(expr_________________).isEqualTo(42) + } + } + @Test fun testXml() { val a = "Codestin Search Apptest" From 81d1abd013dc6711818ca83852394870de32e8c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:19:08 +0100 Subject: [PATCH 176/304] Add 4933 PostgreSql array contains operators (#5228) * Add Postgresql contains operators for array <@ and @> are used by json, tsvector and array Move the operators to separate mixin * Add fixture and integration tests For Array Contains text[] and varchar[] arrays are different types in Postgresql for contains operator * Add array overlap operator Add fixture and integration test * fix merge conflict --------- Co-authored-by: Jake Wharton --- .../postgresql/PostgreSqlTypeResolver.kt | 2 +- .../postgresql/grammar/PostgreSql.bnf | 10 ++++- .../mixins/ContainsOperatorExpressionMixin.kt | 36 ++++++++++++++++++ .../postgres/PostgreSqlFixturesTest.kt | 2 +- .../array_operators/Test.s | 19 ++++++++++ .../postgresql/integration/Arrays.sq | 24 +++++++++++- .../postgresql/integration/PostgreSqlTest.kt | 38 ++++++++++++++++++- 7 files changed, 124 insertions(+), 7 deletions(-) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ContainsOperatorExpressionMixin.kt create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/array_operators/Test.s diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index 173841bdb5c..52281f727f9 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -309,7 +309,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes IntermediateType(PostgreSqlType.JSON) } } - matchOperatorExpression != null || regexMatchOperatorExpression != null || booleanNotExpression != null -> { + matchOperatorExpression != null || regexMatchOperatorExpression != null || containsOperatorExpression != null || booleanNotExpression != null -> { IntermediateType(BOOLEAN) } atTimeZoneOperatorExpression != null -> { diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index b5a5784488d..8e5e2ef7cb8 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -410,7 +410,7 @@ compound_select_stmt ::= [ {with_clause} ] {select_stmt} ( {compound_operator} override = true } -extension_expr ::= double_colon_cast_operator_expression | at_time_zone_operator_expression | regex_match_operator_expression | match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_not_expression | window_function_expr { +extension_expr ::= double_colon_cast_operator_expression | contains_operator_expression | at_time_zone_operator_expression | regex_match_operator_expression | match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_not_expression | window_function_expr { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionExprImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionExpr" override = true @@ -463,9 +463,15 @@ json_expression ::= {column_expr} ( jsona_binary_operator | jsonb_binary_operato } jsona_binary_operator ::= '->' | '->>' | '#>' | '#>>' jsonb_binary_operator ::= '#-' -jsonb_boolean_operator ::= '@>' | '<@' | '@?' | '??|' | '??&' | '??' +jsonb_boolean_operator ::= '@?' | '??|' | '??&' | '??' +contains_operator ::= '@>' | '<@' | '&&' match_operator ::= '@@' +contains_operator_expression ::= ( {function_expr} | {column_expr} ) contains_operator <> { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.ContainsOperatorExpressionMixin" + pin = 2 +} + match_operator_expression ::= ( {function_expr} | {column_expr} ) match_operator <> { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.MatchOperatorExpressionMixin" pin = 2 diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ContainsOperatorExpressionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ContainsOperatorExpressionMixin.kt new file mode 100644 index 00000000000..e8c4ca22005 --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ContainsOperatorExpressionMixin.kt @@ -0,0 +1,36 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlContainsOperatorExpression +import com.alecstrong.sql.psi.core.SqlAnnotationHolder +import com.alecstrong.sql.psi.core.psi.SqlBinaryExpr +import com.alecstrong.sql.psi.core.psi.SqlColumnDef +import com.alecstrong.sql.psi.core.psi.SqlColumnName +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlExpr +import com.intellij.lang.ASTNode + +/** + * The "@>" and "<@" contains operators are used by Array, TsVector and Jsonb + * The type annotation is performed here for these types + * For additional json operators see JsonExpressionMixin + */ +internal abstract class ContainsOperatorExpressionMixin(node: ASTNode) : + SqlCompositeElementImpl(node), + SqlBinaryExpr, + PostgreSqlContainsOperatorExpression { + + override fun annotate(annotationHolder: SqlAnnotationHolder) { + val columnType = ((firstChild.firstChild.reference?.resolve() as? SqlColumnName)?.parent as? SqlColumnDef)?.columnType?.typeName?.text + when { + columnType == null -> super.annotate(annotationHolder) + columnType.endsWith("[]") -> super.annotate(annotationHolder) + columnType == "JSONB" -> super.annotate(annotationHolder) + columnType == "JSON" -> annotationHolder.createErrorAnnotation(firstChild.firstChild, "Left side of jsonb expression must be a jsonb column.") + columnType != "TSVECTOR" -> annotationHolder.createErrorAnnotation(firstChild.firstChild, "Left side of match expression must be a tsvector column.") + } + super.annotate(annotationHolder) + } + override fun getExprList(): List { + return children.filterIsInstance() + } +} diff --git a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt index 8727c647a02..4299e4d626b 100644 --- a/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt +++ b/dialects/postgresql/src/test/kotlin/app/cash/sqldelight/dialects/postgres/PostgreSqlFixturesTest.kt @@ -18,7 +18,7 @@ class PostgreSqlFixturesTest(name: String, fixtureRoot: File) : FixturesTest(nam "BLOB" to "TEXT", "id TEXT GENERATED ALWAYS AS (2) UNIQUE NOT NULL" to "id TEXT GENERATED ALWAYS AS (2) STORED UNIQUE NOT NULL", "'(', ')', ',', '.', , BETWEEN or IN expected, got ','" - to "'#-', '(', ')', ',', '.', '::', , , , , '@@', AT, BETWEEN or IN expected, got ','", + to "'#-', '(', ')', ',', '.', '::', , , , , , '@@', AT, BETWEEN or IN expected, got ','", ) override fun setupDialect() { diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/array_operators/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/array_operators/Test.s new file mode 100644 index 00000000000..14ca43da910 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/array_operators/Test.s @@ -0,0 +1,19 @@ +CREATE TABLE T( + a INT[], + b INT[] +); + +SELECT a @> ?, b <@ ? +FROM T; + +SELECT * +FROM T +WHERE a @> ?; + +SELECT * +FROM T +WHERE b <@ a; + +SELECT * +FROM T +WHERE b && a; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Arrays.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Arrays.sq index e522bafa030..735378c9d84 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Arrays.sq +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Arrays.sq @@ -1,9 +1,29 @@ CREATE TABLE arrays( intArray INTEGER[] AS kotlin.Array, - textArray TEXT[] + textArray VARCHAR[], + vcharArray VARCHAR[] ); insertAndReturn: INSERT INTO arrays -VALUES (?, ?) +VALUES (?, ?, ?) RETURNING *; + +contains: +SELECT intArray @> ?, vcharArray <@ ? +FROM arrays; + +containsFirst: +SELECT * +FROM arrays +WHERE intArray @> ?; + +containsSecond: +SELECT * +FROM arrays +WHERE vcharArray <@ ?; + +overlaps: +SELECT * +FROM arrays +WHERE intArray && ?; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index 2a953c85d49..4d5c5947f48 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -375,9 +375,45 @@ class PostgreSqlTest { } @Test fun testArrays() { - with(database.arraysQueries.insertAndReturn(arrayOf(1u, 2u), arrayOf("one", "two")).executeAsOne()) { + with(database.arraysQueries.insertAndReturn(arrayOf(1u, 2u), arrayOf("one", "two"), arrayOf("a", "b")).executeAsOne()) { assertThat(intArray!!.asList()).containsExactly(1u, 2u).inOrder() assertThat(textArray!!.asList()).containsExactly("one", "two").inOrder() + assertThat(vcharArray!!.asList()).containsExactly("a", "b").inOrder() + } + } + + @Test fun testArrayContains() { + database.arraysQueries.insertAndReturn(arrayOf(1u, 2u), arrayOf("one", "two"), arrayOf("a", "b")).executeAsOne() + with(database.arraysQueries.contains(arrayOf(1u, 2u), arrayOf("a", "b")).executeAsList()) { + assertThat(first().expr).isTrue() + assertThat(first().expr_).isTrue() + } + } + + @Test fun testArrayContainsFirst() { + database.arraysQueries.insertAndReturn(arrayOf(1u, 2u), arrayOf("one", "two"), arrayOf("a", "b")).executeAsOne() + with(database.arraysQueries.containsFirst(arrayOf(1u, 2u)).executeAsList()) { + assertThat(first().intArray!!.asList()).containsExactly(1u, 2u).inOrder() + assertThat(first().textArray!!.asList()).containsExactly("one", "two").inOrder() + assertThat(first().vcharArray!!.asList()).containsExactly("a", "b").inOrder() + } + } + + @Test fun testArrayContainsSecond() { + database.arraysQueries.insertAndReturn(arrayOf(1u, 2u), arrayOf("one", "two"), arrayOf("a", "b")).executeAsOne() + with(database.arraysQueries.containsSecond(arrayOf("a", "b")).executeAsList()) { + assertThat(first().intArray!!.asList()).containsExactly(1u, 2u).inOrder() + assertThat(first().textArray!!.asList()).containsExactly("one", "two").inOrder() + assertThat(first().vcharArray!!.asList()).containsExactly("a", "b").inOrder() + } + } + + @Test fun testArrayOverlaps() { + database.arraysQueries.insertAndReturn(arrayOf(1u, 2u), arrayOf("one", "two"), arrayOf("a", "b")).executeAsOne() + with(database.arraysQueries.overlaps(arrayOf(1u, 2u)).executeAsList()) { + assertThat(first().intArray!!.asList()).containsExactly(1u, 2u).inOrder() + assertThat(first().textArray!!.asList()).containsExactly("one", "two").inOrder() + assertThat(first().vcharArray!!.asList()).containsExactly("a", "b").inOrder() } } From 432565ae8b1e626ab5a37619de4bb84056957c90 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 Jul 2024 18:32:36 +0000 Subject: [PATCH 177/304] Update dependency gradle to v8.9 (#5350) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43504 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 5 ++++- gradlew.bat | 2 ++ sample-web/gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43504 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- sample-web/gradlew | 7 +++++-- sample-web/gradlew.bat | 2 ++ sample/gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43504 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- sample/gradlew | 5 ++++- sample/gradlew.bat | 2 ++ 12 files changed, 22 insertions(+), 7 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..2c3521197d7c4586c843d1d3e9090525f1898cde 100644 GIT binary patch delta 8703 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 Ojj7^59?Sdh$^Qpp*~F>< delta 8662 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4413138c96..09523c0e549 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index b740cf13397..f5feea6d6b1 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 25da30dbdee..9d21a21834d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/sample-web/gradle/wrapper/gradle-wrapper.jar b/sample-web/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..2c3521197d7c4586c843d1d3e9090525f1898cde 100644 GIT binary patch delta 8703 zcmYLtRag{&)-BQ@Dc#cDDP2Q%r*wBHJ*0FE-92)X$3_b$L+F2Fa28UVeg>}yRjC}^a^+(Cdu_FTlV;w_x7ig{yd(NYi_;SHXEq`|Qa`qPMf1B~v#%<*D zn+KWJfX#=$FMopqZ>Cv7|0WiA^M(L@tZ=_Hi z*{?)#Cn^{TIzYD|H>J3dyXQCNy8f@~OAUfR*Y@C6r=~KMZ{X}q`t@Er8NRiCUcR=?Y+RMv`o0i{krhWT6XgmUt!&X=e_Q2=u@F=PXKpr9-FL@0 zfKigQcGHyPn{3vStLFk=`h@+Lh1XBNC-_nwNU{ytxZF$o}oyVfHMj|ZHWmEmZeNIlO5eLco<=RI&3=fYK*=kmv*75aqE~&GtAp(VJ z`VN#&v2&}|)s~*yQ)-V2@RmCG8lz5Ysu&I_N*G5njY`<@HOc*Bj)ZwC%2|2O<%W;M z+T{{_bHLh~n(rM|8SpGi8Whep9(cURNRVfCBQQ2VG<6*L$CkvquqJ~9WZ~!<6-EZ&L(TN zpSEGXrDiZNz)`CzG>5&_bxzBlXBVs|RTTQi5GX6s5^)a3{6l)Wzpnc|Cc~(5mO)6; z6gVO2Zf)srRQ&BSeg0)P2en#<)X30qXB{sujc3Ppm4*)}zOa)@YZ<%1oV9K%+(VzJ zk(|p>q-$v>lImtsB)`Mm;Z0LaU;4T1BX!wbnu-PSlH1%`)jZZJ(uvbmM^is*r=Y{B zI?(l;2n)Nx!goxrWfUnZ?y5$=*mVU$Lpc_vS2UyW>tD%i&YYXvcr1v7hL2zWkHf42 z_8q$Gvl>%468i#uV`RoLgrO+R1>xP8I^7~&3(=c-Z-#I`VDnL`6stnsRlYL zJNiI`4J_0fppF<(Ot3o2w?UT*8QQrk1{#n;FW@4M7kR}oW-}k6KNQaGPTs=$5{Oz} zUj0qo@;PTg#5moUF`+?5qBZ)<%-$qw(Z?_amW*X}KW4j*FmblWo@SiU16V>;nm`Eg zE0MjvGKN_eA%R0X&RDT!hSVkLbF`BFf;{8Nym#1?#5Fb?bAHY(?me2tww}5K9AV9y+T7YaqaVx8n{d=K`dxS|=))*KJn(~8u@^J% zj;8EM+=Dq^`HL~VPag9poTmeP$E`npJFh^|=}Mxs2El)bOyoimzw8(RQle(f$n#*v zzzG@VOO(xXiG8d?gcsp-Trn-36}+S^w$U(IaP`-5*OrmjB%Ozzd;jfaeRHAzc_#?- z`0&PVZANQIcb1sS_JNA2TFyN$*yFSvmZbqrRhfME3(PJ62u%KDeJ$ZeLYuiQMC2Sc z35+Vxg^@gSR6flp>mS|$p&IS7#fL@n20YbNE9(fH;n%C{w?Y0=N5?3GnQLIJLu{lm zV6h@UDB+23dQoS>>)p`xYe^IvcXD*6nDsR;xo?1aNTCMdbZ{uyF^zMyloFDiS~P7W>WuaH2+`xp0`!d_@>Fn<2GMt z&UTBc5QlWv1)K5CoShN@|0y1M?_^8$Y*U(9VrroVq6NwAJe zxxiTWHnD#cN0kEds(wN8YGEjK&5%|1pjwMH*81r^aXR*$qf~WiD2%J^=PHDUl|=+f zkB=@_7{K$Fo0%-WmFN_pyXBxl^+lLG+m8Bk1OxtFU}$fQU8gTYCK2hOC0sVEPCb5S z4jI07>MWhA%cA{R2M7O_ltorFkJ-BbmPc`{g&Keq!IvDeg8s^PI3a^FcF z@gZ2SB8$BPfenkFc*x#6&Z;7A5#mOR5qtgE}hjZ)b!MkOQ zEqmM3s>cI_v>MzM<2>U*eHoC69t`W`^9QBU^F$ z;nU4%0$)$ILukM6$6U+Xts8FhOFb|>J-*fOLsqVfB=vC0v2U&q8kYy~x@xKXS*b6i zy=HxwsDz%)!*T5Bj3DY1r`#@Tc%LKv`?V|g6Qv~iAnrqS+48TfuhmM)V_$F8#CJ1j4;L}TBZM~PX!88IT+lSza{BY#ER3TpyMqi# z#{nTi!IsLYt9cH?*y^bxWw4djrd!#)YaG3|3>|^1mzTuXW6SV4+X8sA2dUWcjH)a3 z&rXUMHbOO?Vcdf3H<_T-=DB0M4wsB;EL3lx?|T(}@)`*C5m`H%le54I{bfg7GHqYB z9p+30u+QXMt4z&iG%LSOk1uw7KqC2}ogMEFzc{;5x`hU(rh0%SvFCBQe}M#RSWJv;`KM zf7D&z0a)3285{R$ZW%+I@JFa^oZN)vx77y_;@p0(-gz6HEE!w&b}>0b)mqz-(lfh4 zGt}~Hl@{P63b#dc`trFkguB}6Flu!S;w7lp_>yt|3U=c|@>N~mMK_t#LO{n;_wp%E zQUm=z6?JMkuQHJ!1JV$gq)q)zeBg)g7yCrP=3ZA|wt9%_l#yPjsS#C7qngav8etSX+s?JJ1eX-n-%WvP!IH1%o9j!QH zeP<8aW}@S2w|qQ`=YNC}+hN+lxv-Wh1lMh?Y;LbIHDZqVvW^r;^i1O<9e z%)ukq=r=Sd{AKp;kj?YUpRcCr*6)<@Mnp-cx{rPayiJ0!7Jng}27Xl93WgthgVEn2 zQlvj!%Q#V#j#gRWx7((Y>;cC;AVbPoX*mhbqK*QnDQQ?qH+Q*$u6_2QISr!Fn;B-F@!E+`S9?+Jr zt`)cc(ZJ$9q^rFohZJoRbP&X3)sw9CLh#-?;TD}!i>`a;FkY6(1N8U-T;F#dGE&VI zm<*Tn>EGW(TioP@hqBg zn6nEolK5(}I*c;XjG!hcI0R=WPzT)auX-g4Znr;P`GfMa*!!KLiiTqOE*STX4C(PD z&}1K|kY#>~>sx6I0;0mUn8)=lV?o#Bcn3tn|M*AQ$FscYD$0H(UKzC0R588Mi}sFl z@hG4h^*;_;PVW#KW=?>N)4?&PJF&EO(X?BKOT)OCi+Iw)B$^uE)H>KQZ54R8_2z2_ z%d-F7nY_WQiSB5vWd0+>^;G^j{1A%-B359C(Eji{4oLT9wJ~80H`6oKa&{G- z)2n-~d8S0PIkTW_*Cu~nwVlE&Zd{?7QbsGKmwETa=m*RG>g??WkZ|_WH7q@ zfaxzTsOY2B3!Fu;rBIJ~aW^yqn{V;~4LS$xA zGHP@f>X^FPnSOxEbrnEOd*W7{c(c`b;RlOEQ*x!*Ek<^p*C#8L=Ty^S&hg zaV)g8<@!3p6(@zW$n7O8H$Zej+%gf^)WYc$WT{zp<8hmn!PR&#MMOLm^hcL2;$o=Q zXJ=9_0vO)ZpNxPjYs$nukEGK2bbL%kc2|o|zxYMqK8F?$YtXk9Owx&^tf`VvCCgUz zLNmDWtociY`(}KqT~qnVUkflu#9iVqXw7Qi7}YT@{K2Uk(Wx7Q-L}u^h+M(81;I*J ze^vW&-D&=aOQq0lF5nLd)OxY&duq#IdK?-r7En0MnL~W51UXJQFVVTgSl#85=q$+| zHI%I(T3G8ci9Ubq4(snkbQ*L&ksLCnX_I(xa1`&(Bp)|fW$kFot17I)jyIi06dDTTiI%gNR z8i*FpB0y0 zjzWln{UG1qk!{DEE5?0R5jsNkJ(IbGMjgeeNL4I9;cP&>qm%q7cHT}@l0v;TrsuY0 zUg;Z53O-rR*W!{Q*Gp26h`zJ^p&FmF0!EEt@R3aT4YFR0&uI%ko6U0jzEYk_xScP@ zyk%nw`+Ic4)gm4xvCS$)y;^)B9^}O0wYFEPas)!=ijoBCbF0DbVMP z`QI7N8;88x{*g=51AfHx+*hoW3hK(?kr(xVtKE&F-%Tb}Iz1Z8FW>usLnoCwr$iWv ztOVMNMV27l*fFE29x}veeYCJ&TUVuxsd`hV-8*SxX@UD6au5NDhCQ4Qs{{CJQHE#4 z#bg6dIGO2oUZQVY0iL1(Q>%-5)<7rhnenUjOV53*9Qq?aU$exS6>;BJqz2|#{We_| zX;Nsg$KS<+`*5=WA?idE6G~kF9oQPSSAs#Mh-|)@kh#pPCgp&?&=H@Xfnz`5G2(95 z`Gx2RfBV~`&Eyq2S9m1}T~LI6q*#xC^o*EeZ#`}Uw)@RD>~<_Kvgt2?bRbO&H3&h- zjB&3bBuWs|YZSkmcZvX|GJ5u7#PAF$wj0ULv;~$7a?_R%e%ST{al;=nqj-<0pZiEgNznHM;TVjCy5E#4f?hudTr0W8)a6o;H; zhnh6iNyI^F-l_Jz$F`!KZFTG$yWdioL=AhImGr!$AJihd{j(YwqVmqxMKlqFj<_Hlj@~4nmrd~&6#f~9>r2_e-^nca(nucjf z;(VFfBrd0?k--U9L*iey5GTc|Msnn6prtF*!5AW3_BZ9KRO2(q7mmJZ5kz-yms`04e; z=uvr2o^{lVBnAkB_~7b7?1#rDUh4>LI$CH1&QdEFN4J%Bz6I$1lFZjDz?dGjmNYlD zDt}f;+xn-iHYk~V-7Fx!EkS``+w`-f&Ow>**}c5I*^1tpFdJk>vG23PKw}FrW4J#x zBm1zcp^){Bf}M|l+0UjvJXRjP3~!#`I%q*E=>?HLZ>AvB5$;cqwSf_*jzEmxxscH; zcl>V3s>*IpK`Kz1vP#APs#|tV9~#yMnCm&FOllccilcNmAwFdaaY7GKg&(AKG3KFj zk@%9hYvfMO;Vvo#%8&H_OO~XHlwKd()gD36!_;o z*7pl*o>x9fbe?jaGUO25ZZ@#qqn@|$B+q49TvTQnasc$oy`i~*o}Ka*>Wg4csQOZR z|Fs_6-04vj-Dl|B2y{&mf!JlPJBf3qG~lY=a*I7SBno8rLRdid7*Kl@sG|JLCt60# zqMJ^1u^Gsb&pBPXh8m1@4;)}mx}m%P6V8$1oK?|tAk5V6yyd@Ez}AlRPGcz_b!c;; z%(uLm1Cp=NT(4Hcbk;m`oSeW5&c^lybx8+nAn&fT(!HOi@^&l1lDci*?L#*J7-u}} z%`-*V&`F1;4fWsvcHOlZF#SD&j+I-P(Mu$L;|2IjK*aGG3QXmN$e}7IIRko8{`0h9 z7JC2vi2Nm>g`D;QeN@^AhC0hKnvL(>GUqs|X8UD1r3iUc+-R4$=!U!y+?p6rHD@TL zI!&;6+LK_E*REZ2V`IeFP;qyS*&-EOu)3%3Q2Hw19hpM$3>v!!YABs?mG44{L=@rjD%X-%$ajTW7%t_$7to%9d3 z8>lk z?_e}(m&>emlIx3%7{ER?KOVXi>MG_)cDK}v3skwd%Vqn0WaKa1;e=bK$~Jy}p#~`B zGk-XGN9v)YX)K2FM{HNY-{mloSX|a?> z8Om9viiwL|vbVF~j%~hr;|1wlC0`PUGXdK12w;5Wubw}miQZ)nUguh?7asm90n>q= z;+x?3haT5#62bg^_?VozZ-=|h2NbG%+-pJ?CY(wdMiJ6!0ma2x{R{!ys=%in;;5@v z{-rpytg){PNbCGP4Ig>=nJV#^ie|N68J4D;C<1=$6&boh&ol~#A?F-{9sBL*1rlZshXm~6EvG!X9S zD5O{ZC{EEpHvmD5K}ck+3$E~{xrrg*ITiA}@ZCoIm`%kVqaX$|#ddV$bxA{jux^uRHkH)o6#}fT6XE|2BzU zJiNOAqcxdcQdrD=U7OVqer@p>30l|ke$8h;Mny-+PP&OM&AN z9)!bENg5Mr2g+GDIMyzQpS1RHE6ow;O*ye;(Qqej%JC?!D`u;<;Y}1qi5cL&jm6d9 za{plRJ0i|4?Q%(t)l_6f8An9e2<)bL3eULUVdWanGSP9mm?PqFbyOeeSs9{qLEO-) zTeH*<$kRyrHPr*li6p+K!HUCf$OQIqwIw^R#mTN>@bm^E=H=Ger_E=ztfGV9xTgh=}Hep!i97A;IMEC9nb5DBA5J#a8H_Daq~ z6^lZ=VT)7=y}H3=gm5&j!Q79#e%J>w(L?xBcj_RNj44r*6^~nCZZYtCrLG#Njm$$E z7wP?E?@mdLN~xyWosgwkCot8bEY-rUJLDo7gukwm@;TjXeQ>fr(wKP%7LnH4Xsv?o zUh6ta5qPx8a5)WO4 zK37@GE@?tG{!2_CGeq}M8VW(gU6QXSfadNDhZEZ}W2dwm)>Y7V1G^IaRI9ugWCP#sw1tPtU|13R!nwd1;Zw8VMx4hUJECJkocrIMbJI zS9k2|`0$SD%;g_d0cmE7^MXP_;_6`APcj1yOy_NXU22taG9Z;C2=Z1|?|5c^E}dR& zRfK2Eo=Y=sHm@O1`62ciS1iKv9BX=_l7PO9VUkWS7xlqo<@OxlR*tn$_WbrR8F?ha zBQ4Y!is^AIsq-46^uh;=9B`gE#Sh+4m>o@RMZFHHi=qb7QcUrgTos$e z^4-0Z?q<7XfCP~d#*7?hwdj%LyPj2}bsdWL6HctL)@!tU$ftMmV=miEvZ2KCJXP%q zLMG&%rVu8HaaM-tn4abcSE$88EYmK|5%_29B*L9NyO|~j3m>YGXf6fQL$(7>Bm9o zjHfJ+lmYu_`+}xUa^&i81%9UGQ6t|LV45I)^+m@Lz@jEeF;?_*y>-JbK`=ZVsSEWZ z$p^SK_v(0d02AyIv$}*8m)9kjef1-%H*_daPdSXD6mpc>TW`R$h9On=Z9n>+f4swL zBz^(d9uaQ_J&hjDvEP{&6pNz-bg;A===!Ac%}bu^>0}E)wdH1nc}?W*q^J2SX_A*d zBLF@n+=flfH96zs@2RlOz&;vJPiG6In>$&{D+`DNgzPYVu8<(N&0yPt?G|>D6COM# zVd)6v$i-VtYfYi1h)pXvO}8KO#wuF=F^WJXPC+;hqpv>{Z+FZTP1w&KaPl?D)*A=( z8$S{Fh;Ww&GqSvia6|MvKJg-RpNL<6MXTl(>1}XFfziRvPaLDT1y_tjLYSGS$N;8| zZC*Hcp!~u?v~ty3&dBm`1A&kUe6@`q!#>P>ZZZgGRYhNIxFU6B>@f@YL%hOV0=9s# z?@0~aR1|d9LFoSI+li~@?g({Y0_{~~E_MycHTXz`EZmR2$J$3QVoA25j$9pe?Ub)d z`jbm8v&V0JVfY-^1mG=a`70a_tjafgi}z-8$smw7Mc`-!*6y{rB-xN1l`G3PLBGk~ z{o(KCV0HEfj*rMAiluQuIZ1tevmU@m{adQQr3xgS!e_WXw&eE?GjlS+tL0@x%Hm{1 zzUF^qF*2KAxY0$~pzVRpg9dA*)^ z7&wu-V$7+Jgb<5g;U1z*ymus?oZi7&gr!_3zEttV`=5VlLtf!e&~zv~PdspA0JCRz zZi|bO5d)>E;q)?}OADAhGgey#6(>+36XVThP%b#8%|a9B_H^)Nps1md_lVv5~OO@(*IJO@;eqE@@(y}KA- z`zj@%6q#>hIgm9}*-)n(^Xbdp8`>w~3JCC`(H{NUh8Umm{NUntE+eMg^WvSyL+ilV zff54-b59jg&r_*;*#P~ON#I=gAW99hTD;}nh_j;)B6*tMgP_gz4?=2EJZg$8IU;Ly<(TTC?^)& zj@%V!4?DU&tE=8)BX6f~x0K+w$%=M3;Fpq$VhETRlJ8LEEe;aUcG;nBe|2Gw>+h7CuJ-^gYFhQzDg(`e=!2f7t0AXrl zAx`RQ1u1+}?EkEWSb|jQN)~wOg#Ss&1oHoFBvg{Z|4#g$)mNzjKLq+8rLR(jC(QUC Ojj7^59?Sdh$^Qpp*~F>< delta 8662 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 diff --git a/sample-web/gradle/wrapper/gradle-wrapper.properties b/sample-web/gradle/wrapper/gradle-wrapper.properties index a4413138c96..09523c0e549 100644 --- a/sample-web/gradle/wrapper/gradle-wrapper.properties +++ b/sample-web/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample-web/gradlew b/sample-web/gradlew index 1aa94a42690..f5feea6d6b1 100755 --- a/sample-web/gradlew +++ b/sample-web/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/sample-web/gradlew.bat b/sample-web/gradlew.bat index 25da30dbdee..9d21a21834d 100644 --- a/sample-web/gradlew.bat +++ b/sample-web/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## diff --git a/sample/gradle/wrapper/gradle-wrapper.jar b/sample/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..2c3521197d7c4586c843d1d3e9090525f1898cde 100644 GIT binary patch delta 8703 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 Ojj7^59?Sdh$^Qpp*~F>< delta 8662 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 diff --git a/sample/gradle/wrapper/gradle-wrapper.properties b/sample/gradle/wrapper/gradle-wrapper.properties index a4413138c96..09523c0e549 100644 --- a/sample/gradle/wrapper/gradle-wrapper.properties +++ b/sample/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample/gradlew b/sample/gradlew index b740cf13397..f5feea6d6b1 100755 --- a/sample/gradlew +++ b/sample/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/sample/gradlew.bat b/sample/gradlew.bat index 25da30dbdee..9d21a21834d 100644 --- a/sample/gradlew.bat +++ b/sample/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## From 713b959ad3c882d2d0bcd145d0d1625caa811b26 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 11 Jul 2024 19:36:40 -0400 Subject: [PATCH 178/304] Update agp to v8.5.1 (#5351) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7cb2467b259..4871e6421d9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.3.1" -agp = "8.5.0" +agp = "8.5.1" compileSdk = "34" minSdk = "21" sqlPsi = "0.4.9" From 10405b26070590be8dc3f92a5cc626a535e42687 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 13 Jul 2024 08:50:01 -0400 Subject: [PATCH 179/304] Update dependency com.google.truth:truth to v1.4.4 (#5352) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4871e6421d9..23546070071 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -38,7 +38,7 @@ android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.18.0" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } -truth = { module = "com.google.truth:truth", version = "1.4.3" } +truth = { module = "com.google.truth:truth", version = "1.4.4" } turbine = { module = "app.cash.turbine:turbine", version = "1.1.0" } bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.1" } picnic = { module = "com.jakewharton.picnic:picnic", version = "0.7.0" } From 6e4c6854460987100b640bb3589645cf8e4fc59c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 08:38:50 -0400 Subject: [PATCH 180/304] Update dependency com.squareup:kotlinpoet to v1.18.1 (#5355) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 23546070071..a6c670fec6b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -35,7 +35,7 @@ androidx-paging3-runtime = { module = "androidx.paging:paging-runtime", version. androidx-recyclerView = { module = "androidx.recyclerview:recyclerview", version = "1.3.2" } android-plugin = { module = "com.android.tools.build:gradle", version.ref = "agp" } -kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.18.0" } +kotlinPoet = { module = "com.squareup:kotlinpoet", version = "1.18.1" } junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } truth = { module = "com.google.truth:truth", version = "1.4.4" } From 40590a54efe4cbca7c6ccfc2e9c3e668065cf056 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Tue, 16 Jul 2024 17:12:28 +0100 Subject: [PATCH 181/304] Fix 5345 PostgreSql SELECT DISTINCT ON (#5353) * Update DistinctOnExpressionMixin.kt Update DistinctOnExpressionMixin.kt - expose missing tables Query the columns or any tables prefixing columns in the distinctOn clause As there could be one or more columns with the same table prefix, remove any duplicates * Add tests fixture tests - multiple tables and columns in DISTINCT ON integration test - valid sql is generated and helps prevent regressions * Remove unnecessary nullability As the code is was using mapNotNull Remove unnecessary null type parameter and not-null assertion operator --- .../mixins/DistinctOnExpressionMixin.kt | 10 ++++- .../select-distinct-on/Test.s | 40 ++++++++++++------- .../select-distinct-on/failure.txt | 6 +-- .../postgresql/integration/DistinctOn.sq | 29 ++++++++++++++ .../postgresql/integration/PostgreSqlTest.kt | 24 +++++++++++ 5 files changed, 90 insertions(+), 19 deletions(-) create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/DistinctOn.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DistinctOnExpressionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DistinctOnExpressionMixin.kt index 16f69b4938b..93a032fe269 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DistinctOnExpressionMixin.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/DistinctOnExpressionMixin.kt @@ -2,11 +2,13 @@ package app.cash.sqldelight.dialects.postgresql.grammar.mixins import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlDistinctOnExpr import com.alecstrong.sql.psi.core.SqlAnnotationHolder +import com.alecstrong.sql.psi.core.psi.NamedElement import com.alecstrong.sql.psi.core.psi.QueryElement import com.alecstrong.sql.psi.core.psi.SqlColumnName import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl import com.alecstrong.sql.psi.core.psi.SqlResultColumn import com.alecstrong.sql.psi.core.psi.SqlSelectStmt +import com.alecstrong.sql.psi.core.psi.SqlTableName import com.alecstrong.sql.psi.core.psi.impl.SqlCompoundSelectStmtImpl import com.intellij.lang.ASTNode import com.intellij.psi.PsiElement @@ -19,7 +21,13 @@ internal abstract class DistinctOnExpressionMixin(node: ASTNode) : private val distinctOnColumns get() = children.filterIsInstance() override fun queryAvailable(child: PsiElement): Collection { - return (parent as SqlSelectStmt).queryExposed() + val distinctOnColumnsWithTablePrefix: List = + distinctOnColumns.mapNotNull { PsiTreeUtil.findChildOfType(it, SqlTableName::class.java) } + return if (distinctOnColumnsWithTablePrefix.isEmpty()) { + (parent as SqlSelectStmt).queryExposed() + } else { + distinctOnColumnsWithTablePrefix.flatMap { tableAvailable(child, it.name) }.associateBy { it.table }.values + } } // Some idea of the basic validation finds the ORDER BY columns in the DISTINCT ON diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct-on/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct-on/Test.s index e9743a7efdb..98282819e53 100644 --- a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct-on/Test.s +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct-on/Test.s @@ -4,28 +4,38 @@ CREATE TABLE person ( created_at TIMESTAMPTZ ); -SELECT DISTINCT ON (name) * +SELECT DISTINCT ON (person.name) * FROM person; SELECT DISTINCT ON (name) * -FROM person -ORDER BY name, created_at DESC; +FROM person; -SELECT DISTINCT ON (id, name) id, name -FROM person -ORDER BY name DESC; +CREATE TABLE student( + student_id INTEGER PRIMARY KEY, + name TEXT NOT NULL +); -SELECT DISTINCT ON (name, id) id, name, created_at -FROM person -ORDER BY id DESC; +CREATE TABLE grade( + grade_id INTEGER PRIMARY KEY, + student_id INTEGER REFERENCES student(student_id), + grade INT NOT NULL, + grade_date TIMESTAMP NOT NULL +); -SELECT DISTINCT ON (name, id) id, name -FROM person -ORDER BY id, name ASC; +SELECT DISTINCT ON (grade.student_id) grade.*, student.* +FROM grade +JOIN student USING (student_id) +ORDER BY grade.student_id, grade_date; -SELECT DISTINCT ON (name, id) id, name -FROM person -ORDER BY id, name, created_at ASC; +SELECT DISTINCT ON (grade.student_id, grade.grade_date) grade.*, student.* +FROM grade +JOIN student USING (student_id) +ORDER BY grade.student_id, grade_date; + +SELECT DISTINCT ON (student_id) * +FROM grade +JOIN student USING (student_id) +ORDER BY student_id, grade_date; -- fail SELECT DISTINCT ON (name) * diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct-on/failure.txt b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct-on/failure.txt index 1b525a280a0..29c33267114 100644 --- a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct-on/failure.txt +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/select-distinct-on/failure.txt @@ -1,3 +1,3 @@ -Test.s line 33:9 - SELECT DISTINCT ON expressions must match initial ORDER BY expressions -Test.s line 38:9 - SELECT DISTINCT ON expressions must match initial ORDER BY expressions -Test.s line 43:15 - SELECT DISTINCT ON expressions must match initial ORDER BY expressions +Test.s line 43:9 - SELECT DISTINCT ON expressions must match initial ORDER BY expressions +Test.s line 48:9 - SELECT DISTINCT ON expressions must match initial ORDER BY expressions +Test.s line 53:15 - SELECT DISTINCT ON expressions must match initial ORDER BY expressions diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/DistinctOn.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/DistinctOn.sq new file mode 100644 index 00000000000..9d9cccae686 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/DistinctOn.sq @@ -0,0 +1,29 @@ +CREATE TABLE student( + student_id INTEGER PRIMARY KEY, + name TEXT NOT NULL +); + +CREATE TABLE grade( + grade_id INTEGER PRIMARY KEY, + student_id INTEGER REFERENCES student(student_id), + grade INT NOT NULL, + grade_date TIMESTAMP NOT NULL +); + +insertStudent: +INSERT INTO student VALUES ?; + +insertGrade: +INSERT INTO grade VALUES ?; + +selectDistinctOnStudent: +SELECT DISTINCT ON (student_id) * +FROM grade +JOIN student USING (student_id) +ORDER BY student_id, grade_date; + +selectDistinctOnStudentGradeDate: +SELECT DISTINCT ON (grade.student_id, grade.grade_date) grade.*, student.* +FROM grade +JOIN student USING (student_id) +ORDER BY grade.student_id, grade_date; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index 4d5c5947f48..7a09ff13168 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -1037,4 +1037,28 @@ class PostgreSqlTest { assertThat(x2).isEqualTo(b) } } + + @Test + fun testSelectDistinctOn() { + val studentExpected = Student(1000, "Test Student") + val gradeExpected = Grade(4000, studentExpected.student_id, 5, LocalDateTime.of(1980, 1, 1, 1, 0, 0)) + database.distinctOnQueries.insertStudent(studentExpected) + database.distinctOnQueries.insertGrade(gradeExpected) + + with(database.distinctOnQueries.selectDistinctOnStudent().executeAsOne()) { + assertThat(student_id).isEqualTo(studentExpected.student_id) + assertThat(name).isEqualTo(studentExpected.name) + assertThat(grade_id).isEqualTo(gradeExpected.grade_id) + assertThat(grade).isEqualTo(gradeExpected.grade) + assertThat(grade_date).isEqualTo(gradeExpected.grade_date) + } + + with(database.distinctOnQueries.selectDistinctOnStudentGradeDate().executeAsOne()) { + assertThat(student_id).isEqualTo(studentExpected.student_id) + assertThat(name).isEqualTo(studentExpected.name) + assertThat(grade_id).isEqualTo(gradeExpected.grade_id) + assertThat(grade).isEqualTo(gradeExpected.grade) + assertThat(grade_date).isEqualTo(gradeExpected.grade_date) + } + } } From 6bb8711dd3b5cfc671931081bf850f7d7aa1888a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:10:19 +0100 Subject: [PATCH 182/304] Add 5273 Postrgesql extract from temporal types (#5274) * Add Postgresql EXTRACT function extract temporal fields * Add tests fixture test integration test * Integration Test todo - bind arg test "?" needs cast e.g `?::TIMESTAMP` * Add TIME and DATE literals Add Support for: SELECT EXTRACT(MONTH FROM DATE '2023-05-15'); SELECT EXTRACT(HOUR FROM TIME '10:30:45'); * Update Test.s SELECT EXTRACT(MONTH FROM DATE '2023-05-15'); SELECT EXTRACT(HOUR FROM TIME '10:30:45'); * Add date and time literals To support Extract * Date and Time tests Literal Date and Time tests * Add Date and Time test Integration Test for Extract * Update PostgreSqlTypeResolver.kt Add error to validate temporal types * Add Interval test Integration test for INTERVAL returns double(3) * Update PostgreSql.bnf Add latest temporal fields (22) --- .../postgresql/PostgreSqlTypeResolver.kt | 20 ++++++++++-- .../postgresql/grammar/PostgreSql.bnf | 21 +++++++++++-- .../mixins/ExtractTemporalExpressionMixin.kt | 18 +++++++++++ .../extract-expressions/Test.s | 16 ++++++++++ .../postgresql/integration/Dates.sq | 7 +++++ .../postgresql/integration/Extract.sq | 21 +++++++++++++ .../postgresql/integration/PostgreSqlTest.kt | 31 +++++++++++++++++++ 7 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ExtractTemporalExpressionMixin.kt create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/extract-expressions/Test.s create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Extract.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index 52281f727f9..85eb7207460 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -20,6 +20,7 @@ import app.cash.sqldelight.dialects.postgresql.PostgreSqlType.TIMESTAMP_TIMEZONE import app.cash.sqldelight.dialects.postgresql.grammar.mixins.AggregateExpressionMixin import app.cash.sqldelight.dialects.postgresql.grammar.mixins.AtTimeZoneOperatorExpressionMixin import app.cash.sqldelight.dialects.postgresql.grammar.mixins.DoubleColonCastOperatorExpressionMixin +import app.cash.sqldelight.dialects.postgresql.grammar.mixins.ExtractTemporalExpressionMixin import app.cash.sqldelight.dialects.postgresql.grammar.mixins.WindowFunctionMixin import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlAtTimeZoneOperator import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlDeleteStmtLimited @@ -280,8 +281,8 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes } is SqlLiteralExpr -> when { literalValue.text == "TRUE" || literalValue.text == "FALSE" -> IntermediateType(BOOLEAN) - literalValue.text == "CURRENT_DATE" -> IntermediateType(PostgreSqlType.DATE) - literalValue.text == "CURRENT_TIME" -> IntermediateType(PostgreSqlType.TIME) + literalValue.text == "CURRENT_DATE" || literalValue.text.startsWith("DATE ") -> IntermediateType(PostgreSqlType.DATE) + literalValue.text == "CURRENT_TIME" || literalValue.text.startsWith("TIME ") -> IntermediateType(PostgreSqlType.TIME) literalValue.text.startsWith("CURRENT_TIMESTAMP") -> IntermediateType(PostgreSqlType.TIMESTAMP_TIMEZONE) literalValue.text.startsWith("TIMESTAMP WITH TIME ZONE") -> IntermediateType(PostgreSqlType.TIMESTAMP_TIMEZONE) literalValue.text.startsWith("TIMESTAMP WITHOUT TIME ZONE") -> IntermediateType(TIMESTAMP) @@ -323,6 +324,13 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes val lastTypeCast = doubleColonCastOperatorExpression!!.doubleColonCastOperatorList.last().typeName definitionType(lastTypeCast).nullableIf(expType.javaType.isNullable) } + extractTemporalExpression != null -> { + val temporalExprType = (extractTemporalExpression as ExtractTemporalExpressionMixin).expr.postgreSqlType() + if (temporalExprType.dialectType !in temporalTypes) { + error("EXTRACT FROM requires a temporal type argument. The provided argument ${temporalExprType.dialectType} is not supported.") + } + IntermediateType(REAL).nullableIf(temporalExprType.javaType.isNullable) + } else -> parentResolver.resolvedType(this) } @@ -343,6 +351,14 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes SqlTypes.LTE, ) + private val temporalTypes = listOf( + DATE, + PostgreSqlType.INTERVAL, + PostgreSqlType.TIMESTAMP_TIMEZONE, + PostgreSqlType.TIMESTAMP, + PostgreSqlType.TIME, + ) + private fun arrayIntermediateType(type: IntermediateType): IntermediateType { return IntermediateType( object : DialectType { diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 8e5e2ef7cb8..7f0e9fe3d8d 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -240,10 +240,14 @@ tsvector_data_type ::= 'TSVECTOR' xml_data_type ::= 'XML' -interval_expression ::= 'INTERVAL' string_literal +interval_expression ::= 'INTERVAL' {string_literal} timestamp_expression ::= 'TIMESTAMP' [ (WITH | WITHOUT) 'TIME' 'ZONE' ] {string_literal} +date_expression ::= 'DATE' {string_literal} + +time_expression ::= 'TIME' {string_literal} + with_clause_auxiliary_stmt ::= {compound_select_stmt} | delete_stmt_limited | insert_stmt | update_stmt_limited { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlWithClauseAuxiliaryStmtImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlWithClauseAuxiliaryStmt" @@ -278,7 +282,9 @@ literal_value ::= ( {numeric_literal} | boolean_literal | current_date_time_functions | interval_expression - | timestamp_expression) { + | timestamp_expression + | date_expression + | time_expression ) { mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.LiteralValueMixin" implements = "com.alecstrong.sql.psi.core.psi.SqlLiteralValue" override = true @@ -410,7 +416,7 @@ compound_select_stmt ::= [ {with_clause} ] {select_stmt} ( {compound_operator} override = true } -extension_expr ::= double_colon_cast_operator_expression | contains_operator_expression | at_time_zone_operator_expression | regex_match_operator_expression | match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_not_expression | window_function_expr { +extension_expr ::= extract_temporal_expression | double_colon_cast_operator_expression | contains_operator_expression | at_time_zone_operator_expression | regex_match_operator_expression | match_operator_expression | array_agg_stmt| string_agg_stmt | json_expression | boolean_not_expression | window_function_expr { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionExprImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionExpr" override = true @@ -596,3 +602,12 @@ ordering_term ::= <> [ ASC | DESC ] [ 'NULLS' ( 'FIRST' | 'LAST' ) ] implements = "com.alecstrong.sql.psi.core.psi.SqlOrderingTerm" override = true } + +extract_temporal_field ::= 'century' | 'day' | 'decade' | 'dow' | 'doy' | 'epoch' | 'hour' | 'isodow' | 'isoyear' | 'julian' + | 'microseconds' | 'millennium' | 'milliseconds' | 'minute' | 'month' | 'quarter' | 'second' | 'timezone' | 'timezone_hour' + | 'timezone_minute' | 'week' | 'year' + +extract_temporal_expression ::= 'EXTRACT' LP extract_temporal_field FROM <> RP { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.ExtractTemporalExpressionMixin" + pin = 2 +} diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ExtractTemporalExpressionMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ExtractTemporalExpressionMixin.kt new file mode 100644 index 00000000000..ca5318817a6 --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/ExtractTemporalExpressionMixin.kt @@ -0,0 +1,18 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlExtractTemporalExpression +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlExpr +import com.intellij.lang.ASTNode + +/** + * e.g access expr node for nullable type see `PostgreSqlTypeResolver extractTemporalExpression` + * EXTRACT(HOUR FROM TIME '10:30:45'), + * EXTRACT(DAY FROM created_date) + */ +internal abstract class ExtractTemporalExpressionMixin(node: ASTNode) : + SqlCompositeElementImpl(node), + SqlExpr, + PostgreSqlExtractTemporalExpression { + val expr get() = children.filterIsInstance().first() +} diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/extract-expressions/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/extract-expressions/Test.s new file mode 100644 index 00000000000..befbc821dca --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/extract-expressions/Test.s @@ -0,0 +1,16 @@ +CREATE TABLE Events( + start_at TIMESTAMPTZ NOT NULL CHECK(date_part('minute', start_at) IN (00,30)), + end_at TIMESTAMPTZ NOT NULL CHECK(date_part('minute', end_at) IN (00,30)), + duration INT GENERATED ALWAYS AS (EXTRACT(epoch FROM end_at - start_at)/ 60) stored, + created_date DATE +); + +SELECT EXTRACT(YEAR FROM TIMESTAMP '2023-05-15 10:30:45'); + +SELECT EXTRACT(MONTH FROM DATE '2023-05-15'); + +SELECT EXTRACT(HOUR FROM TIME '10:30:45'); + +SELECT EXTRACT(EPOCH FROM INTERVAL '1 day 2 hours'); + +SELECT EXTRACT(HOUR FROM created_date) FROM Events; diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dates.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dates.sq index 16d3ff00d68..46175a476fe 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dates.sq +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Dates.sq @@ -42,3 +42,10 @@ SELECT max(date) FROM dates; selectMinDate: SELECT min(date) FROM dates; + +selectDateLiteral: +SELECT DATE '2023-05-15'; + +selectTimeLiteral: +SELECT TIME '10:30:45'; + diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Extract.sq b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Extract.sq new file mode 100644 index 00000000000..f1a872d8aa5 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Extract.sq @@ -0,0 +1,21 @@ +CREATE TABLE Events( + start_at TIMESTAMPTZ NOT NULL CHECK(date_part('minute', start_at) IN (00,30)), + end_at TIMESTAMPTZ NOT NULL CHECK(date_part('minute', end_at) IN (00,30)), + duration INT GENERATED ALWAYS AS (EXTRACT(epoch FROM end_at - start_at)/ 60) stored, + created_date DATE +); + +select: +SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'), + EXTRACT(YEAR FROM TIMESTAMP '2023-05-15 10:30:45'), + EXTRACT(EPOCH FROM INTERVAL '1 day 2 hours'), + EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'), + EXTRACT(MINUTE FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-08'), + EXTRACT(DAY FROM created_date), + EXTRACT(MONTH FROM DATE '2023-05-15'), + EXTRACT(HOUR FROM TIME '10:30:45'), + EXTRACT(MONTH FROM INTERVAL '2 years 3 months') +FROM Events; + +insert: +INSERT INTO Events (start_at, end_at, created_date) VALUES (?, ?, ?); diff --git a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt index 7a09ff13168..f6590ab7bc6 100644 --- a/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt +++ b/sqldelight-gradle-plugin/src/test/integration-postgresql/src/test/kotlin/app/cash/sqldelight/postgresql/integration/PostgreSqlTest.kt @@ -423,6 +423,16 @@ class PostgreSqlTest { assertThat(now).isGreaterThan(OffsetDateTime.MIN) } + @Test fun testDateLiteral() { + val dateLiteral = database.datesQueries.selectDateLiteral().executeAsOne() + assertThat(dateLiteral).isEqualTo(LocalDate.of(2023, 5, 15)) + } + + @Test fun testTimeLiteral() { + val timeLiteral = database.datesQueries.selectTimeLiteral().executeAsOne() + assertThat(timeLiteral).isEqualTo(LocalTime.of(10, 30, 45, 0)) + } + @Test fun nowPlusInterval() { val selectNowInterval = database.datesQueries.selectNowInterval().executeAsOne() assertThat(selectNowInterval.now).isNotNull() @@ -1038,6 +1048,27 @@ class PostgreSqlTest { } } + @Test + fun testExtract() { + val sa = OffsetDateTime.of(2001, 2, 16, 19, 30, 0, 0, ZoneOffset.ofHours(0)) + val ea = OffsetDateTime.of(2001, 2, 16, 20, 30, 0, 0, ZoneOffset.ofHours(0)) + val cd = LocalDate.of(2001, 2, 16) + + database.extractQueries.insert(sa, ea, cd) + + with(database.extractQueries.select().executeAsOne()) { + assertThat(expr).isEqualTo(5) + assertThat(expr_).isEqualTo(2023) + assertThat(expr__).isEqualTo(93600) + assertThat(expr___).isEqualTo(20) + assertThat(expr____).isEqualTo(38) + assertThat(expr_____).isEqualTo(16) + assertThat(expr______).isEqualTo(5) + assertThat(expr_______).isEqualTo(10) + assertThat(expr________).isEqualTo(3) + } + } + @Test fun testSelectDistinctOn() { val studentExpected = Student(1000, "Test Student") From 04ff127e3ee2bf922954e93ab0d61950aadfe624 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:18:41 -0400 Subject: [PATCH 183/304] Update plugin binaryCompatibilityValidator to v0.16.0 (#5357) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a6c670fec6b..607222963e2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -109,4 +109,4 @@ spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } ksp = { id = "com.google.devtools.ksp", version = "1.9.24-1.0.20" } -binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.15.1" } +binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.0" } From 2c5197d17b27ef141da5ba20befccc3ddbb100b5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Jul 2024 18:56:00 +0000 Subject: [PATCH 184/304] Update testcontainers-java monorepo to v1.20.0 (#5358) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 607222963e2..90f7d37d09b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ agp = "8.5.1" compileSdk = "34" minSdk = "21" sqlPsi = "0.4.9" -testContainers = "1.19.8" +testContainers = "1.20.0" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } From 105c71b7956728fba945dde30cbd49b76700245e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 16:38:07 +0000 Subject: [PATCH 185/304] Update plugin binaryCompatibilityValidator to v0.16.1 (#5361) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 90f7d37d09b..b26f9a9de84 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -109,4 +109,4 @@ spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } ksp = { id = "com.google.devtools.ksp", version = "1.9.24-1.0.20" } -binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.0" } +binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.1" } From 4bbaa08e16bba5cc7c2145544fd2a1613b0d41db Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 23:59:40 +0000 Subject: [PATCH 186/304] Update plugin binaryCompatibilityValidator to v0.16.2 (#5362) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b26f9a9de84..2c23c1a4c40 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -109,4 +109,4 @@ spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } ksp = { id = "com.google.devtools.ksp", version = "1.9.24-1.0.20" } -binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.1" } +binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.2" } From c04057b69b7aad3900637518ee8bdc6fb3f38674 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 13:47:25 +0000 Subject: [PATCH 187/304] Update plugin com.gradle.develocity to v3.17.6 (#5365) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index 73510e3b9b4..20b2adb4ff0 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.5" + id "com.gradle.develocity" version "3.17.6" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index c492a90b09e..72e52cfca9e 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.5" + id "com.gradle.develocity" version "3.17.6" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/settings.gradle b/settings.gradle index c83b02e7f03..9fa5413732f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.5" + id "com.gradle.develocity" version "3.17.6" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } From 95571ccd3859670ac48a8e868d5ad7e959184acc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 17:46:27 +0000 Subject: [PATCH 188/304] Update plugin ksp to v1.9.25-1.0.20 (#5369) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2c23c1a4c40..d8df62e91e6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -108,5 +108,5 @@ publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } -ksp = { id = "com.google.devtools.ksp", version = "1.9.24-1.0.20" } +ksp = { id = "com.google.devtools.ksp", version = "1.9.25-1.0.20" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.2" } From 4325311fed9b7a6503c65e0199789a5a27aff870 Mon Sep 17 00:00:00 2001 From: Pierre-Marie Padiou Date: Thu, 25 Jul 2024 19:48:57 +0200 Subject: [PATCH 189/304] Make JVM samples consistent with other platforms (#5374) The JVM code samples do not use the `PRAGMA user_version`-based migration logic, which is a bit misleading because samples for other platforms do. The inconsistency is particularly visible in the Multiplatform case, where the android and native samples will set `user_version=1`, but the JVM sample will produce `user_version=0`. --- docs/jvm_sqlite/index.md | 8 +++----- docs/multiplatform_sqlite/index.md | 19 +++++++++---------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/docs/jvm_sqlite/index.md b/docs/jvm_sqlite/index.md index 4309e9c8468..3508a391fba 100644 --- a/docs/jvm_sqlite/index.md +++ b/docs/jvm_sqlite/index.md @@ -20,19 +20,17 @@ your project. } ``` -An instance of the driver can be constructed as shown below. The constructor accepts a JDBC +An instance of the driver can be constructed as shown below. The constructor accepts a JDBC connection string that specifies the location of the database file. The `IN_MEMORY` constant can also be passed to the constructor to create an in-memory database. === "On-Disk" ```kotlin - val driver: SqlDriver = JdbcSqliteDriver("jdbc:sqlite:test.db") - Database.Schema.create(driver) + val driver: SqlDriver = JdbcSqliteDriver("jdbc:sqlite:test.db", Properties(), Database.Schema) ``` === "In-Memory" ```kotlin - val driver: SqlDriver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY) - Database.Schema.create(driver) + val driver: SqlDriver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY, Properties(), Database.Schema) ``` {% include 'common/index_queries.md' %} diff --git a/docs/multiplatform_sqlite/index.md b/docs/multiplatform_sqlite/index.md index 31f895cf756..988c2d965e7 100644 --- a/docs/multiplatform_sqlite/index.md +++ b/docs/multiplatform_sqlite/index.md @@ -9,16 +9,16 @@ Each target platform has its own driver implementation. === "Kotlin" ```kotlin - kotlin { + kotlin { sourceSets.androidMain.dependencies { implementation("app.cash.sqldelight:android-driver:{{ versions.sqldelight }}") } - + // or iosMain, windowsMain, etc. sourceSets.nativeMain.dependencies { implementation("app.cash.sqldelight:native-driver:{{ versions.sqldelight }}") } - + sourceSets.jvmMain.dependencies { implementation("app.cash.sqldelight:sqlite-driver:{{ versions.sqldelight }}") } @@ -26,16 +26,16 @@ Each target platform has its own driver implementation. ``` === "Groovy" ```groovy - kotlin { + kotlin { sourceSets.androidMain.dependencies { implementation "app.cash.sqldelight:android-driver:{{ versions.sqldelight }}" } - + // or iosMain, windowsMain, etc. sourceSets.nativeMain.dependencies { implementation "app.cash.sqldelight:native-driver:{{ versions.sqldelight }}" } - + sourceSets.jvmMain.dependencies { implementation "app.cash.sqldelight:sqlite-driver:{{ versions.sqldelight }}" } @@ -44,7 +44,7 @@ Each target platform has its own driver implementation. ## Constructing Driver Instances -Create a common factory class or method to obtain a `SqlDriver` instance. +Create a common factory class or method to obtain a `SqlDriver` instance. ```kotlin title="src/commonMain/kotlin" import com.example.Database @@ -67,7 +67,7 @@ Then implement this for each target platform: ```kotlin actual class DriverFactory(private val context: Context) { actual fun createDriver(): SqlDriver { - return AndroidSqliteDriver(Database.Schema, context, "test.db") + return AndroidSqliteDriver(Database.Schema, context, "test.db") } } ``` @@ -83,8 +83,7 @@ Then implement this for each target platform: ```kotlin actual class DriverFactory { actual fun createDriver(): SqlDriver { - val driver: SqlDriver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY) - Database.Schema.create(driver) + val driver: SqlDriver = JdbcSqliteDriver("jdbc:sqlite:test.db", Properties(), Database.Schema) return driver } } From c4084ee46b99740db8df3d02bbab3e0d5d3279b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Fri, 26 Jul 2024 13:54:41 +0100 Subject: [PATCH 190/304] fix 5372 add alias to json table function (#5375) * fix 5372 add alias Add grammar for alias Update mixin to use table alias if available Add fixture test * Update JsonTable.sq Add use of alias for json function --- .../dialects/sqlite/json/module/grammar/json.bnf | 2 +- .../json/module/grammar/mixins/TableOrSubqueryMixin.kt | 2 +- .../fixtures_sqlite_json/json_table_functions/Test.s | 7 ++++++- .../app/cash/sqldelight/integration/JsonTable.sq | 6 +++--- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/json.bnf b/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/json.bnf index 83192c6ab9b..d14176da6e8 100644 --- a/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/json.bnf +++ b/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/json.bnf @@ -20,7 +20,7 @@ } overrides ::= table_or_subquery -table_or_subquery ::= ( json_function_name LP <> ( COMMA <> ) * RP +table_or_subquery ::= ( json_function_name LP <> ( COMMA <> ) * RP [ [ AS ] {table_alias} ] | [ {database_name} DOT ] {table_name} [ [ AS ] {table_alias} ] [ INDEXED BY {index_name} | NOT INDEXED ] | LP ( {table_or_subquery} ( COMMA {table_or_subquery} ) * | {join_clause} ) RP | LP {compound_select_stmt} RP [ [ AS ] {table_alias} ] ) { diff --git a/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/mixins/TableOrSubqueryMixin.kt b/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/mixins/TableOrSubqueryMixin.kt index c99acd30f72..3507a3d0a68 100644 --- a/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/mixins/TableOrSubqueryMixin.kt +++ b/dialects/sqlite/json-module/src/main/kotlin/app/cash/sqldelight/dialects/sqlite/json/module/grammar/mixins/TableOrSubqueryMixin.kt @@ -24,7 +24,7 @@ internal abstract class TableOrSubqueryMixin(node: ASTNode?) : if (jsonFunctionName != null) { return@lazy listOf( QueryResult( - table = jsonFunctionName!!, + table = tableAlias ?: jsonFunctionName!!, columns = emptyList(), synthesizedColumns = listOf( SynthesizedColumn(jsonFunctionName!!, acceptableValues = listOf("key", "value", "type", "atom", "id", "parent", "fullkey", "path", "json", "root")), diff --git a/dialects/sqlite/json-module/src/testFixtures/resources/fixtures_sqlite_json/json_table_functions/Test.s b/dialects/sqlite/json-module/src/testFixtures/resources/fixtures_sqlite_json/json_table_functions/Test.s index 2c73ba4292f..abba0f51067 100644 --- a/dialects/sqlite/json-module/src/testFixtures/resources/fixtures_sqlite_json/json_table_functions/Test.s +++ b/dialects/sqlite/json-module/src/testFixtures/resources/fixtures_sqlite_json/json_table_functions/Test.s @@ -59,4 +59,9 @@ SELECT DISTINCT json_extract(big.json,'$.id') WHERE json_tree.value = 'uidle_since' ) WHERE (uidle_since >= ? AND uidle_since <= ?) - AND is_deleted = 0; \ No newline at end of file + AND is_deleted = 0; + +SELECT json_extract(child.value, '$.d') FROM user, json_each(user.name, '$.a.b') AS parent, json_each(parent.value, '$.c') AS child; + + + diff --git a/sqldelight-gradle-plugin/src/test/integration-sqlite-json/src/main/sqldelight/app/cash/sqldelight/integration/JsonTable.sq b/sqldelight-gradle-plugin/src/test/integration-sqlite-json/src/main/sqldelight/app/cash/sqldelight/integration/JsonTable.sq index 65e2e975b04..0b64eaab71d 100644 --- a/sqldelight-gradle-plugin/src/test/integration-sqlite-json/src/main/sqldelight/app/cash/sqldelight/integration/JsonTable.sq +++ b/sqldelight-gradle-plugin/src/test/integration-sqlite-json/src/main/sqldelight/app/cash/sqldelight/integration/JsonTable.sq @@ -9,8 +9,8 @@ VALUES (?, ?); byAreaCode: SELECT DISTINCT user.name - FROM user, json_each(user.phone) - WHERE json_each.value LIKE :areaCode || '-%'; + FROM user, json_each(user.phone) AS user_phone + WHERE user_phone.value LIKE :areaCode || '-%'; byAreaCode2: SELECT name FROM user WHERE phone LIKE :areaCode || '-%' @@ -18,4 +18,4 @@ UNION SELECT user.name FROM user, json_each(user.phone) WHERE json_valid(user.phone) - AND json_each.value LIKE :areaCode || '-%'; \ No newline at end of file + AND json_each.value LIKE :areaCode || '-%'; From bd3cd6b2ca4c145a44686e85cfb4ed94e3513995 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Jul 2024 09:21:28 -0400 Subject: [PATCH 191/304] Update dependency org.xerial:sqlite-jdbc to v3.46.0.1 (#5382) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d8df62e91e6..6f42c71b61c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -68,7 +68,7 @@ sqlPsiEnvironment = { module = "com.alecstrong.sql.psi:environment", version.ref robolectric = { module = "org.robolectric:robolectric", version = "4.13" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } -sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.46.0.0" } +sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.46.0.1" } postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.3" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } From 5634ce3c5a505dfdaa91441714cf2ee25c4cfba5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 16:13:49 -0400 Subject: [PATCH 192/304] Update testcontainers-java monorepo to v1.20.1 (#5385) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6f42c71b61c..cfa5166bbd9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,7 +14,7 @@ agp = "8.5.1" compileSdk = "34" minSdk = "21" sqlPsi = "0.4.9" -testContainers = "1.20.0" +testContainers = "1.20.1" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } From 0d41d969506b29f59ec6abc5eed9d09e963cbb85 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 15:20:56 -0400 Subject: [PATCH 193/304] Update gradle/actions action to v4 (#5389) * Update gradle/actions action to v4 * Delete .github/workflows/gradleWrapper.yml --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Jake Wharton --- .github/workflows/PR.yml | 6 +++--- .github/workflows/Publish-Website.yml | 2 +- .github/workflows/Release.yml | 6 +++--- .github/workflows/gradleWrapper.yml | 18 ------------------ 4 files changed, 7 insertions(+), 25 deletions(-) delete mode 100644 .github/workflows/gradleWrapper.yml diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index 161f076e057..1db3d28e3c6 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -50,7 +50,7 @@ jobs: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - name: Setup gradle - uses: gradle/actions/setup-gradle@v3 + uses: gradle/actions/setup-gradle@v4 with: gradle-home-cache-cleanup: true @@ -138,7 +138,7 @@ jobs: with: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - - uses: gradle/actions/setup-gradle@v3 + - uses: gradle/actions/setup-gradle@v4 with: gradle-home-cache-cleanup: true - run: ./gradlew -p sample build --stacktrace --parallel @@ -153,7 +153,7 @@ jobs: with: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - - uses: gradle/actions/setup-gradle@v3 + - uses: gradle/actions/setup-gradle@v4 with: gradle-home-cache-cleanup: true - run: ./gradlew -p sample-web kotlinUpgradeYarnLock build --stacktrace --parallel diff --git a/.github/workflows/Publish-Website.yml b/.github/workflows/Publish-Website.yml index aa5a9f645f2..3b1eb73094c 100644 --- a/.github/workflows/Publish-Website.yml +++ b/.github/workflows/Publish-Website.yml @@ -33,7 +33,7 @@ jobs: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - name: Setup gradle - uses: gradle/actions/setup-gradle@v3 + uses: gradle/actions/setup-gradle@v4 with: gradle-home-cache-cleanup: true diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index f2a995f87a6..7825f028945 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -31,7 +31,7 @@ jobs: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - name: Setup gradle - uses: gradle/actions/setup-gradle@v3 + uses: gradle/actions/setup-gradle@v4 with: gradle-home-cache-cleanup: true @@ -82,7 +82,7 @@ jobs: cd ~/.gradle echo "org.gradle.java.installations.paths=${{ steps.setup-java.outputs.path }}" >> gradle.properties - name: Setup gradle - uses: gradle/actions/setup-gradle@v3 + uses: gradle/actions/setup-gradle@v4 with: gradle-home-cache-cleanup: true @@ -120,7 +120,7 @@ jobs: cd ~/.gradle echo "org.gradle.java.installations.paths=${{ steps.setup-java.outputs.path }}" >> gradle.properties - name: Setup gradle - uses: gradle/actions/setup-gradle@v3 + uses: gradle/actions/setup-gradle@v4 with: gradle-home-cache-cleanup: true diff --git a/.github/workflows/gradleWrapper.yml b/.github/workflows/gradleWrapper.yml deleted file mode 100644 index 837348b19b8..00000000000 --- a/.github/workflows/gradleWrapper.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Gradle Wrapper Validation - -on: - pull_request: - paths: - - 'gradlew' - - 'gradlew.bat' - - 'gradle/wrapper/' - -jobs: - validateWrapper: - runs-on: ubuntu-latest - permissions: - contents: read - - steps: - - uses: actions/checkout@v4 - - uses: gradle/actions/wrapper-validation@v3 From 37095281be8ee71ef9dfcec7884a877472d56be9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 13 Aug 2024 08:05:17 -0400 Subject: [PATCH 194/304] Update dependency io.reactivex.rxjava3:rxjava to v3.1.9 (#5401) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cfa5166bbd9..10e95585d8f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -67,7 +67,7 @@ sqlPsi = { module = "com.alecstrong.sql.psi:core", version.ref = "sqlPsi" } sqlPsiEnvironment = { module = "com.alecstrong.sql.psi:environment", version.ref = "sqlPsi" } robolectric = { module = "org.robolectric:robolectric", version = "4.13" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } -rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.8" } +rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.9" } sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.46.0.1" } postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.3" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } From f412724b01e922a8fbed8c89e277bf96dd79a55c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 22:55:55 -0400 Subject: [PATCH 195/304] Update agp to v8.5.2 (#5394) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 10e95585d8f..33582ddecc3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.3.1" -agp = "8.5.1" +agp = "8.5.2" compileSdk = "34" minSdk = "21" sqlPsi = "0.4.9" From 8c0a1b1ae21717287b175940844223097e938291 Mon Sep 17 00:00:00 2001 From: Non B <122938498+nonbb@users.noreply.github.com> Date: Thu, 22 Aug 2024 09:34:44 -0700 Subject: [PATCH 196/304] fix named executes and add test (#5415) --- .../core/lang/SqlDelightQueriesFile.kt | 16 ++++---- .../cash/sqldelight/core/QueriesTypeTest.kt | 39 +++++++++++++++++++ 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightQueriesFile.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightQueriesFile.kt index 6211f845e6a..0121126bda0 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightQueriesFile.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/SqlDelightQueriesFile.kt @@ -89,15 +89,15 @@ class SqlDelightQueriesFile( } internal val namedExecutes by lazy { - val statements = sqlStatements() - .filter { - it.identifier.name != null && - it.statement.deleteStmtLimited == null && - it.statement.insertStmt == null && - it.statement.updateStmtLimited == null && - it.statement.compoundSelectStmt == null + val statements = sqlStatements().filter { it.identifier.name != null && typeResolver.queryWithResults(it.statement) == null } + .mapNotNull { + when { + it.statement.deleteStmtLimited != null -> null + it.statement.insertStmt != null -> null + it.statement.updateStmtLimited != null -> null + else -> NamedExecute(it.identifier, it.statement) + } } - .map { NamedExecute(it.identifier, it.statement) } return@lazy transactions().filterIsInstance() + statements } diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt index 4a6fef64bc6..a0db376e636 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt @@ -915,4 +915,43 @@ class QueriesTypeTest { """.trimMargin(), ) } + + @Test fun `pragma statement returns results`() { + val result = FixtureCompiler.compileSql( + """ + |pragmaVersion: + |PRAGMA get_version; + | + """.trimMargin(), + temporaryFolder, + fileName = "Data.sq", + ) + + val query = result.compiledFile.namedQueries.first() + assertThat(result.errors).isEmpty() + + val dataQueries = File(result.outputDirectory, "com/example/DataQueries.kt") + assertThat(result.compilerOutput).containsKey(dataQueries) + assertThat(result.compilerOutput[dataQueries].toString()).isEqualTo( + """ + |package com.example + | + |import app.cash.sqldelight.ExecutableQuery + |import app.cash.sqldelight.Query + |import app.cash.sqldelight.TransacterImpl + |import app.cash.sqldelight.db.SqlDriver + |import kotlin.String + | + |public class DataQueries( + | driver: SqlDriver, + |) : TransacterImpl(driver) { + | public fun pragmaVersion(): ExecutableQuery = Query(${query.id.withUnderscores}, driver, "Data.sq", + | "pragmaVersion", "PRAGMA get_version") { cursor -> + | cursor.getString(0)!! + | } + |} + | + """.trimMargin(), + ) + } } From fbee24321d2433fb196a7ea5436e6dfe2208b1be Mon Sep 17 00:00:00 2001 From: Non B <122938498+nonbb@users.noreply.github.com> Date: Thu, 22 Aug 2024 10:23:04 -0700 Subject: [PATCH 197/304] Fix memory leak for connectionManager during end of transaction (#5391) --- .../cash/sqldelight/driver/jdbc/JdbcDriver.kt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt b/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt index a7d1ac54b1e..406f3d9469e 100644 --- a/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt +++ b/drivers/jdbc-driver/src/main/kotlin/app/cash/sqldelight/driver/jdbc/JdbcDriver.kt @@ -61,14 +61,18 @@ interface ConnectionManager { val connection: Connection, ) : Transacter.Transaction() { override fun endTransaction(successful: Boolean): QueryResult { - if (enclosingTransaction == null) { - if (successful) { - connectionManager.apply { connection.endTransaction() } - } else { - connectionManager.apply { connection.rollbackTransaction() } + try { + if (enclosingTransaction == null) { + if (successful) { + connectionManager.apply { connection.endTransaction() } + } else { + connectionManager.apply { connection.rollbackTransaction() } + } } + // properly rotate the transaction even if there are uncaught errors + } finally { + connectionManager.transaction = enclosingTransaction } - connectionManager.transaction = enclosingTransaction return QueryResult.Unit } } From 598638f0adb449ca1f3c4a30fafd20210d59c7d8 Mon Sep 17 00:00:00 2001 From: Zongle Wang Date: Sat, 24 Aug 2024 06:58:26 -0400 Subject: [PATCH 198/304] Migrate to com.gradleup.shadow (#5396) https://github.com/GradleUp/shadow/releases/tag/8.3.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 33582ddecc3..4d84dae02b9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -107,6 +107,6 @@ grammarKitComposer = { id = "com.alecstrong.grammar.kit.composer", version = "0. publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } -shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } +shadow = "com.gradleup.shadow:8.3.0" ksp = { id = "com.google.devtools.ksp", version = "1.9.25-1.0.20" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.2" } From e3334916d14b25d614fa9c544ee2bc99a16bbbbd Mon Sep 17 00:00:00 2001 From: Derek Ellis Date: Wed, 4 Sep 2024 20:54:40 -0400 Subject: [PATCH 199/304] Share gradle test kit directory between test suites (#5430) Reduces the amount of disk space needed to run tests by sharing installs/caches --- .../app/cash/sqldelight/GrammarkitDialectIntegrationTests.kt | 2 +- .../kotlin/app/cash/sqldelight/WithCommonConfiguration.kt | 2 +- .../test/kotlin/app/cash/sqldelight/WithCommonConfiguration.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sqldelight-gradle-plugin/src/grammarkitTest/kotlin/app/cash/sqldelight/GrammarkitDialectIntegrationTests.kt b/sqldelight-gradle-plugin/src/grammarkitTest/kotlin/app/cash/sqldelight/GrammarkitDialectIntegrationTests.kt index 06025028b7b..c323cdc9d31 100644 --- a/sqldelight-gradle-plugin/src/grammarkitTest/kotlin/app/cash/sqldelight/GrammarkitDialectIntegrationTests.kt +++ b/sqldelight-gradle-plugin/src/grammarkitTest/kotlin/app/cash/sqldelight/GrammarkitDialectIntegrationTests.kt @@ -33,6 +33,6 @@ class GrammarkitDialectIntegrationTests { | """.trimMargin(), ) - return withProjectDir(projectRoot) + return withProjectDir(projectRoot).withTestKitDir(File("build/gradle-test-kit").absoluteFile) } } diff --git a/sqldelight-gradle-plugin/src/instrumentationTest/kotlin/app/cash/sqldelight/WithCommonConfiguration.kt b/sqldelight-gradle-plugin/src/instrumentationTest/kotlin/app/cash/sqldelight/WithCommonConfiguration.kt index c4841e493da..fe31220a9a7 100644 --- a/sqldelight-gradle-plugin/src/instrumentationTest/kotlin/app/cash/sqldelight/WithCommonConfiguration.kt +++ b/sqldelight-gradle-plugin/src/instrumentationTest/kotlin/app/cash/sqldelight/WithCommonConfiguration.kt @@ -14,5 +14,5 @@ internal fun GradleRunner.withCommonConfiguration(projectRoot: File): GradleRunn File(projectRoot, "local.properties").apply { if (!exists()) writeText("sdk.dir=${androidHome()}\n") } - return withProjectDir(projectRoot) + return withProjectDir(projectRoot).withTestKitDir(File("build/gradle-test-kit").absoluteFile) } diff --git a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/WithCommonConfiguration.kt b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/WithCommonConfiguration.kt index 79dcfd8bf47..474895c41bd 100644 --- a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/WithCommonConfiguration.kt +++ b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/WithCommonConfiguration.kt @@ -11,5 +11,5 @@ internal fun GradleRunner.withCommonConfiguration(projectRoot: File): GradleRunn | """.trimMargin(), ) - return withProjectDir(projectRoot) + return withProjectDir(projectRoot).withTestKitDir(File("build/gradle-test-kit").absoluteFile) } From 703967acbb0bd429c84be2b393d1ca9e9211d303 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 01:24:57 +0000 Subject: [PATCH 200/304] Update dependency org.xerial:sqlite-jdbc to v3.46.1.0 (#5410) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4d84dae02b9..dee6f3525e5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -68,7 +68,7 @@ sqlPsiEnvironment = { module = "com.alecstrong.sql.psi:environment", version.ref robolectric = { module = "org.robolectric:robolectric", version = "4.13" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.9" } -sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.46.0.1" } +sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.46.1.0" } postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.3" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } From b7eec2eef0604368590557becdee39daeb296a4d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 01:52:55 +0000 Subject: [PATCH 201/304] Update dependency com.bugsnag:bugsnag to v3.7.2 (#5431) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dee6f3525e5..4236701c289 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -40,7 +40,7 @@ junit = { module = "junit:junit", version = "4.13.2" } jgrapht = { module = "org.jgrapht:jgrapht-core", version = "1.5.2" } truth = { module = "com.google.truth:truth", version = "1.4.4" } turbine = { module = "app.cash.turbine:turbine", version = "1.1.0" } -bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.1" } +bugsnag = { module = "com.bugsnag:bugsnag", version = "3.7.2" } picnic = { module = "com.jakewharton.picnic:picnic", version = "0.7.0" } moshi = { module = "com.squareup.moshi:moshi", version = "1.15.1" } moshiCodegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version = "1.15.1" } From e04cbaca315c2de743a77148b6d9fed4151ae491 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 01:54:07 +0000 Subject: [PATCH 202/304] Update plugin binaryCompatibilityValidator to v0.16.3 (#5388) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4236701c289..064aa9a3c31 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -109,4 +109,4 @@ spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = "com.gradleup.shadow:8.3.0" ksp = { id = "com.google.devtools.ksp", version = "1.9.25-1.0.20" } -binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.2" } +binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.3" } From 7131cdc1d7ebf803a475965f9b53d1182a684d63 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2024 22:10:58 -0400 Subject: [PATCH 203/304] Update plugin intellij to v1.17.4 (#5304) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 064aa9a3c31..5b2615e3a98 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -102,7 +102,7 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-android-extensions = { id = "org.jetbrains.kotlin.android.extensions", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } -intellij = { id = "org.jetbrains.intellij", version = "1.17.3" } +intellij = { id = "org.jetbrains.intellij", version = "1.17.4" } grammarKitComposer = { id = "com.alecstrong.grammar.kit.composer", version = "0.1.12" } publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } From 8bcdeaad6c1a60eb5650918ca755cf92282b32fb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 02:21:04 +0000 Subject: [PATCH 204/304] Update dependency org.postgresql:postgresql to v42.7.4 (#5432) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5b2615e3a98..da832125b55 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -69,7 +69,7 @@ robolectric = { module = "org.robolectric:robolectric", version = "4.13" } rxJava2 = { module = "io.reactivex.rxjava2:rxjava", version = "2.2.21" } rxJava3 = { module = "io.reactivex.rxjava3:rxjava", version = "3.1.9" } sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.46.1.0" } -postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.3" } +postgresJdbc = { module = "org.postgresql:postgresql", version = "42.7.4" } mysqlJdbc = { module = "mysql:mysql-connector-java", version = "8.0.33" } schemaCrawler-tools = { module = "us.fatehi:schemacrawler-tools", version.ref = "schemaCrawler" } From b49629e725b52712bffac206fdcd85376d25ef69 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 02:37:00 +0000 Subject: [PATCH 205/304] Update dependency co.touchlab:stately-concurrency to v2.1.0 (#5434) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index da832125b55..18faa4d3388 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -77,7 +77,7 @@ schemaCrawler-sqlite = { module = "us.fatehi:schemacrawler-sqlite", version.ref objectDiff = { module = "de.danielbechler:java-object-diff", version = "0.95" } sqliter = { module = "co.touchlab:sqliter-driver", version.ref = "sqliter" } -stately-concurrency = { module = "co.touchlab:stately-concurrency", version = "2.0.7" } +stately-concurrency = { module = "co.touchlab:stately-concurrency", version = "2.1.0" } testhelp = { module = "co.touchlab:testhelp", version = "0.6.12" } burst = { module = "com.squareup.burst:burst-junit4", version = "1.2.0" } From 28d702f503d57f108d956d3cd98b1c28f3444890 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 03:37:39 +0000 Subject: [PATCH 206/304] Update dependency com.google.testparameterinjector:test-parameter-injector to v1.17 (#5435) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 18faa4d3388..a0dc297c6e3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -81,7 +81,7 @@ stately-concurrency = { module = "co.touchlab:stately-concurrency", version = "2 testhelp = { module = "co.touchlab:testhelp", version = "0.6.12" } burst = { module = "com.squareup.burst:burst-junit4", version = "1.2.0" } -testParameterInjector = { module = "com.google.testparameterinjector:test-parameter-injector", version = "1.16" } +testParameterInjector = { module = "com.google.testparameterinjector:test-parameter-injector", version = "1.17" } r2dbc = { module = "io.r2dbc:r2dbc-spi", version = "1.0.0.RELEASE" } testContainers-mysql = { module = "org.testcontainers:mysql", version.ref = "testContainers" } From 30ddae8a7bbdf8a8b17ca1e51844df64079a49d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Thu, 5 Sep 2024 11:09:34 +0100 Subject: [PATCH 207/304] Fix 2799 sqlite windows function (#5406) * Add Windows Functions as extension Add WindowsFunctions for use as expression Remove ResultColumnMixin as not needed Add resolver to map extension to function type Add basic window functions * Add delegate rule extension is not inherited delegate sqlite_3_25_window_function_expr rule use private rule to prevent new class from being created * Add tests fixture - only checks grammar and not type resolver integration - checks it actually works --- .../dialects/sqlite_3_25/SqliteDialect.kt | 5 ++ .../sqlite_3_25/SqliteTypeResolver.kt | 33 +++++++++++++ .../grammar/mixins/ResultColumnMixin.kt | 27 ----------- .../mixins/SqliteWindowFunctionMixin.kt | 22 +++++++++ .../dialects/sqlite_3_25/grammar/sqlite.bnf | 26 +++++------ .../window_functions/t3.s | 17 +++++++ .../sqlite_3_35/SqliteTypeResolver.kt | 4 +- .../dialects/sqlite_3_38/grammar/sqlite.bnf | 14 ++++-- .../sqldelight/integration/KeysetPaging.sq | 21 +++++++++ .../integration/WindowsFunctions.sq | 46 +++++++++++++++++++ .../integration/IntegrationTests.kt | 43 +++++++++++++++++ 11 files changed, 212 insertions(+), 46 deletions(-) create mode 100644 dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/SqliteTypeResolver.kt delete mode 100644 dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/ResultColumnMixin.kt create mode 100644 dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/SqliteWindowFunctionMixin.kt create mode 100644 dialects/sqlite-3-25/src/testFixtures/resources/fixtures_sqlite_3_25/window_functions/t3.s create mode 100644 sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/main/sqldelight/app/cash/sqldelight/integration/KeysetPaging.sq create mode 100644 sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/main/sqldelight/app/cash/sqldelight/integration/WindowsFunctions.sq diff --git a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/SqliteDialect.kt b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/SqliteDialect.kt index 796feb24e08..aefc97b2581 100644 --- a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/SqliteDialect.kt +++ b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/SqliteDialect.kt @@ -1,6 +1,7 @@ package app.cash.sqldelight.dialects.sqlite_3_25 import app.cash.sqldelight.dialect.api.MigrationSquasher +import app.cash.sqldelight.dialect.api.TypeResolver import app.cash.sqldelight.dialects.sqlite_3_24.SqliteDialect as Sqlite324Dialect import app.cash.sqldelight.dialects.sqlite_3_25.grammar.SqliteParserUtil @@ -11,6 +12,10 @@ open class SqliteDialect : Sqlite324Dialect() { SqliteParserUtil.overrideSqlParser() } + override fun typeResolver(parentResolver: TypeResolver): TypeResolver { + return SqliteTypeResolver(parentResolver) + } + override fun migrationSquasher(parentSquasher: MigrationSquasher): MigrationSquasher { return SqliteMigrationSquasher(super.migrationSquasher(parentSquasher)) } diff --git a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/SqliteTypeResolver.kt b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/SqliteTypeResolver.kt new file mode 100644 index 00000000000..616e137611e --- /dev/null +++ b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/SqliteTypeResolver.kt @@ -0,0 +1,33 @@ +package app.cash.sqldelight.dialects.sqlite_3_25 + +import app.cash.sqldelight.dialect.api.IntermediateType +import app.cash.sqldelight.dialect.api.PrimitiveType.INTEGER +import app.cash.sqldelight.dialect.api.PrimitiveType.REAL +import app.cash.sqldelight.dialect.api.PrimitiveType.TEXT +import app.cash.sqldelight.dialect.api.TypeResolver +import app.cash.sqldelight.dialect.api.encapsulatingTypePreferringKotlin +import app.cash.sqldelight.dialects.sqlite_3_24.SqliteTypeResolver as Sqlite324TypeResolver +import app.cash.sqldelight.dialects.sqlite_3_25.grammar.psi.SqliteExtensionExpr +import com.alecstrong.sql.psi.core.psi.SqlExpr +import com.alecstrong.sql.psi.core.psi.SqlFunctionExpr + +open class SqliteTypeResolver(private val parentResolver: TypeResolver) : Sqlite324TypeResolver(parentResolver) { + + override fun resolvedType(expr: SqlExpr): IntermediateType = when (expr) { + is SqliteExtensionExpr -> { + functionType(expr.windowFunctionExpr)!! // currently this is the only sqlite extension expr in 3_25 + } + else -> super.resolvedType(expr) + } + + override fun functionType(functionExpr: SqlFunctionExpr): IntermediateType? { + return functionExpr.sqliteFunctionType() ?: parentResolver.functionType(functionExpr) + } + + private fun SqlFunctionExpr.sqliteFunctionType() = when (functionName.text.lowercase()) { + "dense_rank", "ntile", "rank", "row_number" -> IntermediateType(INTEGER) + "cume_dist", "percent_rank" -> IntermediateType(REAL) + "lag", "lead", "first_value", "last_value", "nth_value", "group_concat" -> encapsulatingTypePreferringKotlin(exprList, INTEGER, REAL, TEXT).asNullable() + else -> null + } +} diff --git a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/ResultColumnMixin.kt b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/ResultColumnMixin.kt deleted file mode 100644 index db37d7a7d07..00000000000 --- a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/ResultColumnMixin.kt +++ /dev/null @@ -1,27 +0,0 @@ -package app.cash.sqldelight.dialects.sqlite_3_25.grammar.mixins - -import app.cash.sqldelight.dialects.sqlite_3_25.grammar.psi.SqliteResultColumn -import com.alecstrong.sql.psi.core.ModifiableFileLazy -import com.alecstrong.sql.psi.core.psi.QueryElement -import com.alecstrong.sql.psi.core.psi.QueryElement.QueryResult -import com.alecstrong.sql.psi.core.psi.impl.SqlResultColumnImpl -import com.intellij.lang.ASTNode - -internal abstract class ResultColumnMixin(node: ASTNode) : - SqlResultColumnImpl(node), - SqliteResultColumn { - private val queryExposed = ModifiableFileLazy lazy@{ - if (windowFunctionInvocation != null) { - var column = QueryElement.QueryColumn(this) - columnAlias?.let { alias -> - column = column.copy(element = alias) - } - - return@lazy listOf(QueryResult(columns = listOf(column))) - } - - return@lazy super.queryExposed() - } - - override fun queryExposed() = queryExposed.forFile(containingFile) -} diff --git a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/SqliteWindowFunctionMixin.kt b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/SqliteWindowFunctionMixin.kt new file mode 100644 index 00000000000..0cd89736f6e --- /dev/null +++ b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/mixins/SqliteWindowFunctionMixin.kt @@ -0,0 +1,22 @@ +package app.cash.sqldelight.dialects.sqlite_3_25.grammar.mixins + +import app.cash.sqldelight.dialects.sqlite_3_25.grammar.psi.SqliteWindowFunctionExpr +import com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl +import com.alecstrong.sql.psi.core.psi.SqlExpr +import com.alecstrong.sql.psi.core.psi.SqlFunctionExpr +import com.alecstrong.sql.psi.core.psi.SqlFunctionName +import com.intellij.lang.ASTNode + +internal abstract class SqliteWindowFunctionMixin( + node: ASTNode, +) : SqlCompositeElementImpl(node), + SqliteWindowFunctionExpr, + SqlFunctionExpr { + override fun getExprList(): List { + return children.filterIsInstance() + } + + override fun getFunctionName(): SqlFunctionName { + return exprList.first().children.filterIsInstance().single() + } +} diff --git a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/sqlite.bnf b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/sqlite.bnf index c9fa43a0c88..337bdb8ad56 100644 --- a/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/sqlite.bnf +++ b/dialects/sqlite-3-25/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_25/grammar/sqlite.bnf @@ -36,7 +36,7 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.WINDOW" ] } -overrides ::= alter_table_rules | result_column | select_stmt +overrides ::= alter_table_rules | extension_expr | select_stmt alter_table_rules ::= ( {alter_table_add_column} @@ -47,18 +47,12 @@ alter_table_rules ::= ( implements = "com.alecstrong.sql.psi.core.psi.SqlAlterTableRules" override = true } -result_column ::= ( MULTIPLY - | {table_name} DOT MULTIPLY - | (window_function_invocation | <>) [ [ AS ] {column_alias} ] ) { - mixin = "app.cash.sqldelight.dialects.sqlite_3_25.grammar.mixins.ResultColumnMixin" - implements = "com.alecstrong.sql.psi.core.psi.SqlResultColumn" - override = true -} + select_stmt ::= SELECT [ DISTINCT | ALL ] {result_column} ( COMMA {result_column} ) * [ FROM {join_clause} ] [ WHERE <> ] [{group_by}] [ HAVING <> ] [ WINDOW window_name AS window_defn ( COMMA window_name AS window_defn ) * ] | VALUES {values_expression} ( COMMA {values_expression} ) * { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlSelectStmtImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlSelectStmt" override = true - pin = 1 + pin = 2 } alter_table_rename_column ::= RENAME [ COLUMN ] {column_name} TO alter_table_column_alias { @@ -76,9 +70,15 @@ alter_table_column_alias ::= id | string { ] } -window_function_invocation ::= - window_func LP [ MULTIPLY | ( <> ( COMMA <> ) * ) ] RP [ 'FILTER' LP WHERE <> RP] 'OVER' ( window_defn | window_name ) { - pin = 6 +extension_expr ::= window_function_expr { + extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionExprImpl" + implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionExpr" + override = true +} + +window_function_expr ::= {function_expr} [ 'FILTER' LP WHERE <> RP] 'OVER' ( window_defn | window_name ) { + mixin = "app.cash.sqldelight.dialects.sqlite_3_25.grammar.mixins.SqliteWindowFunctionMixin" + implements = "com.alecstrong.sql.psi.core.psi.SqlFunctionExpr" } window_defn ::= LP [ base_window_name ] @@ -87,6 +87,7 @@ window_defn ::= LP [ base_window_name ] [ frame_spec ] RP { mixin = "app.cash.sqldelight.dialects.sqlite_3_25.grammar.mixins.SqliteWindowDefinitionMixin" + pin = 1 } frame_spec ::= ( 'RANGE' | 'ROWS' | 'GROUPS' ) @@ -109,6 +110,5 @@ frame_spec ::= ( 'RANGE' | 'ROWS' | 'GROUPS' ) pin = 1 } -window_func ::= id window_name ::= id base_window_name ::= id diff --git a/dialects/sqlite-3-25/src/testFixtures/resources/fixtures_sqlite_3_25/window_functions/t3.s b/dialects/sqlite-3-25/src/testFixtures/resources/fixtures_sqlite_3_25/window_functions/t3.s new file mode 100644 index 00000000000..f0330d2a51b --- /dev/null +++ b/dialects/sqlite-3-25/src/testFixtures/resources/fixtures_sqlite_3_25/window_functions/t3.s @@ -0,0 +1,17 @@ +CREATE TABLE numbers( + value INTEGER NOT NULL +); + +SELECT value +FROM ( + SELECT + value, + CASE + WHEN ((row_number() OVER(ORDER BY value ASC) - 1) % :limit) = 0 THEN 1 + WHEN value = :anchor THEN 1 + ELSE 0 + END page_boundary + FROM numbers + ORDER BY value ASC +) +WHERE page_boundary = 1; diff --git a/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/SqliteTypeResolver.kt b/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/SqliteTypeResolver.kt index 05471253ecd..befc504a158 100644 --- a/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/SqliteTypeResolver.kt +++ b/dialects/sqlite-3-35/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_35/SqliteTypeResolver.kt @@ -3,13 +3,13 @@ package app.cash.sqldelight.dialects.sqlite_3_35 import app.cash.sqldelight.dialect.api.QueryWithResults import app.cash.sqldelight.dialect.api.ReturningQueryable import app.cash.sqldelight.dialect.api.TypeResolver -import app.cash.sqldelight.dialects.sqlite_3_24.SqliteTypeResolver as Sqlite324TypeResolver +import app.cash.sqldelight.dialects.sqlite_3_25.SqliteTypeResolver as Sqlite325TypeResolver import app.cash.sqldelight.dialects.sqlite_3_35.grammar.psi.SqliteDeleteStmtLimited import app.cash.sqldelight.dialects.sqlite_3_35.grammar.psi.SqliteInsertStmt import app.cash.sqldelight.dialects.sqlite_3_35.grammar.psi.SqliteUpdateStmtLimited import com.alecstrong.sql.psi.core.psi.SqlStmt -class SqliteTypeResolver(private val parentResolver: TypeResolver) : Sqlite324TypeResolver(parentResolver) { +class SqliteTypeResolver(private val parentResolver: TypeResolver) : Sqlite325TypeResolver(parentResolver) { override fun queryWithResults(sqlStmt: SqlStmt): QueryWithResults? { sqlStmt.insertStmt?.let { insert -> check(insert is SqliteInsertStmt) diff --git a/dialects/sqlite-3-38/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_38/grammar/sqlite.bnf b/dialects/sqlite-3-38/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_38/grammar/sqlite.bnf index 9e8aee59918..9d453afdc9c 100644 --- a/dialects/sqlite-3-38/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_38/grammar/sqlite.bnf +++ b/dialects/sqlite-3-38/src/main/kotlin/app/cash/sqldelight/dialects/sqlite_3_38/grammar/sqlite.bnf @@ -7,13 +7,17 @@ extends="com.alecstrong.sql.psi.core.psi.SqlCompositeElementImpl" psiClassPrefix = "Sqlite" - parserImports=[] + parserImports=[ + "static app.cash.sqldelight.dialects.sqlite_3_25.grammar.SqliteParser.window_function_expr_real" + "static app.cash.sqldelight.dialects.sqlite_3_25.grammar.SqliteParserUtil.windowFunctionExprExt" + ] } + overrides ::= extension_expr -extension_expr ::= json_expression { - extends = "com.alecstrong.sql.psi.core.psi.impl.SqlExtensionExprImpl" - implements = "com.alecstrong.sql.psi.core.psi.SqlExtensionExpr" +extension_expr ::= sqlite_3_25_window_function_expr | json_expression { + extends = "app.cash.sqldelight.dialects.sqlite_3_25.grammar.psi.impl.SqliteExtensionExprImpl" + implements = "app.cash.sqldelight.dialects.sqlite_3_25.grammar.psi.SqliteExtensionExpr" override = true } @@ -22,3 +26,5 @@ json_expression ::= {column_expr} json_binary_operator <> { pin = 2 } json_binary_operator ::= '->' | '->>' + +private sqlite_3_25_window_function_expr ::= <>>> diff --git a/sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/main/sqldelight/app/cash/sqldelight/integration/KeysetPaging.sq b/sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/main/sqldelight/app/cash/sqldelight/integration/KeysetPaging.sq new file mode 100644 index 00000000000..69144369562 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/main/sqldelight/app/cash/sqldelight/integration/KeysetPaging.sq @@ -0,0 +1,21 @@ +CREATE TABLE numbers( + value INTEGER NOT NULL +); + +insert: +INSERT INTO numbers(value) VALUES (1),(2),(3),(4),(5),(6); + +page: +SELECT value +FROM ( + SELECT + value, + CASE + WHEN ((row_number() OVER(ORDER BY value ASC) - 1) % :limit) = 0 THEN 1 + WHEN value = :anchor THEN 1 + ELSE 0 + END page_boundary + FROM numbers + ORDER BY value ASC +) +WHERE page_boundary = 1; diff --git a/sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/main/sqldelight/app/cash/sqldelight/integration/WindowsFunctions.sq b/sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/main/sqldelight/app/cash/sqldelight/integration/WindowsFunctions.sq new file mode 100644 index 00000000000..add7c28b8b6 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/main/sqldelight/app/cash/sqldelight/integration/WindowsFunctions.sq @@ -0,0 +1,46 @@ +CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT); + +CREATE TABLE t2(a TEXT, b TEXT); + +insert: +INSERT INTO t2 VALUES('a', 'one'), + ('a', 'two'), + ('a', 'three'), + ('b', 'four'), + ('c', 'five'), + ('c', 'six'); + +insertGroup: +INSERT INTO t1 VALUES (1, 'A', 'one' ), + (2, 'B', 'two' ), + (3, 'C', 'three'), + (4, 'D', 'one' ), + (5, 'E', 'two' ), + (6, 'F', 'three'), + (7, 'G', 'one' ); + +select: +SELECT a AS a, + row_number() OVER win AS row_number, + rank() OVER win AS rank, + dense_rank() OVER win AS dense_rank, + percent_rank() OVER win AS percent_rank, + cume_dist() OVER win AS cume_dist, + ntile(2) OVER win AS ntile +FROM t2 +WINDOW win AS (ORDER BY a); + +selectExpr: +SELECT b AS b, + lead(b, 2, 'n/a') OVER win AS lead, + lag(b) OVER win AS lag, + first_value(b) OVER win AS first_value, + last_value(b) OVER win AS last_value, + nth_value(b, 3) OVER win AS nth_value +FROM t2 +WINDOW win AS (ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW); + +selectGroup: +SELECT a, b, group_concat(b, '.') OVER ( + ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING +) AS group_concat FROM t1; diff --git a/sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/test/java/app/cash/sqldelight/integration/IntegrationTests.kt b/sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/test/java/app/cash/sqldelight/integration/IntegrationTests.kt index 14dfc38108f..cc3ae3dce56 100644 --- a/sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/test/java/app/cash/sqldelight/integration/IntegrationTests.kt +++ b/sqldelight-gradle-plugin/src/test/integration-sqlite-3-35/src/test/java/app/cash/sqldelight/integration/IntegrationTests.kt @@ -8,6 +8,8 @@ import org.junit.Test class IntegrationTests { private lateinit var personQueries: PersonQueries + private lateinit var keysetPagingQueries: KeysetPagingQueries + private lateinit var windowsFunctionsQueries: WindowsFunctionsQueries @Before fun before() { val database = JdbcSqliteDriver(IN_MEMORY) @@ -15,6 +17,8 @@ class IntegrationTests { val queryWrapper = QueryWrapper(database) personQueries = queryWrapper.personQueries + keysetPagingQueries = queryWrapper.keysetPagingQueries + windowsFunctionsQueries = queryWrapper.windowsFunctionsQueries } @Test fun insertReturning1() { @@ -76,4 +80,43 @@ class IntegrationTests { assertThat(personQueries.deleteAndReturnAll("Omega").executeAsOne()) .isEqualTo(Person(1, "Alpha", "Omega")) } + + @Test fun keysetPagingWindowFunction() { + keysetPagingQueries.insert() + assertThat(keysetPagingQueries.page(limit = 5, anchor = 3).executeAsList().last()).isEqualTo(6) + } + + @Test fun basicWindowFunctions() { + windowsFunctionsQueries.insert() + with(windowsFunctionsQueries.select().executeAsList()) { + assertThat(last().a).isEqualTo("c") + assertThat(last().row_number).isEqualTo(6) + assertThat(last().rank).isEqualTo(5) + assertThat(last().dense_rank).isEqualTo(3) + assertThat(last().percent_rank).isEqualTo(0.8) + assertThat(last().cume_dist).isEqualTo(1.0) + assertThat(last().ntile).isEqualTo(2) + } + } + + @Test fun exprWindowFunctions() { + windowsFunctionsQueries.insert() + with(windowsFunctionsQueries.selectExpr().executeAsList()) { + assertThat(last().b).isEqualTo("two") + assertThat(last().lead).isEqualTo("n/a") + assertThat(last().lag).isEqualTo("three") + assertThat(last().first_value).isEqualTo("five") + assertThat(last().last_value).isEqualTo("two") + assertThat(last().nth_value).isEqualTo("one") + } + } + + @Test fun groupWindowFunctions() { + windowsFunctionsQueries.insertGroup() + with(windowsFunctionsQueries.selectGroup().executeAsList()) { + assertThat(last().a).isEqualTo(7) + assertThat(last().b).isEqualTo("G") + assertThat(last().group_concat).isEqualTo("F.G") + } + } } From 10f15cb49153e8fc450762d1b5c9fac047e5032a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Thu, 5 Sep 2024 11:11:00 +0100 Subject: [PATCH 208/304] Fix 5399 PostgreSql numeric resolver (#5402) * add NUMERIC to functions/binary exp Add type to aggregate functions that can take NUMERIC NUMERIC types to be resolved to BigDecimal * Add tests Interface generation tests for changes * Update InterfaceGeneration.kt --- .../postgresql/PostgreSqlTypeResolver.kt | 23 ++-- .../core/queries/InterfaceGeneration.kt | 124 +++++++++++++++++- 2 files changed, 134 insertions(+), 13 deletions(-) diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt index 85eb7207460..bf2162296e6 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlTypeResolver.kt @@ -99,6 +99,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes INTEGER, BIG_INT, REAL, + PostgreSqlType.NUMERIC, TEXT, BLOB, TIMESTAMP_TIMEZONE, @@ -113,6 +114,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes PostgreSqlType.INTEGER, BIG_INT, REAL, + PostgreSqlType.NUMERIC, TIMESTAMP_TIMEZONE, TIMESTAMP, ) @@ -124,19 +126,19 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes if (isArrayType(exprType)) { exprType } else { - encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB, nullability = { exprListNullability -> + encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, PostgreSqlType.NUMERIC, TEXT, BLOB, nullability = { exprListNullability -> exprListNullability.all { it } }) } } - "max" -> encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, BLOB, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() - "min" -> encapsulatingTypePreferringKotlin(exprList, BLOB, TEXT, SMALL_INT, INTEGER, PostgreSqlType.INTEGER, BIG_INT, REAL, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() + "max" -> encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, PostgreSqlType.NUMERIC, TEXT, BLOB, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() + "min" -> encapsulatingTypePreferringKotlin(exprList, BLOB, TEXT, SMALL_INT, INTEGER, PostgreSqlType.INTEGER, BIG_INT, REAL, PostgreSqlType.NUMERIC, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() "sum" -> { val type = resolvedType(exprList.single()) - if (type.dialectType == REAL) { - IntermediateType(REAL).asNullable() - } else { - IntermediateType(INTEGER).asNullable() + when (type.dialectType) { + REAL -> IntermediateType(REAL).asNullable() + PostgreSqlType.NUMERIC -> IntermediateType(PostgreSqlType.NUMERIC).asNullable() + else -> IntermediateType(INTEGER).asNullable() } } "to_hex", "quote_literal", "quote_ident", "md5" -> IntermediateType(TEXT) @@ -176,14 +178,14 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "json_build_object", "jsonb_build_object", -> IntermediateType(TEXT) "array_agg" -> { - val typeForAgg = encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() + val typeForAgg = encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, PostgreSqlType.NUMERIC, TEXT, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() arrayIntermediateType(typeForAgg) } "string_agg" -> IntermediateType(TEXT) "json_array_length", "jsonb_array_length" -> IntermediateType(INTEGER) "jsonb_path_exists", "jsonb_path_match", "jsonb_path_exists_tz", "jsonb_path_match_tz" -> IntermediateType(BOOLEAN) "currval", "lastval", "nextval", "setval" -> IntermediateType(BIG_INT) - "generate_series" -> encapsulatingType(exprList, INTEGER, BIG_INT, REAL, TIMESTAMP_TIMEZONE, TIMESTAMP) + "generate_series" -> encapsulatingType(exprList, INTEGER, BIG_INT, REAL, PostgreSqlType.NUMERIC, TIMESTAMP_TIMEZONE, TIMESTAMP) "regexp_count", "regexp_instr" -> IntermediateType(INTEGER) "regexp_like" -> IntermediateType(BOOLEAN) "regexp_replace", "regexp_substr" -> IntermediateType(TEXT) @@ -193,7 +195,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes "websearch_to_tsquery" -> IntermediateType(TEXT) "rank", "dense_rank", "row_number" -> IntermediateType(INTEGER) "ntile" -> IntermediateType(INTEGER).asNullable() - "lag", "lead", "first_value", "last_value", "nth_value" -> encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, TEXT, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() + "lag", "lead", "first_value", "last_value", "nth_value" -> encapsulatingTypePreferringKotlin(exprList, SMALL_INT, PostgreSqlType.INTEGER, INTEGER, BIG_INT, REAL, PostgreSqlType.NUMERIC, TEXT, TIMESTAMP_TIMEZONE, TIMESTAMP, DATE).asNullable() else -> null } @@ -265,6 +267,7 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes INTEGER, BIG_INT, REAL, + PostgreSqlType.NUMERIC, TEXT, BLOB, BOOLEAN, diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt index f54d00ea7bc..ab7a309ed10 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt @@ -1147,6 +1147,7 @@ class InterfaceGeneration { |inr INTEGER, |jsn JSON, |jsb JSON, + |num NUMERIC, |tim TIME, |tms TIMESTAMP, |tmz TIMESTAMPTZ, @@ -1167,6 +1168,7 @@ class InterfaceGeneration { |inr IS NOT NULL AS has_integer, |jsn IS NOT NULL AS has_json, |jsb IS NOT NULL AS has_jsob, + |num IS NOT NULL AS has_num, |sml IS NOT NULL AS has_smallint, |tim IS NOT NULL AS has_time, |tms IS NOT NULL AS has_timestamp, @@ -1205,6 +1207,7 @@ class InterfaceGeneration { | has_integer: Boolean, | has_json: Boolean, | has_jsob: Boolean, + | has_num: Boolean, | has_smallint: Boolean, | has_time: Boolean, | has_timestamp: Boolean, @@ -1222,6 +1225,7 @@ class InterfaceGeneration { | |inr IS NOT NULL AS has_integer, | |jsn IS NOT NULL AS has_json, | |jsb IS NOT NULL AS has_jsob, + | |num IS NOT NULL AS has_num, | |sml IS NOT NULL AS has_smallint, | |tim IS NOT NULL AS has_time, | |tms IS NOT NULL AS has_timestamp, @@ -1246,13 +1250,14 @@ class InterfaceGeneration { | cursor.getBoolean(10)!!, | cursor.getBoolean(11)!!, | cursor.getBoolean(12)!!, - | cursor.getBoolean(13)!! + | cursor.getBoolean(13)!!, + | cursor.getBoolean(14)!! | ) | } | | public fun selectIsNotNull(): Query = selectIsNotNull { has_bigint, has_boolean, - | has_byte, has_date, has_integer, has_json, has_jsob, has_smallint, has_time, has_timestamp, - | has_timestamptz, has_tsvector, has_uuid, has_varchar -> + | has_byte, has_date, has_integer, has_json, has_jsob, has_num, has_smallint, has_time, + | has_timestamp, has_timestamptz, has_tsvector, has_uuid, has_varchar -> | SelectIsNotNull( | has_bigint, | has_boolean, @@ -1261,6 +1266,7 @@ class InterfaceGeneration { | has_integer, | has_json, | has_jsob, + | has_num, | has_smallint, | has_time, | has_timestamp, @@ -1276,6 +1282,118 @@ class InterfaceGeneration { ) } + @Test + fun `postgres using numeric returns BigDecimal`() { + val file = FixtureCompiler.parseSql( + """ + |CREATE TABLE sales ( + | product_id INTEGER, + | sale_date DATE, + | sale_amount NUMERIC + |); + | + |select: + |SELECT + | sum(sale_amount) AS sum_amount, + | sale_amount * sale_amount AS product_amount, + | array_agg(sale_amount) AS agg_amount, + | generate_series(sale_amount, 2) AS generate_amount + |FROM sales + |GROUP BY sale_amount; + """.trimMargin(), + temporaryFolder, + fileName = "NumericFunctions.sq", + dialect = PostgreSqlDialect(), + ) + + val table = file.tables(false).single() + val tableGenerator = TableInterfaceGenerator(table) + + assertThat(tableGenerator.kotlinImplementationSpec().toString()).isEqualTo( + """ + |public data class Sales( + | public val product_id: kotlin.Int?, + | public val sale_date: java.time.LocalDate?, + | public val sale_amount: java.math.BigDecimal?, + |) + | + """.trimMargin(), + ) + + val query = file.namedQueries.first() + val queryGenerator = QueryInterfaceGenerator(query) + assertThat(queryGenerator.kotlinImplementationSpec().toString()).isEqualTo( + """ + |public data class Select( + | public val sum_amount: java.math.BigDecimal?, + | public val product_amount: java.math.BigDecimal?, + | public val agg_amount: kotlin.Array, + | public val generate_amount: java.math.BigDecimal, + |) + | + """.trimMargin(), + ) + } + + @Test + fun `postgres using numeric window function returns BigDecimal`() { + val file = FixtureCompiler.parseSql( + """ + |CREATE TABLE sales ( + | product_id INTEGER, + | sale_date DATE, + | sale_amount NUMERIC + |); + | + |select: + |SELECT + | product_id, + | sale_date, + | lag(sale_amount, 1) OVER (PARTITION BY product_id ORDER BY sale_date) AS prev_sale_amount, + | lead(sale_amount, 1) OVER (PARTITION BY product_id ORDER BY sale_date) AS next_sale_amount, + | first_value(sale_amount) OVER (PARTITION BY product_id ORDER BY sale_date) AS first_sale_amount, + | last_value(sale_amount) OVER (PARTITION BY product_id ORDER BY sale_date RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_sale_amount, + | nth_value(sale_amount, 2) OVER (PARTITION BY product_id ORDER BY sale_date) AS second_sale_amount + |FROM sales + |ORDER BY product_id, sale_date; + """.trimMargin(), + temporaryFolder, + fileName = "NumericWindowsFunctions.sq", + dialect = PostgreSqlDialect(), + ) + + val table = file.tables(false).single() + val tableGenerator = TableInterfaceGenerator(table) + + assertThat(tableGenerator.kotlinImplementationSpec().toString()).isEqualTo( + """ + |public data class Sales( + | public val product_id: kotlin.Int?, + | public val sale_date: java.time.LocalDate?, + | public val sale_amount: java.math.BigDecimal?, + |) + | + """.trimMargin(), + ) + + val query = file.namedQueries.first() + val queryGenerator = QueryInterfaceGenerator(query) + assertThat(queryGenerator.kotlinImplementationSpec().toString()).isEqualTo( + """ + |public data class Select( + | public val product_id: kotlin.Int?, + | public val sale_date: java.time.LocalDate?, + | public val prev_sale_amount: java.math.BigDecimal?, + | public val next_sale_amount: java.math.BigDecimal?, + | public val first_sale_amount: java.math.BigDecimal?, + | public val last_sale_amount: java.math.BigDecimal?, + | public val second_sale_amount: java.math.BigDecimal?, + |) + | + """.trimMargin(), + ) + } + private fun checkFixtureCompiles(fixtureRoot: String) { val result = FixtureCompiler.compileFixture( fixtureRoot = "src/test/query-interface-fixtures/$fixtureRoot", From fcdacdad97082442a962b53ca9787acb2f04f813 Mon Sep 17 00:00:00 2001 From: Eliezer Graber Date: Thu, 5 Sep 2024 06:16:57 -0400 Subject: [PATCH 209/304] Update migrations docs (#5318) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update migrations docs * Update docs/common/migrations.md Co-authored-by: Benoît Quenaudon --------- Co-authored-by: Benoît Quenaudon --- docs/common/migrations.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/common/migrations.md b/docs/common/migrations.md index fd34189ff39..d45ad9be9b2 100644 --- a/docs/common/migrations.md +++ b/docs/common/migrations.md @@ -29,9 +29,11 @@ These SQL statements are run by the `Database.Schema.migrate()` method. Migratio ## Verifying Migrations -You can also place a `.db` file in the `src/main/sqldelight` folder of the same `.db` format. If there is a `.db` file present, a new `verifySqlDelightMigration` task will be added to the gradle project, and it will run as part of the `check` task, meaning your migrations will be verified against that `.db` file. It confirms that the migrations yield a database with the latest schema. +A `verifySqlDelightMigration` task will be added to the gradle project, and it will run as part of the `check` task. For any `.db` file named `.db` in your SqlDelight source set (e.g. `src/main/sqldelight`) it will apply all migrations starting from `.sqm`, and confirms that the migrations yield a database with the latest schema. -To generate a `.db` file from your latest schema, run the `generateSqlDelightSchema` task, which is available once you specify a `schemaOutputDirectory`, as described in the [gradle.md](gradle.md). You should probably do this before you create your first migration. +To generate a `.db` file from your latest schema, run the `generateSchema` task, which is available once you specify a `schemaOutputDirectory`, as described in the [gradle.md](gradle.md). You should probably do this before you create your first migration. + +Most use cases would benefit from only having a `1.db` file representing the schema of the initial version of their database. Having multiple `.db` files is allowed, but that would result in each `.db` file having each of its migrations applied to it, which causes a lot of unnecessary work. ## Code Migrations From 7dfd252ec3e0a815aa07e7135c7ef9bfbd4b5b1f Mon Sep 17 00:00:00 2001 From: Hielke de Vries Date: Thu, 5 Sep 2024 14:07:47 +0200 Subject: [PATCH 210/304] Fix issue 5298: allow keywords to be used as table names (#5303) * Fix issue 5298: allow keywords to be used as table names * Refactor test Cleanup * Fix formatting * Fix formatting --------- Co-authored-by: Alec Kazakova <1675456+AlecKazakova@users.noreply.github.com> --- .../sqldelight/core/lang/util/TreeUtil.kt | 2 +- .../cash/sqldelight/core/QueriesTypeTest.kt | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt index 770b5c5d1b9..cb5c0fd1c02 100644 --- a/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt +++ b/sqldelight-compiler/src/main/kotlin/app/cash/sqldelight/core/lang/util/TreeUtil.kt @@ -188,7 +188,7 @@ private fun PsiElement.rangesToReplace(): List> { first = parent!!.tableName.range, second = parent!!.columns.joinToString( separator = ", ", - prefix = "${parent!!.tableName.text} (", + prefix = "${parent!!.tableName.node.text} (", postfix = ")", ) { it.name }, ), diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt index a0db376e636..ffcc073c873 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/QueriesTypeTest.kt @@ -916,6 +916,44 @@ class QueriesTypeTest { ) } + @Test fun `SQL keywords can be used as table names when escaped`() { + val result = FixtureCompiler.compileSql( + """ + |CREATE TABLE "order" ( + | data_id INTEGER NOT NULL + |); + |selectForId: + |INSERT INTO "order" VALUES ?; + """.trimMargin(), + temporaryFolder, + ) + + val dataQueries = File(result.outputDirectory, "com/example/TestQueries.kt") + assertThat(result.compilerOutput).containsKey(dataQueries) + assertThat(result.compilerOutput[dataQueries].toString()).isEqualTo( + """ + package com.example + + import app.cash.sqldelight.TransacterImpl + import app.cash.sqldelight.db.SqlDriver + + public class TestQueries( + driver: SqlDriver, + ) : TransacterImpl(driver) { + public fun selectForId(order: Order) { + driver.execute(-304_025_397, ""${'"'}INSERT INTO "order" (data_id) VALUES (?)""${'"'}, 1) { + bindLong(0, order.data_id) + } + notifyQueries(-304_025_397) { emit -> + emit("order") + } + } + } + + """.trimIndent(), + ) + } + @Test fun `pragma statement returns results`() { val result = FixtureCompiler.compileSql( """ From c6923e01f64672f3cdd26437eff4a17085d41fd7 Mon Sep 17 00:00:00 2001 From: Derek Ellis Date: Thu, 5 Sep 2024 14:49:00 -0400 Subject: [PATCH 211/304] Skip dokkaHtml task in PR tests (#5437) --- .github/workflows/PR.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index 1db3d28e3c6..6893c79ddc7 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -58,14 +58,14 @@ jobs: - name: Run gradle tests if: matrix.os == 'ubuntu-latest' && matrix.job == 'test' run: | - ./gradlew build -x :sqldelight-idea-plugin:build -x :sqldelight-gradle-plugin:test --stacktrace -x linuxX64Test + ./gradlew build -x :sqldelight-idea-plugin:build -x :sqldelight-gradle-plugin:test --stacktrace -x linuxX64Test -x dokkaHtml - name: Run gradle plugin tests if: matrix.os == 'macOS-14' && matrix.job == 'gradle-plugin-tests' - run: ./gradlew :sqldelight-gradle-plugin:test :sqldelight-gradle-plugin:grammarkitTest --parallel + run: ./gradlew :sqldelight-gradle-plugin:test :sqldelight-gradle-plugin:grammarkitTest --parallel -x dokkaHtml - name: Run the IntelliJ plugin if: matrix.os == 'ubuntu-latest' && matrix.job == 'instrumentation' - run: ./gradlew :sqldelight-idea-plugin:build --stacktrace + run: ./gradlew :sqldelight-idea-plugin:build --stacktrace -x dokkaHtml # Windows tests - name: Run windows tests @@ -75,7 +75,7 @@ jobs: - name: Run linux tests if: matrix.os == 'ubuntu-latest' # not parallel otherwise NativeTransacterTest fails. - run: ./gradlew linuxX64Test --no-parallel + run: ./gradlew linuxX64Test --no-parallel -x dokkaHtml # android tests - name: Enable KVM group perms @@ -90,7 +90,7 @@ jobs: with: api-level: 29 arch: x86_64 - script: ./gradlew connectedCheck :sqldelight-gradle-plugin:instrumentationTest --stacktrace --parallel + script: ./gradlew connectedCheck :sqldelight-gradle-plugin:instrumentationTest --stacktrace --parallel -x dokkaHtml # ios tests - name: Run ios tests From 1567f235a435f9d32e3533f603da63fbee610b6e Mon Sep 17 00:00:00 2001 From: Derek Ellis Date: Thu, 5 Sep 2024 15:05:22 -0400 Subject: [PATCH 212/304] Reduce the number of gradle versions we check (#5436) Test against the minimum and current versions of gradle (that SQLDelight was built against) --- .../app/cash/sqldelight/integrations/GradleVersionsTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/integrations/GradleVersionsTest.kt b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/integrations/GradleVersionsTest.kt index aac278b9db4..39a7583c428 100644 --- a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/integrations/GradleVersionsTest.kt +++ b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/integrations/GradleVersionsTest.kt @@ -20,6 +20,7 @@ import com.google.common.truth.Truth.assertThat import java.io.File import java.nio.file.Files import org.gradle.testkit.runner.GradleRunner +import org.gradle.util.GradleVersion import org.junit.Test import org.junit.runner.RunWith import org.junit.runners.Parameterized @@ -35,8 +36,7 @@ class GradleVersionsTest(private val gradleVersion: String) { // We use version catalogs in tests too but this feature is only stable since 7.4. // Test MIN_GRADLE_VERSION too if MIN_GRADLE_VERSION is higher than 7.4. "7.4.2", - "7.6.1", - "8.0.2", + GradleVersion.current().version, ) } From 7d304159701a69f8db6a3223456e603b4251ecc6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 20:13:36 +0000 Subject: [PATCH 213/304] Update dependency gradle to v8.10 (#5404) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/wrapper/gradle-wrapper.jar | Bin 43504 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- sample/gradle/wrapper/gradle-wrapper.jar | Bin 43504 -> 43583 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2c3521197d7c4586c843d1d3e9090525f1898cde..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch delta 3990 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 09523c0e549..9355b415575 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample-web/gradle/wrapper/gradle-wrapper.properties b/sample-web/gradle/wrapper/gradle-wrapper.properties index 09523c0e549..9355b415575 100644 --- a/sample-web/gradle/wrapper/gradle-wrapper.properties +++ b/sample-web/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/sample/gradle/wrapper/gradle-wrapper.jar b/sample/gradle/wrapper/gradle-wrapper.jar index 2c3521197d7c4586c843d1d3e9090525f1898cde..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch delta 3990 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 diff --git a/sample/gradle/wrapper/gradle-wrapper.properties b/sample/gradle/wrapper/gradle-wrapper.properties index 09523c0e549..9355b415575 100644 --- a/sample/gradle/wrapper/gradle-wrapper.properties +++ b/sample/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 5c23ba27867f05f61b09116279702fde7bc325d4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 23:45:59 +0000 Subject: [PATCH 214/304] Update agp to v8.6.0 (#5433) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a0dc297c6e3..32c9f00b067 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ sqljs = "1.8.0" paging-mpp = "3.1.1-0.3.1" paging3 = "3.1.1" ktlint = "1.3.1" -agp = "8.5.2" +agp = "8.6.0" compileSdk = "34" minSdk = "21" sqlPsi = "0.4.9" From d7cc00eabc133b43f38a1e75f70af7e786dd00d7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 23:58:54 +0000 Subject: [PATCH 215/304] Update plugin com.gradle.develocity to v3.18 (#5411) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index 20b2adb4ff0..55e35417b8b 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.6" + id "com.gradle.develocity" version "3.18" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index 72e52cfca9e..e1ff3afb92c 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.6" + id "com.gradle.develocity" version "3.18" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/settings.gradle b/settings.gradle index 9fa5413732f..e18fd0d1189 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.17.6" + id "com.gradle.develocity" version "3.18" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } From 84669332253560047a5a4415d856b0130c83e9b5 Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Mon, 9 Sep 2024 20:24:52 +0200 Subject: [PATCH 216/304] Remove unused Xcode installations to free some space (#5445) --- .github/workflows/PR.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index 6893c79ddc7..228649e7bba 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -42,6 +42,15 @@ jobs: contents: read steps: + # https://github.com/actions/runner-images/issues/10511 + # We only use Xcode 15.4, the default version + - name: Remove unused Xcode installations + run: | + df -hI /dev/disk3s1s1 + find /Applications -type d -name "Xcode_*.app" | grep -v "Xcode_15.4.app" | xargs sudo rm -rf + df -hI /dev/disk3s1s1 + if: matrix.os == 'macOS-14' + - name: Checkout the repo uses: actions/checkout@v4 - name: Set up Java From f487b5c745f0543959cdb85b0db5f488e6ea245b Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Mon, 9 Sep 2024 22:43:22 +0200 Subject: [PATCH 217/304] Bump Kotlin to 2.0.0 (#5217) * Kotlin 2.0.0-RC1 * Migrate to atomicfu in tests * Bump Kotlin to 2.0.0-RC3 * Bump ksp to 2.0.0-RC2 * Fix spotless * Update yarn lock file * Use default hierarchy template in sample * Fix default hierarchy groups with actual targets (https://youtrack.jetbrains.com/issue/KT-64483) * Fix js test dependency * Fix atomic fields * Fix atomic fields * Fix atomic fields * Fix sample * Bump ksp Fix sample * Fix sample * Remove unused suppression * Increase minimum Gradle version to 8.0 * Fix inline property warning * Add foo toolchain resolver plugin to test different jdks * Remove unused isInitialized in test code * Add missing override functions in expect class * spotless * Remove unused CInterop property * Bump Kotlin and KSP to 2.0.0 * Update libs.versions.toml * Revert "Fix inline property warning" This reverts commit bc10d5ed1aa5f95694acfe0d3f54c2bd35821fdc. * Revert api change * Fix spotless --------- Co-authored-by: Alec Kazakova <1675456+AlecKazakova@users.noreply.github.com> --- .gitignore | 1 + build.gradle | 1 + .../multiplatform/MultiplatformConventions.kt | 7 +- drivers/driver-test/build.gradle | 29 +- drivers/native-driver/build.gradle | 16 +- .../sqldelight/driver/native/util/PoolLock.kt | 1 - extensions/async-extensions/build.gradle | 2 +- extensions/coroutines-extensions/build.gradle | 20 +- .../cash/sqldelight/coroutines/TestDriver.kt | 0 .../app/cash/sqldelight/coroutines/DbTest.kt | 0 .../cash/sqldelight/coroutines/MappingTest.kt | 0 .../sqldelight/coroutines/QueryAsFlowTest.kt | 0 .../cash/sqldelight/coroutines/QueryAssert.kt | 0 .../app/cash/sqldelight/coroutines/RunTest.kt | 7 +- .../app/cash/sqldelight/coroutines/TestDb.kt | 35 +- gradle/libs.versions.toml | 4 +- kotlin-js-store/yarn.lock | 454 +-- .../app/cash/sqldelight/db/QueryResult.kt | 2 +- sample-web/kotlin-js-store/yarn.lock | 845 +++-- sample/build.gradle | 5 - sample/common/build.gradle | 19 +- sample/common/common.podspec | 15 + sample/common/karma.config.d/wasm.js | 21 - .../example/sqldelight/hockey/data/Date.kt | 5 +- .../com/example/sqldelight/hockey/BaseTest.kt | 2 - .../hockey/data/{Date.kt => Date.ios.kt} | 4 +- .../hockey/platform/DateFormatHelper.kt | 3 +- .../hockey/data/{Date.kt => Date.jvm.kt} | 4 +- sample/common/webpack.config.d/fs.js | 9 - sample/gradle.properties | 1 - sample/kotlin-js-store/yarn.lock | 2976 ----------------- .../sqldelight/gradle/SqlDelightPlugin.kt | 2 +- .../test/build-logic-tests/build.gradle.kts | 4 + .../build-logic-tests/settings.gradle.kts | 1 + .../sqldelightTests.settings.gradle.kts | 5 + .../integrations/GradleVersionsTest.kt | 3 +- 36 files changed, 877 insertions(+), 3626 deletions(-) rename extensions/coroutines-extensions/src/{nativeTest => testableNativeTest}/kotlin/app/cash/sqldelight/coroutines/TestDriver.kt (100%) rename extensions/coroutines-extensions/src/{commonTest => testableTest}/kotlin/app/cash/sqldelight/coroutines/DbTest.kt (100%) rename extensions/coroutines-extensions/src/{commonTest => testableTest}/kotlin/app/cash/sqldelight/coroutines/MappingTest.kt (100%) rename extensions/coroutines-extensions/src/{commonTest => testableTest}/kotlin/app/cash/sqldelight/coroutines/QueryAsFlowTest.kt (100%) rename extensions/coroutines-extensions/src/{commonTest => testableTest}/kotlin/app/cash/sqldelight/coroutines/QueryAssert.kt (100%) rename extensions/coroutines-extensions/src/{commonTest => testableTest}/kotlin/app/cash/sqldelight/coroutines/RunTest.kt (93%) rename extensions/coroutines-extensions/src/{commonTest => testableTest}/kotlin/app/cash/sqldelight/coroutines/TestDb.kt (85%) delete mode 100644 sample/common/karma.config.d/wasm.js rename sample/common/src/iosMain/kotlin/com/example/sqldelight/hockey/data/{Date.kt => Date.ios.kt} (90%) rename sample/common/src/jvmMain/kotlin/com/example/sqldelight/hockey/data/{Date.kt => Date.jvm.kt} (66%) delete mode 100644 sample/common/webpack.config.d/fs.js delete mode 100644 sample/kotlin-js-store/yarn.lock diff --git a/.gitignore b/.gitignore index 30758e20575..417a272571c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .gradle +.kotlin **/.idea sqldelight-gradle-plugin/**/gradle sqldelight-gradle-plugin/**/gradlew diff --git a/build.gradle b/build.gradle index 09872f490d8..bfba12f63ed 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,7 @@ buildscript { strictly '4.4.1' } } + classpath("org.jetbrains.kotlinx:atomicfu-gradle-plugin:0.24.0") } } diff --git a/buildLogic/multiplatform-convention/src/main/kotlin/app/cash/sqldelight/multiplatform/MultiplatformConventions.kt b/buildLogic/multiplatform-convention/src/main/kotlin/app/cash/sqldelight/multiplatform/MultiplatformConventions.kt index a55bcc3aa5c..45e2fdd6635 100644 --- a/buildLogic/multiplatform-convention/src/main/kotlin/app/cash/sqldelight/multiplatform/MultiplatformConventions.kt +++ b/buildLogic/multiplatform-convention/src/main/kotlin/app/cash/sqldelight/multiplatform/MultiplatformConventions.kt @@ -2,6 +2,7 @@ package app.cash.sqldelight.multiplatform import org.gradle.api.Plugin import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.JsModuleKind import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.konan.target.HostManager @@ -21,10 +22,8 @@ class MultiplatformConventions : Plugin { } } } - compilations.configureEach { - it.kotlinOptions { - moduleKind = "umd" - } + compilerOptions { + moduleKind.set(JsModuleKind.MODULE_UMD) } } diff --git a/drivers/driver-test/build.gradle b/drivers/driver-test/build.gradle index aea2b2e9421..bfb2af0864b 100644 --- a/drivers/driver-test/build.gradle +++ b/drivers/driver-test/build.gradle @@ -1,36 +1,9 @@ plugins { - alias(libs.plugins.kotlin.multiplatform) + id("app.cash.sqldelight.multiplatform") id("app.cash.sqldelight.toolchain.runtime") } -// https://youtrack.jetbrains.com/issue/KTIJ-14471 -sourceSets { - main -} - kotlin { - jvm() - - js { - browser() - } - - // same targets as in `native-driver` - iosX64() - iosArm64() - tvosX64() - tvosArm64() - watchosX64() - watchosArm32() - watchosArm64() - macosX64() - mingwX64() - linuxX64() - macosArm64() - iosSimulatorArm64() - watchosSimulatorArm64() - tvosSimulatorArm64() - sourceSets { commonMain { dependencies { diff --git a/drivers/native-driver/build.gradle b/drivers/native-driver/build.gradle index e4cd10d494e..1581b698725 100644 --- a/drivers/native-driver/build.gradle +++ b/drivers/native-driver/build.gradle @@ -35,13 +35,15 @@ kotlin { mingwX64() watchosDeviceArm64() - targetHierarchy.default { target -> - target.group("native") { - it.group("nativeLinuxLike") { - it.withLinux() - it.withApple() - // https://github.com/touchlab/SQLiter/issues/117 - // it.withAndroidNative() + applyDefaultHierarchyTemplate { + it.common { target -> + target.group("native") { + it.group("nativeLinuxLike") { + it.group("linux") { } + it.group("apple") { } + // https://github.com/touchlab/SQLiter/issues/117 + // it.group("androidNative") + } } } } diff --git a/drivers/native-driver/src/nativeMain/kotlin/app/cash/sqldelight/driver/native/util/PoolLock.kt b/drivers/native-driver/src/nativeMain/kotlin/app/cash/sqldelight/driver/native/util/PoolLock.kt index 8106c89119b..422e3408422 100644 --- a/drivers/native-driver/src/nativeMain/kotlin/app/cash/sqldelight/driver/native/util/PoolLock.kt +++ b/drivers/native-driver/src/nativeMain/kotlin/app/cash/sqldelight/driver/native/util/PoolLock.kt @@ -1,6 +1,5 @@ package app.cash.sqldelight.driver.native.util -@Suppress("NO_ACTUAL_FOR_EXPECT") internal expect class PoolLock(reentrant: Boolean = false) { fun withLock( action: CriticalSection.() -> R, diff --git a/extensions/async-extensions/build.gradle b/extensions/async-extensions/build.gradle index c674081f580..1b0b0e8bf0e 100644 --- a/extensions/async-extensions/build.gradle +++ b/extensions/async-extensions/build.gradle @@ -13,7 +13,7 @@ kotlin { it.common { it.group("concurrent") { it.withJvm() - it.withNative() + it.group("native") { } } } } diff --git a/extensions/coroutines-extensions/build.gradle b/extensions/coroutines-extensions/build.gradle index c498f5f70a3..431e8f51a39 100644 --- a/extensions/coroutines-extensions/build.gradle +++ b/extensions/coroutines-extensions/build.gradle @@ -6,18 +6,25 @@ plugins { id("app.cash.sqldelight.multiplatform") id("app.cash.sqldelight.toolchain.runtime") alias(libs.plugins.binaryCompatibilityValidator) + id("kotlinx-atomicfu") } archivesBaseName = 'sqldelight-coroutines-extensions' kotlin { applyDefaultHierarchyTemplate { - it.group("testableNative") { - it.withApple() - it.withLinux() - it.withMingw() - // https://github.com/touchlab/SQLiter/issues/117 - // it.withAndroidNative() + it.common { + // not using commonTest due https://github.com/touchlab/SQLiter/issues/117 + it.group("testable") { + it.withJvm() + it.withJs() + it.group("testableNative") { + it.group("apple") {} + it.group("linux") {} + it.group("mingw") {} + // it.group("androidNative") + } + } } } @@ -57,7 +64,6 @@ kotlin { testableNativeTest { dependencies { implementation projects.drivers.nativeDriver - implementation libs.stately.concurrency } } } diff --git a/extensions/coroutines-extensions/src/nativeTest/kotlin/app/cash/sqldelight/coroutines/TestDriver.kt b/extensions/coroutines-extensions/src/testableNativeTest/kotlin/app/cash/sqldelight/coroutines/TestDriver.kt similarity index 100% rename from extensions/coroutines-extensions/src/nativeTest/kotlin/app/cash/sqldelight/coroutines/TestDriver.kt rename to extensions/coroutines-extensions/src/testableNativeTest/kotlin/app/cash/sqldelight/coroutines/TestDriver.kt diff --git a/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/DbTest.kt b/extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/DbTest.kt similarity index 100% rename from extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/DbTest.kt rename to extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/DbTest.kt diff --git a/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/MappingTest.kt b/extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/MappingTest.kt similarity index 100% rename from extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/MappingTest.kt rename to extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/MappingTest.kt diff --git a/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/QueryAsFlowTest.kt b/extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/QueryAsFlowTest.kt similarity index 100% rename from extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/QueryAsFlowTest.kt rename to extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/QueryAsFlowTest.kt diff --git a/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/QueryAssert.kt b/extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/QueryAssert.kt similarity index 100% rename from extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/QueryAssert.kt rename to extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/QueryAssert.kt diff --git a/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/RunTest.kt b/extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/RunTest.kt similarity index 93% rename from extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/RunTest.kt rename to extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/RunTest.kt index e0fb017f50d..072d2af8f79 100644 --- a/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/RunTest.kt +++ b/extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/RunTest.kt @@ -19,7 +19,8 @@ package app.cash.sqldelight.coroutines import kotlinx.coroutines.CoroutineScope fun DbTest.runTest(body: suspend CoroutineScope.(TestDb) -> Unit) = kotlinx.coroutines.test.runTest { - val db = setupDb() - db.use { body(it) } - db.close() + setupDb().use { db -> + db.init() + body(db) + } } diff --git a/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/TestDb.kt b/extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/TestDb.kt similarity index 85% rename from extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/TestDb.kt rename to extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/TestDb.kt index fa1762988b8..50a6ab380a0 100644 --- a/extensions/coroutines-extensions/src/commonTest/kotlin/app/cash/sqldelight/coroutines/TestDb.kt +++ b/extensions/coroutines-extensions/src/testableTest/kotlin/app/cash/sqldelight/coroutines/TestDb.kt @@ -8,39 +8,28 @@ import app.cash.sqldelight.coroutines.TestDb.Companion.TABLE_MANAGER import app.cash.sqldelight.db.QueryResult import app.cash.sqldelight.db.SqlCursor import app.cash.sqldelight.db.SqlDriver -import co.touchlab.stately.concurrency.AtomicBoolean -import co.touchlab.stately.concurrency.AtomicLong -import co.touchlab.stately.concurrency.value +import kotlinx.atomicfu.atomic expect suspend fun testDriver(): SqlDriver class TestDb( val db: SqlDriver, -) : SuspendingTransacterImpl(db) { - var aliceId = AtomicLong(0) - var bobId = AtomicLong(0) - var eveId = AtomicLong(0) +) : SuspendingTransacterImpl(db), + AutoCloseable { + var aliceId by atomic(0L) + var bobId by atomic(0L) + var eveId by atomic(0L) - var isInitialized = AtomicBoolean(false) - - private suspend fun init() { + suspend fun init() { db.execute(null, "PRAGMA foreign_keys=ON", 0).await() db.execute(null, CREATE_EMPLOYEE, 0).await() - aliceId.value = employee(Employee("alice", "Alice Allison")) - bobId.value = employee(Employee("bob", "Bob Bobberson")) - eveId.value = employee(Employee("eve", "Eve Evenson")) + aliceId = employee(Employee("alice", "Alice Allison")) + bobId = employee(Employee("bob", "Bob Bobberson")) + eveId = employee(Employee("eve", "Eve Evenson")) db.execute(null, CREATE_MANAGER, 0).await() - manager(eveId.value, aliceId.value) - } - - suspend fun use(block: suspend (TestDb) -> Unit) { - if (!isInitialized.value) { - init() - } - - block(this) + manager(eveId, aliceId) } fun createQuery(key: String, query: String, mapper: (SqlCursor) -> T): Query { @@ -63,7 +52,7 @@ class TestDb( db.notifyListeners(key) } - fun close() { + override fun close() { db.close() } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 32c9f00b067..d179408f953 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlin = "1.9.24" +kotlin = "2.0.0" dokka = "1.9.20" kotlinCoroutines = "1.8.1" idea = "231.9392.1" # Hedgehog | 2023.1.1 Patch 2 (see https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html) @@ -108,5 +108,5 @@ publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = "com.gradleup.shadow:8.3.0" -ksp = { id = "com.google.devtools.ksp", version = "1.9.25-1.0.20" } +ksp = { id = "com.google.devtools.ksp", version = "2.0.0-1.0.21" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.3" } diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index a9b082f84f6..52462732bbb 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -29,6 +29,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" @@ -47,13 +52,18 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.17": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.20": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" @@ -84,10 +94,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@types/component-emitter@^1.2.10": - version "1.2.11" - resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" - integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== "@types/cookie@^0.4.1": version "0.4.1" @@ -120,10 +130,10 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== -"@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== +"@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/json-schema@*", "@types/json-schema@^7.0.8": version "7.0.9" @@ -135,10 +145,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.18.tgz#3b4fed5cfb58010e3a2be4b6e74615e4847f1074" integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA== -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" @@ -153,10 +163,10 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" @@ -172,15 +182,15 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/ieee754@1.11.6": version "1.11.6" @@ -201,72 +211,72 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-api-error" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" -"@webpack-cli/configtest@^2.1.0": +"@webpack-cli/configtest@^2.1.1": version "2.1.1" resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== -"@webpack-cli/info@^2.0.1": +"@webpack-cli/info@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== -"@webpack-cli/serve@^2.0.3": +"@webpack-cli/serve@^2.0.5": version "2.0.5" resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== @@ -281,11 +291,6 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - accepts@~1.3.4: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -294,10 +299,10 @@ accepts@~1.3.4: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== acorn@^8.7.1: version "8.8.1" @@ -417,16 +422,15 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.14.5: - version "4.19.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" - integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== +browserslist@^4.21.10: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001286" - electron-to-chromium "^1.4.17" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" buffer-from@^1.0.0: version "1.1.2" @@ -443,10 +447,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001286: - version "1.0.30001312" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f" - integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ== +caniuse-lite@^1.0.30001587: + version "1.0.30001617" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz#809bc25f3f5027ceb33142a7d6c40759d7a901eb" + integrity sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA== chalk@^4.1.0: version "4.1.2" @@ -521,11 +525,6 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -component-emitter@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -597,7 +596,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4.3.4, debug@^4.3.4, debug@~4.3.2: +debug@4.3.4, debug@^4.3.4, debug@~4.3.2, debug@~4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -653,10 +652,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.4.17: - version "1.4.71" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz#17056914465da0890ce00351a3b946fd4cd51ff6" - integrity sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw== +electron-to-chromium@^1.4.668: + version "1.4.762" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.762.tgz#c29c9d47cf7cc128a9c364baa28adbadde95a47c" + integrity sha512-rrFvGweLxPwwSwJOjIopy3Vr+J3cIPtZzuc74bmlvmBIgQO3VYJDvVrlj94iKZ3ukXUH64Ex31hSfRTLqvjYJQ== emoji-regex@^8.0.0: version "8.0.0" @@ -668,15 +667,15 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -engine.io-parser@~5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" - integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== +engine.io-parser@~5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.2.tgz#37b48e2d23116919a3453738c5720455e64e1c49" + integrity sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw== -engine.io@~6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" - integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== +engine.io@~6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.4.tgz#6822debf324e781add2254e912f8568508850cdc" + integrity sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -686,13 +685,13 @@ engine.io@~6.2.0: cookie "~0.4.1" cors "~2.8.5" debug "~4.3.1" - engine.io-parser "~5.0.3" - ws "~8.2.3" + engine.io-parser "~5.2.1" + ws "~8.11.0" -enhanced-resolve@^5.13.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== +enhanced-resolve@^5.16.0: + version "5.16.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz#e8bc63d51b826d6f1cbc0a150ecb5a8b0c62e567" + integrity sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -717,6 +716,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -904,7 +908,18 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.2.0, glob@^7.1.3, glob@^7.1.7: +glob@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +glob@^7.1.3, glob@^7.1.7: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -933,16 +948,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== -graceful-fs@^4.2.10: +graceful-fs@^4.2.10, graceful-fs@^4.2.11: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -1149,19 +1159,19 @@ karma-sourcemap-loader@0.4.0: dependencies: graceful-fs "^4.2.10" -karma-webpack@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" - integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== +karma-webpack@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.1.tgz#4eafd31bbe684a747a6e8f3e4ad373e53979ced4" + integrity sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ== dependencies: glob "^7.1.3" - minimatch "^3.0.4" + minimatch "^9.0.3" webpack-merge "^4.1.5" -karma@6.4.2: - version "6.4.2" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.2.tgz#a983f874cee6f35990c4b2dcc3d274653714de8e" - integrity sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ== +karma@6.4.3: + version "6.4.3" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.3.tgz#763e500f99597218bbb536de1a14acc4ceea7ce8" + integrity sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q== dependencies: "@colors/colors" "1.5.0" body-parser "^1.19.0" @@ -1182,7 +1192,7 @@ karma@6.4.2: qjobs "^1.2.0" range-parser "^1.2.1" rimraf "^3.0.2" - socket.io "^4.4.1" + socket.io "^4.7.2" source-map "^0.6.1" tmp "^0.2.1" ua-parser-js "^0.7.30" @@ -1290,6 +1300,20 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.3: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.3: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -1307,10 +1331,10 @@ mkdirp@^0.5.5: dependencies: minimist "^1.2.6" -mocha@10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" - integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== +mocha@10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.3.0.tgz#0e185c49e6dccf582035c05fa91084a4ff6e3fe9" + integrity sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg== dependencies: ansi-colors "4.1.1" browser-stdout "1.3.1" @@ -1319,13 +1343,12 @@ mocha@10.2.0: diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" - glob "7.2.0" + glob "8.1.0" he "1.2.0" js-yaml "4.1.0" log-symbols "4.1.0" minimatch "5.0.1" ms "2.1.3" - nanoid "3.3.3" serialize-javascript "6.0.0" strip-json-comments "3.1.1" supports-color "8.1.1" @@ -1349,11 +1372,6 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -1364,10 +1382,10 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -node-releases@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -1603,7 +1621,7 @@ schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^3.1.2: +schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -1655,43 +1673,45 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -socket.io-adapter@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" - integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== +socket.io-adapter@~2.5.2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz#4fdb1358667f6d68f25343353bd99bd11ee41006" + integrity sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg== + dependencies: + debug "~4.3.4" + ws "~8.11.0" -socket.io-parser@~4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" - integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== dependencies: - "@types/component-emitter" "^1.2.10" - component-emitter "~1.3.0" + "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" -socket.io@^4.4.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.1.tgz#aa7e73f8a6ce20ee3c54b2446d321bbb6b1a9029" - integrity sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ== +socket.io@^4.7.2: + version "4.7.5" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.5.tgz#56eb2d976aef9d1445f373a62d781a41c7add8f8" + integrity sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA== dependencies: accepts "~1.3.4" base64id "~2.0.0" + cors "~2.8.5" debug "~4.3.2" - engine.io "~6.2.0" - socket.io-adapter "~2.4.0" - socket.io-parser "~4.0.4" + engine.io "~6.5.2" + socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-loader@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.1.tgz#72f00d05f5d1f90f80974eda781cbd7107c125f2" - integrity sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA== +source-map-loader@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-5.0.0.tgz#f593a916e1cc54471cfc8851b905c8a845fc7e38" + integrity sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA== dependencies: - abab "^2.0.6" iconv-lite "^0.6.3" source-map-js "^1.0.2" @@ -1772,21 +1792,21 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -terser-webpack-plugin@^5.3.7: - version "5.3.9" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" - integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== dependencies: - "@jridgewell/trace-mapping" "^0.3.17" + "@jridgewell/trace-mapping" "^0.3.20" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.16.8" + terser "^5.26.0" -terser@^5.16.8: - version "5.18.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.18.2.tgz#ff3072a0faf21ffd38f99acc9a0ddf7b5f07b948" - integrity sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w== +terser@^5.26.0: + version "5.31.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1" + integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -1820,10 +1840,10 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typescript@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== +typescript@5.4.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== ua-parser-js@^0.7.30: version "0.7.31" @@ -1840,6 +1860,14 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +update-browserslist-db@^1.0.13: + version "1.0.15" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz#60ed9f8cba4a728b7ecf7356f641a31e3a691d97" + integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -1862,23 +1890,23 @@ void-elements@^2.0.0: resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -webpack-cli@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.0.tgz#abc4b1f44b50250f2632d8b8b536cfe2f6257891" - integrity sha512-a7KRJnCxejFoDpYTOwzm5o21ZXMaNqtRlvS183XzGDUPRdVEzJNImcQokqYZ8BNTnk9DkKiuWxw75+DCCoZ26w== +webpack-cli@5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" + integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== dependencies: "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^2.1.0" - "@webpack-cli/info" "^2.0.1" - "@webpack-cli/serve" "^2.0.3" + "@webpack-cli/configtest" "^2.1.1" + "@webpack-cli/info" "^2.0.2" + "@webpack-cli/serve" "^2.0.5" colorette "^2.0.14" commander "^10.0.1" cross-spawn "^7.0.3" @@ -1909,34 +1937,34 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@5.82.0: - version "5.82.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.82.0.tgz#3c0d074dec79401db026b4ba0fb23d6333f88e7d" - integrity sha512-iGNA2fHhnDcV1bONdUu554eZx+XeldsaeQ8T67H6KKHl2nUSwX8Zm7cmzOA46ox/X1ARxf7Bjv8wQ/HsB5fxBg== +webpack@5.91.0: + version "5.91.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" + integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" + acorn-import-assertions "^1.9.0" + browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.13.0" + enhanced-resolve "^5.16.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.2" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" webpack-sources "^3.2.3" which@^1.2.1: @@ -1977,10 +2005,10 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -ws@~8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" - integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== +ws@~8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== y18n@^5.0.5: version "5.0.8" diff --git a/runtime/src/commonMain/kotlin/app/cash/sqldelight/db/QueryResult.kt b/runtime/src/commonMain/kotlin/app/cash/sqldelight/db/QueryResult.kt index f4daac02de8..0a38f222fb9 100644 --- a/runtime/src/commonMain/kotlin/app/cash/sqldelight/db/QueryResult.kt +++ b/runtime/src/commonMain/kotlin/app/cash/sqldelight/db/QueryResult.kt @@ -32,7 +32,7 @@ sealed interface QueryResult { } @JvmInline - value class AsyncValue(private inline val getter: suspend () -> T) : QueryResult { + value class AsyncValue(private val getter: suspend () -> T) : QueryResult { override suspend fun await() = getter() } diff --git a/sample-web/kotlin-js-store/yarn.lock b/sample-web/kotlin-js-store/yarn.lock index 51bb9a8511e..57fb3b3c7db 100644 --- a/sample-web/kotlin-js-store/yarn.lock +++ b/sample-web/kotlin-js-store/yarn.lock @@ -15,6 +15,18 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@jridgewell/gen-mapping@^0.3.0": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" @@ -47,7 +59,15 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.20": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@^0.3.9": version "0.3.19" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== @@ -55,6 +75,26 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jsonjoy.com/base64@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" + integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== + +"@jsonjoy.com/json-pack@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz#ab59c642a2e5368e8bcfd815d817143d4f3035d0" + integrity sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg== + dependencies: + "@jsonjoy.com/base64" "^1.1.1" + "@jsonjoy.com/util" "^1.1.2" + hyperdyperid "^1.2.0" + thingies "^1.20.0" + +"@jsonjoy.com/util@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.1.3.tgz#75b1c3cf21b70e665789d1ad3eabeff8b7fd1429" + integrity sha512-g//kkF4kOwUjemValCtOc/xiYzmwMRmWq3Bn+YnzOzuZLHq2PpMOxxIayN3cKbo7Ko2Np65t6D9H81IvXbXhqg== + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" @@ -81,6 +121,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@socket.io/component-emitter@~3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" @@ -94,17 +139,17 @@ "@types/connect" "*" "@types/node" "*" -"@types/bonjour@^3.5.9": - version "3.5.11" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" - integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== +"@types/bonjour@^3.5.13": + version "3.5.13" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" + integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" -"@types/connect-history-api-fallback@^1.3.5": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" - integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== +"@types/connect-history-api-fallback@^1.5.4": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" + integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" @@ -144,11 +189,16 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^1.0.0": +"@types/estree@*": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.2.tgz#ff02bc3dc8317cd668dfec247b750ba1f1d62453" integrity sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA== +"@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.17.37" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" @@ -159,7 +209,7 @@ "@types/range-parser" "*" "@types/send" "*" -"@types/express@*", "@types/express@^4.17.13": +"@types/express@*": version "4.17.18" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== @@ -169,6 +219,16 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/express@^4.17.21": + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/http-errors@*": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" @@ -196,6 +256,13 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== +"@types/node-forge@^1.3.0": + version "1.3.11" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.11.tgz#0972ea538ddb0f4d9c2fa0ec5db5724773a604da" + integrity sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@>=10.0.0": version "20.7.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.7.0.tgz#c03de4572f114a940bc2ca909a33ddb2b925e470" @@ -211,10 +278,10 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/retry@0.12.2": + version "0.12.2" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== "@types/send@*": version "0.17.2" @@ -224,14 +291,14 @@ "@types/mime" "^1" "@types/node" "*" -"@types/serve-index@^1.9.1": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.2.tgz#cb26e775678a8526b73a5d980a147518740aaecd" - integrity sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig== +"@types/serve-index@^1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" + integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" -"@types/serve-static@*", "@types/serve-static@^1.13.10": +"@types/serve-static@*": version "1.15.3" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.3.tgz#2cfacfd1fd4520bbc3e292cca432d5e8e2e3ee61" integrity sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg== @@ -240,24 +307,33 @@ "@types/mime" "*" "@types/node" "*" -"@types/sockjs@^0.3.33": - version "0.3.34" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.34.tgz#43e10e549b36d2ba2589278f00f81b5d7ccda167" - integrity sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g== +"@types/serve-static@^1.15.5": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== dependencies: + "@types/http-errors" "*" "@types/node" "*" + "@types/send" "*" -"@types/ws@^8.5.1": - version "8.5.6" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065" - integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg== +"@types/sockjs@^0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" + integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: "@types/node" "*" -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== +"@types/ws@^8.5.10": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" @@ -272,10 +348,10 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" @@ -291,15 +367,15 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/ieee754@1.11.6": version "1.11.6" @@ -320,72 +396,72 @@ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-api-error" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== dependencies: - "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" -"@webpack-cli/configtest@^2.1.0": +"@webpack-cli/configtest@^2.1.1": version "2.1.1" resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== -"@webpack-cli/info@^2.0.1": +"@webpack-cli/info@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== -"@webpack-cli/serve@^2.0.3": +"@webpack-cli/serve@^2.0.5": version "2.0.5" resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== @@ -400,11 +476,6 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" @@ -413,7 +484,7 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.7.6: +acorn-import-assertions@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== @@ -477,6 +548,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -484,6 +560,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -502,11 +583,6 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -568,13 +644,11 @@ body-parser@^1.19.0: type-is "~1.6.18" unpipe "1.0.0" -bonjour-service@^1.0.11: - version "1.1.1" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" - integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== +bonjour-service@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.2.1.tgz#eb41b3085183df3321da1264719fbada12478d02" + integrity sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw== dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" @@ -605,14 +679,14 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.14.5: - version "4.22.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.0.tgz#6adc8116589ccea8a99d0df79c5de2436199abdb" - integrity sha512-v+Jcv64L2LbfTC6OnRcaxtqJNJuQAVhZKSJfR/6hn7lhnChUXl4amwVviqN1k411BB+3rRoKMitELRn1CojeRA== +browserslist@^4.21.10: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: - caniuse-lite "^1.0.30001539" - electron-to-chromium "^1.4.530" - node-releases "^2.0.13" + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" update-browserslist-db "^1.0.13" buffer-from@^1.0.0: @@ -620,6 +694,13 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -643,10 +724,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001539: - version "1.0.30001539" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz#325a387ab1ed236df2c12dc6cd43a4fff9903a44" - integrity sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA== +caniuse-lite@^1.0.30001587: + version "1.0.30001617" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz#809bc25f3f5027ceb33142a7d6c40759d7a901eb" + integrity sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA== chalk@^4.1.0: version "4.1.2" @@ -656,7 +737,7 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@3.5.3, chokidar@^3.5.1, chokidar@^3.5.3: +chokidar@3.5.3, chokidar@^3.5.1: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -671,6 +752,21 @@ chokidar@3.5.3, chokidar@^3.5.1, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" @@ -813,7 +909,7 @@ cors@~2.8.5: object-assign "^4" vary "^1" -cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -856,6 +952,19 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +default-browser-id@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" + integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== + +default-browser@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" + integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -863,10 +972,10 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== depd@2.0.0: version "2.0.0" @@ -905,11 +1014,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - dns-packet@^5.2.2: version "5.6.1" resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" @@ -927,21 +1031,31 @@ dom-serialize@^2.2.1: extend "^3.0.0" void-elements "^2.0.0" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.530: - version "1.4.531" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.531.tgz#22966d894c4680726c17cf2908ee82ff5d26ac25" - integrity sha512-H6gi5E41Rn3/mhKlPaT1aIMg/71hTAqn0gYEllSuw9igNWtvQwu185jiCZoZD29n7Zukgh7GVZ3zGf0XvkhqjQ== +electron-to-chromium@^1.4.668: + version "1.4.762" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.762.tgz#c29c9d47cf7cc128a9c364baa28adbadde95a47c" + integrity sha512-rrFvGweLxPwwSwJOjIopy3Vr+J3cIPtZzuc74bmlvmBIgQO3VYJDvVrlj94iKZ3ukXUH64Ex31hSfRTLqvjYJQ== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -968,10 +1082,10 @@ engine.io@~6.5.2: engine.io-parser "~5.2.1" ws "~8.11.0" -enhanced-resolve@^5.13.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== +enhanced-resolve@^5.16.0: + version "5.16.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz#e8bc63d51b826d6f1cbc0a150ecb5a8b0c62e567" + integrity sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -1207,6 +1321,14 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + format-util@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" @@ -1231,11 +1353,6 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-monkey@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.5.tgz#fe450175f0db0d7ea758102e1d84096acb925788" - integrity sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew== - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1290,17 +1407,27 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^5.0.1" once "^1.3.0" - path-is-absolute "^1.0.0" + +glob@^10.3.7: + version "10.3.14" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.14.tgz#36501f871d373fe197fc5794588d0aa71e69ff68" + integrity sha512-4fkAqu93xe9Mk7le9v0y3VrPDqLKHarNi2s4Pv7f2yOvfhWfhc7hRPHC/JyqMqb8B/Dt/eGS4n7ykwf3fOsl8g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.6" + minimatch "^9.0.1" + minipass "^7.0.4" + path-scurry "^1.11.0" glob@^7.1.3, glob@^7.1.7: version "7.2.3" @@ -1326,7 +1453,7 @@ globby@^11.0.3: merge2 "^1.4.1" slash "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -1373,10 +1500,10 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-entities@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.4.0.tgz#edd0cee70402584c8c76cc2c0556db09d1f45061" - integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== +html-entities@^2.4.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.5.2.tgz#201a3cf95d3a15be7099521620d19dfb4f65359f" + integrity sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA== http-deceiver@^1.2.7: version "1.2.7" @@ -1434,6 +1561,11 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +hyperdyperid@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" + integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -1489,10 +1621,10 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.1.0.tgz#2119bc447ff8c257753b196fc5f1ce08a4cdf39f" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== +ipaddr.js@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== is-binary-path@~2.1.0: version "2.1.0" @@ -1508,10 +1640,10 @@ is-core-module@^2.13.0: dependencies: has "^1.0.3" -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== is-extglob@^2.1.1: version "2.1.1" @@ -1530,6 +1662,18 @@ is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + +is-network-error@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.1.0.tgz#d26a760e3770226d11c169052f266a4803d9c997" + integrity sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -1562,12 +1706,12 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== dependencies: - is-docker "^2.0.0" + is-inside-container "^1.0.0" isarray@~1.0.0: version "1.0.0" @@ -1589,6 +1733,15 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +jackspeak@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -1648,19 +1801,19 @@ karma-sourcemap-loader@0.4.0: dependencies: graceful-fs "^4.2.10" -karma-webpack@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" - integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== +karma-webpack@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.1.tgz#4eafd31bbe684a747a6e8f3e4ad373e53979ced4" + integrity sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ== dependencies: glob "^7.1.3" - minimatch "^3.0.4" + minimatch "^9.0.3" webpack-merge "^4.1.5" -karma@6.4.2: - version "6.4.2" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.2.tgz#a983f874cee6f35990c4b2dcc3d274653714de8e" - integrity sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ== +karma@6.4.3: + version "6.4.3" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.3.tgz#763e500f99597218bbb536de1a14acc4ceea7ce8" + integrity sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q== dependencies: "@colors/colors" "1.5.0" body-parser "^1.19.0" @@ -1681,7 +1834,7 @@ karma@6.4.2: qjobs "^1.2.0" range-parser "^1.2.1" rimraf "^3.0.2" - socket.io "^4.4.1" + socket.io "^4.7.2" source-map "^0.6.1" tmp "^0.2.1" ua-parser-js "^0.7.30" @@ -1692,13 +1845,13 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== +launch-editor@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" + integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== dependencies: picocolors "^1.0.0" - shell-quote "^1.7.3" + shell-quote "^1.8.1" loader-runner@^4.2.0: version "4.3.0" @@ -1743,17 +1896,25 @@ log4js@^6.4.1: rfdc "^1.3.0" streamroller "^3.1.5" +lru-cache@^10.2.0: + version "10.2.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878" + integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memfs@^3.4.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== +memfs@^4.6.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.9.2.tgz#42e7b48207268dad8c9c48ea5d4952c5d3840433" + integrity sha512-f16coDZlTG1jskq3mxarwB+fGRrd0uXWt+o1WIhRfOwbXQZqUDsTVxQBFK9JjRQHblg8eAG2JSbprDXKjc7ijQ== dependencies: - fs-monkey "^1.0.4" + "@jsonjoy.com/json-pack" "^1.0.3" + "@jsonjoy.com/util" "^1.1.2" + sonic-forest "^1.0.0" + tslib "^2.0.0" merge-descriptors@1.0.1: version "1.0.1" @@ -1829,11 +1990,30 @@ minimatch@^3.0.4, minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.1, minimatch@^9.0.3: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: + version "7.1.1" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.1.tgz#f7f85aff59aa22f110b20e27692465cf3bf89481" + integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== + mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -1841,10 +2021,10 @@ mkdirp@^0.5.5: dependencies: minimist "^1.2.6" -mocha@10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" - integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== +mocha@10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.3.0.tgz#0e185c49e6dccf582035c05fa91084a4ff6e3fe9" + integrity sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg== dependencies: ansi-colors "4.1.1" browser-stdout "1.3.1" @@ -1853,13 +2033,12 @@ mocha@10.2.0: diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" - glob "7.2.0" + glob "8.1.0" he "1.2.0" js-yaml "4.1.0" log-symbols "4.1.0" minimatch "5.0.1" ms "2.1.3" - nanoid "3.3.3" serialize-javascript "6.0.0" strip-json-comments "3.1.1" supports-color "8.1.1" @@ -1891,11 +2070,6 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -1911,10 +2085,10 @@ node-forge@^1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -1943,7 +2117,7 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@2.4.1: +on-finished@2.4.1, on-finished@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -1976,14 +2150,15 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^8.0.9: - version "8.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== +open@^10.0.3: + version "10.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-10.1.0.tgz#a7795e6e5d519abe4286d9937bb24b51122598e1" + integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw== dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^3.1.0" p-limit@^2.2.0: version "2.3.0" @@ -2013,12 +2188,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== +p-retry@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.0.tgz#8d6df01af298750009691ce2f9b3ad2d5968f3bd" + integrity sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA== dependencies: - "@types/retry" "0.12.0" + "@types/retry" "0.12.2" + is-network-error "^1.0.0" retry "^0.13.1" p-try@^2.0.0: @@ -2051,6 +2227,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.0.tgz#332d64e9726bf667fb348e5a1c71005c09ad741a" + integrity sha512-LNHTaVkzaYaLGlO+0u3rQTz7QrHTFOuKyba9JMTQutkmtNew8dw8wOD7mTU/5fCPZzCWpfW0XnQKzY61P0aTaw== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -2239,6 +2423,18 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.5.tgz#9be65d2d6e683447d2e9013da2bf451139a61ccf" + integrity sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A== + dependencies: + glob "^10.3.7" + +run-applescript@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" + integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -2261,7 +2457,7 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -schema-utils@^3.1.1, schema-utils@^3.1.2: +schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -2270,7 +2466,7 @@ schema-utils@^3.1.1, schema-utils@^3.1.2: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0: +schema-utils@^4.0.0, schema-utils@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== @@ -2285,11 +2481,12 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== +selfsigned@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" + integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== dependencies: + "@types/node-forge" "^1.3.0" node-forge "^1" send@0.18.0: @@ -2377,7 +2574,7 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3: +shell-quote@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== @@ -2396,6 +2593,11 @@ signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -2416,10 +2618,10 @@ socket.io-parser@~4.2.4: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" -socket.io@^4.4.1: - version "4.7.2" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.2.tgz#22557d76c3f3ca48f82e73d68b7add36a22df002" - integrity sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw== +socket.io@^4.7.2: + version "4.7.5" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.5.tgz#56eb2d976aef9d1445f373a62d781a41c7add8f8" + integrity sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA== dependencies: accepts "~1.3.4" base64id "~2.0.0" @@ -2438,17 +2640,23 @@ sockjs@^0.3.24: uuid "^8.3.2" websocket-driver "^0.7.4" +sonic-forest@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sonic-forest/-/sonic-forest-1.0.3.tgz#81363af60017daba39b794fce24627dc412563cb" + integrity sha512-dtwajos6IWMEWXdEbW1IkEkyL2gztCAgDplRIX+OT5aRKnEd5e7r7YCxRgXZdhRP1FBdOBf8axeTPhzDv8T4wQ== + dependencies: + tree-dump "^1.0.0" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-loader@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.1.tgz#72f00d05f5d1f90f80974eda781cbd7107c125f2" - integrity sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA== +source-map-loader@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-5.0.0.tgz#f593a916e1cc54471cfc8851b905c8a845fc7e38" + integrity sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA== dependencies: - abab "^2.0.6" iconv-lite "^0.6.3" source-map-js "^1.0.2" @@ -2512,7 +2720,7 @@ streamroller@^3.1.5: debug "^4.3.4" fs-extra "^8.1.0" -string-width@^4.1.0, string-width@^4.2.0: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2521,6 +2729,15 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -2535,13 +2752,20 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -2576,27 +2800,32 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -terser-webpack-plugin@^5.3.7: - version "5.3.9" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" - integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== dependencies: - "@jridgewell/trace-mapping" "^0.3.17" + "@jridgewell/trace-mapping" "^0.3.20" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.16.8" + terser "^5.26.0" -terser@^5.16.8: - version "5.20.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.20.0.tgz#ea42aea62578703e33def47d5c5b93c49772423e" - integrity sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ== +terser@^5.26.0: + version "5.31.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1" + integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" +thingies@^1.20.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/thingies/-/thingies-1.21.0.tgz#e80fbe58fd6fdaaab8fad9b67bd0a5c943c445c1" + integrity sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g== + thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -2621,6 +2850,16 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +tree-dump@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.0.1.tgz#b448758da7495580e6b7830d6b7834fca4c45b96" + integrity sha512-WCkcRBVPSlHHq1dc/px9iOfqklvzCbdRwvlNfxGZsrHqf6aZttfPrd7DJTt6oR10dwUfpFFQeVTkPbBIZxX/YA== + +tslib@^2.0.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -2629,10 +2868,10 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typescript@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== +typescript@5.4.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== ua-parser-js@^0.7.30: version "0.7.36" @@ -2689,10 +2928,10 @@ void-elements@^2.0.0: resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -2704,15 +2943,15 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -webpack-cli@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.0.tgz#abc4b1f44b50250f2632d8b8b536cfe2f6257891" - integrity sha512-a7KRJnCxejFoDpYTOwzm5o21ZXMaNqtRlvS183XzGDUPRdVEzJNImcQokqYZ8BNTnk9DkKiuWxw75+DCCoZ26w== +webpack-cli@5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" + integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== dependencies: "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^2.1.0" - "@webpack-cli/info" "^2.0.1" - "@webpack-cli/serve" "^2.0.3" + "@webpack-cli/configtest" "^2.1.1" + "@webpack-cli/info" "^2.0.2" + "@webpack-cli/serve" "^2.0.5" colorette "^2.0.14" commander "^10.0.1" cross-spawn "^7.0.3" @@ -2723,52 +2962,53 @@ webpack-cli@5.1.0: rechoir "^0.8.0" webpack-merge "^5.7.3" -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== +webpack-dev-middleware@^7.1.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.2.1.tgz#2af00538b6e4eda05f5afdd5d711dbebc05958f7" + integrity sha512-hRLz+jPQXo999Nx9fXVdKlg/aehsw1ajA9skAneGmT03xwmyuhvF93p6HUKKbWhXdcERtGTzUCtIQr+2IQegrA== dependencies: colorette "^2.0.10" - memfs "^3.4.3" + memfs "^4.6.0" mime-types "^2.1.31" + on-finished "^2.4.1" range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@4.15.0: - version "4.15.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz#87ba9006eca53c551607ea0d663f4ae88be7af21" - integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" +webpack-dev-server@5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz#cb6ea47ff796b9251ec49a94f24a425e12e3c9b8" + integrity sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA== + dependencies: + "@types/bonjour" "^3.5.13" + "@types/connect-history-api-fallback" "^1.5.4" + "@types/express" "^4.17.21" + "@types/serve-index" "^1.9.4" + "@types/serve-static" "^1.15.5" + "@types/sockjs" "^0.3.36" + "@types/ws" "^8.5.10" ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" + bonjour-service "^1.2.1" + chokidar "^3.6.0" colorette "^2.0.10" compression "^1.7.4" connect-history-api-fallback "^2.0.0" default-gateway "^6.0.3" express "^4.17.3" graceful-fs "^4.2.6" - html-entities "^2.3.2" + html-entities "^2.4.0" http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" + ipaddr.js "^2.1.0" + launch-editor "^2.6.1" + open "^10.0.3" + p-retry "^6.2.0" + rimraf "^5.0.5" + schema-utils "^4.2.0" + selfsigned "^2.4.1" serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" + webpack-dev-middleware "^7.1.0" + ws "^8.16.0" webpack-merge@^4.1.5: version "4.2.2" @@ -2790,34 +3030,34 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@5.82.0: - version "5.82.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.82.0.tgz#3c0d074dec79401db026b4ba0fb23d6333f88e7d" - integrity sha512-iGNA2fHhnDcV1bONdUu554eZx+XeldsaeQ8T67H6KKHl2nUSwX8Zm7cmzOA46ox/X1ARxf7Bjv8wQ/HsB5fxBg== +webpack@5.91.0: + version "5.91.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" + integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" + acorn-import-assertions "^1.9.0" + browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.13.0" + enhanced-resolve "^5.16.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.2" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: @@ -2858,7 +3098,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -2867,15 +3107,24 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^8.13.0: - version "8.14.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" - integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== +ws@^8.16.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== ws@~8.11.0: version "8.11.0" diff --git a/sample/build.gradle b/sample/build.gradle index 0f4ed301f13..3621bb79bf1 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -5,8 +5,3 @@ plugins { alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.native.cocoapods) apply false } - -// Workaround yarn concurrency issue - https://youtrack.jetbrains.com/issue/KT-43320 -tasks.withType(org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask).configureEach { - args.addAll(["--mutex", "file:${file("../build/.yarn-mutex")}".toString()]) -} diff --git a/sample/common/build.gradle b/sample/common/build.gradle index cbdbc385623..153b5b7432d 100644 --- a/sample/common/build.gradle +++ b/sample/common/build.gradle @@ -18,8 +18,9 @@ sqldelight { version = 1.0 kotlin { + applyDefaultHierarchyTemplate() jvmToolchain(8) - + // Configure common. sourceSets.commonMain.dependencies { implementation 'app.cash.sqldelight:primitive-adapters' @@ -37,12 +38,8 @@ kotlin { } // Configure iOS. - def sdkName = System.getenv("SDK_NAME") - if (sdkName != null && sdkName.startsWith("iphoneos")) { - iosArm64("ios") - } else { - iosX64("ios") - } + iosArm64() + iosX64() sourceSets.iosMain.dependencies { implementation "app.cash.sqldelight:native-driver" } @@ -52,11 +49,3 @@ kotlin { homepage = "https://github.com/cashapp/sqldelight/tree/master/sample/common" } } - -// https://youtrack.jetbrains.com/issue/KT-55751 -configurations { - def myAttribute = Attribute.of("dummy.attribute", String) - - podDebugFrameworkIos { attributes.attribute(myAttribute, "dummy-value") } - podReleaseFrameworkIos { attributes.attribute(myAttribute, "dummy-value") } -} diff --git a/sample/common/common.podspec b/sample/common/common.podspec index ab5a9a9d4d8..fd533533c45 100644 --- a/sample/common/common.podspec +++ b/sample/common/common.podspec @@ -11,6 +11,21 @@ Pod::Spec.new do |spec| + if !Dir.exist?('build/cocoapods/framework/common.framework') || Dir.empty?('build/cocoapods/framework/common.framework') + raise " + + Kotlin framework 'common' doesn't exist yet, so a proper Xcode project can't be generated. + 'pod install' should be executed after running ':generateDummyFramework' Gradle task: + + ./gradlew :common:generateDummyFramework + + Alternatively, proper pod installation is performed during Gradle sync in the IDE (if Podfile location is set)" + end + + spec.xcconfig = { + 'ENABLE_USER_SCRIPT_SANDBOXING' => 'NO', + } + spec.pod_target_xcconfig = { 'KOTLIN_PROJECT_PATH' => ':common', 'PRODUCT_MODULE_NAME' => 'common', diff --git a/sample/common/karma.config.d/wasm.js b/sample/common/karma.config.d/wasm.js deleted file mode 100644 index 81dc7db32b6..00000000000 --- a/sample/common/karma.config.d/wasm.js +++ /dev/null @@ -1,21 +0,0 @@ -const path = require("path"); -const dist = path.resolve("../../node_modules/sql.js/dist/") -const wasm = path.join(dist, "sql-wasm.wasm") -const worker = path.join(dist, "worker.sql-wasm.js") - -config.files.push({ - pattern: wasm, - served: true, - watched: false, - included: false, - nocache: false, -}, { - pattern: worker, - served: true, - watched: false, - included: false, - nocache: false, -}); - -config.proxies["/sql-wasm.wasm"] = `/absolute${wasm}` -config.proxies["/worker.sql-wasm.js"] = `/absolute${worker}` diff --git a/sample/common/src/commonMain/kotlin/com/example/sqldelight/hockey/data/Date.kt b/sample/common/src/commonMain/kotlin/com/example/sqldelight/hockey/data/Date.kt index 082ec4a2993..fd3b6aebb49 100644 --- a/sample/common/src/commonMain/kotlin/com/example/sqldelight/hockey/data/Date.kt +++ b/sample/common/src/commonMain/kotlin/com/example/sqldelight/hockey/data/Date.kt @@ -4,4 +4,7 @@ import app.cash.sqldelight.ColumnAdapter expect class Date(year: Int, month: Int, day: Int) -expect class DateAdapter() : ColumnAdapter +expect class DateAdapter() : ColumnAdapter { + override fun encode(value: Date): Long + override fun decode(databaseValue: Long): Date +} diff --git a/sample/common/src/commonTest/kotlin/com/example/sqldelight/hockey/BaseTest.kt b/sample/common/src/commonTest/kotlin/com/example/sqldelight/hockey/BaseTest.kt index 4e088f1ab84..2061a255597 100644 --- a/sample/common/src/commonTest/kotlin/com/example/sqldelight/hockey/BaseTest.kt +++ b/sample/common/src/commonTest/kotlin/com/example/sqldelight/hockey/BaseTest.kt @@ -1,7 +1,6 @@ package com.example.sqldelight.hockey import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runTest /** @@ -19,7 +18,6 @@ expect suspend fun closeDriver() */ expect fun getDb(): HockeyDb -@OptIn(ExperimentalCoroutinesApi::class) fun testing(block: suspend CoroutineScope.(HockeyDb) -> Unit) = runTest { createDriver() block(getDb()) diff --git a/sample/common/src/iosMain/kotlin/com/example/sqldelight/hockey/data/Date.kt b/sample/common/src/iosMain/kotlin/com/example/sqldelight/hockey/data/Date.ios.kt similarity index 90% rename from sample/common/src/iosMain/kotlin/com/example/sqldelight/hockey/data/Date.kt rename to sample/common/src/iosMain/kotlin/com/example/sqldelight/hockey/data/Date.ios.kt index 89147a05c1b..98a885e3edb 100644 --- a/sample/common/src/iosMain/kotlin/com/example/sqldelight/hockey/data/Date.kt +++ b/sample/common/src/iosMain/kotlin/com/example/sqldelight/hockey/data/Date.ios.kt @@ -22,9 +22,9 @@ internal fun partsToDate(year: Int, month: Int, day: Int): NSDate { } actual class DateAdapter actual constructor() : ColumnAdapter { - override fun decode(databaseValue: Long): Date = + actual override fun decode(databaseValue: Long): Date = Date(NSDate.dateWithTimeIntervalSince1970(databaseValue.toDouble() / 1000)) - override fun encode(value: Date): Long = + actual override fun encode(value: Date): Long = floor(value.nsDate.timeIntervalSince1970 * 1000L).toLong() } diff --git a/sample/common/src/iosMain/kotlin/com/example/sqldelight/hockey/platform/DateFormatHelper.kt b/sample/common/src/iosMain/kotlin/com/example/sqldelight/hockey/platform/DateFormatHelper.kt index de5e4809fe3..04a9dfbe1b4 100644 --- a/sample/common/src/iosMain/kotlin/com/example/sqldelight/hockey/platform/DateFormatHelper.kt +++ b/sample/common/src/iosMain/kotlin/com/example/sqldelight/hockey/platform/DateFormatHelper.kt @@ -4,10 +4,9 @@ import com.example.sqldelight.hockey.data.Date import platform.Foundation.NSDateFormatter actual class DateFormatHelper actual constructor(format: String) { - private val formatter: NSDateFormatter + private val formatter: NSDateFormatter = NSDateFormatter() init { - formatter = NSDateFormatter() formatter.dateFormat = format } diff --git a/sample/common/src/jvmMain/kotlin/com/example/sqldelight/hockey/data/Date.kt b/sample/common/src/jvmMain/kotlin/com/example/sqldelight/hockey/data/Date.jvm.kt similarity index 66% rename from sample/common/src/jvmMain/kotlin/com/example/sqldelight/hockey/data/Date.kt rename to sample/common/src/jvmMain/kotlin/com/example/sqldelight/hockey/data/Date.jvm.kt index 5d59944e8f3..839ecb0a369 100644 --- a/sample/common/src/jvmMain/kotlin/com/example/sqldelight/hockey/data/Date.kt +++ b/sample/common/src/jvmMain/kotlin/com/example/sqldelight/hockey/data/Date.jvm.kt @@ -6,8 +6,8 @@ import java.util.GregorianCalendar actual typealias Date = GregorianCalendar actual class DateAdapter actual constructor() : ColumnAdapter { - override fun encode(value: Date) = value.timeInMillis - override fun decode(databaseValue: Long) = Date.getInstance().apply { + actual override fun encode(value: Date) = value.timeInMillis + actual override fun decode(databaseValue: Long) = Date.getInstance().apply { timeInMillis = databaseValue } as Date } diff --git a/sample/common/webpack.config.d/fs.js b/sample/common/webpack.config.d/fs.js deleted file mode 100644 index 4ce95011bc1..00000000000 --- a/sample/common/webpack.config.d/fs.js +++ /dev/null @@ -1,9 +0,0 @@ -// Remove fs in the webpack config in order to build for front end -// https://github.com/webpack-contrib/css-loader/issues/447 -config.resolve = { - fallback: { - fs: false, - path: false, - crypto: false, - } -}; diff --git a/sample/gradle.properties b/sample/gradle.properties index e5d4c1f36d9..4ea65139f02 100644 --- a/sample/gradle.properties +++ b/sample/gradle.properties @@ -1,3 +1,2 @@ android.useAndroidX=true -kotlin.js.compiler=ir org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=1g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 diff --git a/sample/kotlin-js-store/yarn.lock b/sample/kotlin-js-store/yarn.lock deleted file mode 100644 index fdfc545b7a9..00000000000 --- a/sample/kotlin-js-store/yarn.lock +++ /dev/null @@ -1,2976 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" - integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== - dependencies: - "@types/node" "*" - -"@types/component-emitter@^1.2.10": - version "1.2.11" - resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.11.tgz#50d47d42b347253817a39709fef03ce66a108506" - integrity sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== - -"@types/connect-history-api-fallback@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" - integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== - -"@types/cors@^2.8.12": - version "2.8.12" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.12.tgz#6b2c510a7ad7039e98e7b8d3d6598f4359e5c080" - integrity sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== - -"@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" - integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.31": - version "4.17.31" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f" - integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@*", "@types/express@^4.17.13": - version "4.17.15" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.15.tgz#9290e983ec8b054b65a5abccb610411953d417ff" - integrity sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.31" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/http-proxy@^1.17.8": - version "1.17.9" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" - integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== - dependencies: - "@types/node" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.8": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== - -"@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== - -"@types/node@*", "@types/node@>=10.0.0": - version "17.0.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.18.tgz#3b4fed5cfb58010e3a2be4b6e74615e4847f1074" - integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== - dependencies: - "@types/mime" "*" - "@types/node" "*" - -"@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== - dependencies: - "@types/node" "*" - -"@types/ws@^8.5.1": - version "8.5.3" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" - integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== - dependencies: - "@types/node" "*" - -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^2.1.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" - integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== - -"@webpack-cli/info@^2.0.1": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" - integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== - -"@webpack-cli/serve@^2.0.3": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" - integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn@^8.7.1: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== - -acorn@^8.8.2: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.8.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" - integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64id@2.0.0, base64id@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -body-parser@^1.19.0: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" - type-is "~1.6.18" - -bonjour-service@^1.0.11: - version "1.0.14" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.14.tgz#c346f5bc84e87802d08f8d5a60b93f758e514ee7" - integrity sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ== - dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserslist@^4.14.5: - version "4.19.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" - integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== - dependencies: - caniuse-lite "^1.0.30001286" - electron-to-chromium "^1.4.17" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001286: - version "1.0.30001312" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f" - integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ== - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@3.5.3, chokidar@^3.5.1, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.10: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -colorette@^2.0.14: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== - -commander@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -component-emitter@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -connect@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookie@~0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -copy-webpack-plugin@9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz#2d2c460c4c4695ec0a58afb2801a1205256c4e6b" - integrity sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA== - dependencies: - fast-glob "^3.2.7" - glob-parent "^6.0.1" - globby "^11.0.3" - normalize-path "^3.0.0" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@~2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -custom-event@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= - -date-format@^4.0.10: - version "4.0.11" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.11.tgz#ae0d1e069d7f0687938fd06f98c12f3a6276e526" - integrity sha512-VS20KRyorrbMCQmpdl2hg5KaOUsda1RbnsJg461FfrcyCUg+pkd0b40BSW4niQyTheww4DBXQnS7HwSrKkipLw== - -dateformat@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4.3.4, debug@^4.1.0, debug@^4.3.4, debug@~4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@~4.3.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^5.2.2: - version "5.4.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" - integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -dom-serialize@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= - dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.4.17: - version "1.4.71" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz#17056914465da0890ce00351a3b946fd4cd51ff6" - integrity sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -engine.io-parser@~5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" - integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== - -engine.io@~6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" - integrity sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== - dependencies: - "@types/cookie" "^0.4.1" - "@types/cors" "^2.8.12" - "@types/node" ">=10.0.0" - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - cors "~2.8.5" - debug "~4.3.1" - engine.io-parser "~5.0.3" - ws "~8.2.3" - -enhanced-resolve@^5.13.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -ent@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= - -envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -es-module-lexer@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" - integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -express@^4.17.3: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.7, fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== - -follow-redirects@^1.0.0: - version "1.14.8" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc" - integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA== - -format-util@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.5.tgz#1ffb450c8a03e7bccffe40643180918cc297d271" - integrity sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg== - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@7.2.0, glob@^7.1.3, glob@^7.1.7: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globby@^11.0.3: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - -graceful-fs@^4.2.10: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== - dependencies: - has "^1.0.3" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isbinaryfile@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" - integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -karma-chrome-launcher@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz#eb9c95024f2d6dfbb3748d3415ac9b381906b9a9" - integrity sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q== - dependencies: - which "^1.2.1" - -karma-mocha@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.1.tgz#4b0254a18dfee71bdbe6188d9a6861bf86b0cd7d" - integrity sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ== - dependencies: - minimist "^1.2.3" - -karma-sourcemap-loader@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.4.0.tgz#b01d73f8f688f533bcc8f5d273d43458e13b5488" - integrity sha512-xCRL3/pmhAYF3I6qOrcn0uhbQevitc2DERMPH82FMnG+4WReoGcGFZb1pURf2a5apyrOHRdvD+O6K7NljqKHyA== - dependencies: - graceful-fs "^4.2.10" - -karma-webpack@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-5.0.0.tgz#2a2c7b80163fe7ffd1010f83f5507f95ef39f840" - integrity sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA== - dependencies: - glob "^7.1.3" - minimatch "^3.0.4" - webpack-merge "^4.1.5" - -karma@6.4.2: - version "6.4.2" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.4.2.tgz#a983f874cee6f35990c4b2dcc3d274653714de8e" - integrity sha512-C6SU/53LB31BEgRg+omznBEMY4SjHU3ricV6zBcAe1EeILKkeScr+fZXtaI5WyDbkVowJxxAI6h73NcFPmXolQ== - dependencies: - "@colors/colors" "1.5.0" - body-parser "^1.19.0" - braces "^3.0.2" - chokidar "^3.5.1" - connect "^3.7.0" - di "^0.0.1" - dom-serialize "^2.2.1" - glob "^7.1.7" - graceful-fs "^4.2.6" - http-proxy "^1.18.1" - isbinaryfile "^4.0.8" - lodash "^4.17.21" - log4js "^6.4.1" - mime "^2.5.2" - minimatch "^3.0.4" - mkdirp "^0.5.5" - qjobs "^1.2.0" - range-parser "^1.2.1" - rimraf "^3.0.2" - socket.io "^4.4.1" - source-map "^0.6.1" - tmp "^0.2.1" - ua-parser-js "^0.7.30" - yargs "^16.1.1" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== - dependencies: - picocolors "^1.0.0" - shell-quote "^1.7.3" - -loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log4js@^6.4.1: - version "6.5.2" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.5.2.tgz#9ae371e5b3cb3a3a209c24686e5547f8670834e5" - integrity sha512-DXtpNtt+KDOMT7RHUDIur/WsSA3rntlUh9Zg4XCdV42wUuMmbFkl38+LZ92Z5QvQA7mD5kAVkLiBSEH/tvUB8A== - dependencies: - date-format "^4.0.10" - debug "^4.3.4" - flatted "^3.2.5" - rfdc "^1.3.0" - streamroller "^3.1.1" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -memfs@^3.4.3: - version "3.4.12" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.12.tgz#d00f8ad8dab132dc277c659dc85bfd14b07d03bd" - integrity sha512-BcjuQn6vfqP+k100e0E9m61Hyqa//Brp+I3f0OBmN0ATHlFA8vx3Lt8z57R3u2bPqe3WGDBC+nF72fTH7isyEw== - dependencies: - fs-monkey "^1.0.3" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.51.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - -mime-types@^2.1.31, mime-types@~2.1.17: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.5.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.4: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mkdirp@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mocha@10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" - integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-forge@^1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-releases@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -object-assign@^4: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.0.9: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qjobs@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" - integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== - dependencies: - bytes "3.1.2" - http-errors "1.8.1" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readable-stream@^2.0.1: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@^1.20.0: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.2: - version "3.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== - dependencies: - node-forge "^1" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@6.0.0, serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -socket.io-adapter@~2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" - integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== - -socket.io-parser@~4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" - integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== - dependencies: - "@types/component-emitter" "^1.2.10" - component-emitter "~1.3.0" - debug "~4.3.1" - -socket.io@^4.4.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.1.tgz#aa7e73f8a6ce20ee3c54b2446d321bbb6b1a9029" - integrity sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ== - dependencies: - accepts "~1.3.4" - base64id "~2.0.0" - debug "~4.3.2" - engine.io "~6.2.0" - socket.io-adapter "~2.4.0" - socket.io-parser "~4.0.4" - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-loader@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-4.0.1.tgz#72f00d05f5d1f90f80974eda781cbd7107c125f2" - integrity sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA== - dependencies: - abab "^2.0.6" - iconv-lite "^0.6.3" - source-map-js "^1.0.2" - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -sql.js@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/sql.js/-/sql.js-1.8.0.tgz#cb45d957e17a2239662fe2f614c9b678990867a6" - integrity sha512-3HD8pSkZL+5YvYUI8nlvNILs61ALqq34xgmF+BHpqxe68yZIJ1H+sIVIODvni25+CcxHUxDyrTJUL0lE/m7afw== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -streamroller@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.1.tgz#679aae10a4703acdf2740755307df0a05ad752e6" - integrity sha512-iPhtd9unZ6zKdWgMeYGfSBuqCngyJy1B/GPi/lTpwGpa3bajuX30GjUVd0/Tn/Xhg0mr4DOSENozz9Y06qyonQ== - dependencies: - date-format "^4.0.10" - debug "^4.3.4" - fs-extra "^10.1.0" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@8.1.1, supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.3.7: - version "5.3.9" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" - integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.16.8" - -terser@^5.16.8: - version "5.19.4" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.4.tgz#941426fa482bf9b40a0308ab2b3cd0cf7c775ebd" - integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typescript@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== - -ua-parser-js@^0.7.30: - version "0.7.31" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" - integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -webpack-cli@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.0.tgz#abc4b1f44b50250f2632d8b8b536cfe2f6257891" - integrity sha512-a7KRJnCxejFoDpYTOwzm5o21ZXMaNqtRlvS183XzGDUPRdVEzJNImcQokqYZ8BNTnk9DkKiuWxw75+DCCoZ26w== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^2.1.0" - "@webpack-cli/info" "^2.0.1" - "@webpack-cli/serve" "^2.0.3" - colorette "^2.0.14" - commander "^10.0.1" - cross-spawn "^7.0.3" - envinfo "^7.7.3" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^3.1.1" - rechoir "^0.8.0" - webpack-merge "^5.7.3" - -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@4.15.0: - version "4.15.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz#87ba9006eca53c551607ea0d663f4ae88be7af21" - integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" - -webpack-merge@^4.1.5: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== - dependencies: - lodash "^4.17.15" - -webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@5.82.0: - version "5.82.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.82.0.tgz#3c0d074dec79401db026b4ba0fb23d6333f88e7d" - integrity sha512-iGNA2fHhnDcV1bONdUu554eZx+XeldsaeQ8T67H6KKHl2nUSwX8Zm7cmzOA46ox/X1ARxf7Bjv8wQ/HsB5fxBg== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.13.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -which@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -ws@^8.13.0: - version "8.14.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.1.tgz#4b9586b4f70f9e6534c7bb1d3dc0baa8b8cf01e0" - integrity sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A== - -ws@~8.2.3: - version "8.2.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" - integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0, yargs@^16.1.1: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/SqlDelightPlugin.kt b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/SqlDelightPlugin.kt index 26d97605c8e..5b92e063011 100644 --- a/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/SqlDelightPlugin.kt +++ b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/SqlDelightPlugin.kt @@ -31,7 +31,7 @@ import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.plugin.KotlinBasePlugin import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetContainer -internal const val MIN_GRADLE_VERSION = "7.0" +internal const val MIN_GRADLE_VERSION = "8.0" abstract class SqlDelightPlugin : Plugin { private val android = AtomicBoolean(false) diff --git a/sqldelight-gradle-plugin/src/test/build-logic-tests/build.gradle.kts b/sqldelight-gradle-plugin/src/test/build-logic-tests/build.gradle.kts index bc0172f0f07..64c72e9e3ef 100644 --- a/sqldelight-gradle-plugin/src/test/build-logic-tests/build.gradle.kts +++ b/sqldelight-gradle-plugin/src/test/build-logic-tests/build.gradle.kts @@ -1,3 +1,7 @@ plugins { `kotlin-dsl` } + +dependencies { + implementation("org.gradle.toolchains:foojay-resolver:0.8.0") +} diff --git a/sqldelight-gradle-plugin/src/test/build-logic-tests/settings.gradle.kts b/sqldelight-gradle-plugin/src/test/build-logic-tests/settings.gradle.kts index 008aadfd0ce..ccbf6e9c0c5 100644 --- a/sqldelight-gradle-plugin/src/test/build-logic-tests/settings.gradle.kts +++ b/sqldelight-gradle-plugin/src/test/build-logic-tests/settings.gradle.kts @@ -1,6 +1,7 @@ dependencyResolutionManagement { repositories { mavenCentral() + gradlePluginPortal() } } diff --git a/sqldelight-gradle-plugin/src/test/build-logic-tests/src/main/kotlin/sqldelightTests.settings.gradle.kts b/sqldelight-gradle-plugin/src/test/build-logic-tests/src/main/kotlin/sqldelightTests.settings.gradle.kts index 88439bffcf9..63847be604d 100644 --- a/sqldelight-gradle-plugin/src/test/build-logic-tests/src/main/kotlin/sqldelightTests.settings.gradle.kts +++ b/sqldelight-gradle-plugin/src/test/build-logic-tests/src/main/kotlin/sqldelightTests.settings.gradle.kts @@ -3,9 +3,14 @@ pluginManagement { maven(url = "file://${settingsDir.absolutePath}/../../../../build/localMaven") mavenCentral() google() + gradlePluginPortal() } } +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") +} + dependencyResolutionManagement { versionCatalogs.register("libs") { from(files("../../../../gradle/libs.versions.toml")) diff --git a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/integrations/GradleVersionsTest.kt b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/integrations/GradleVersionsTest.kt index 39a7583c428..32695d760ba 100644 --- a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/integrations/GradleVersionsTest.kt +++ b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/integrations/GradleVersionsTest.kt @@ -15,6 +15,7 @@ */ package app.cash.sqldelight.integrations +import app.cash.sqldelight.gradle.MIN_GRADLE_VERSION import app.cash.sqldelight.withCommonConfiguration import com.google.common.truth.Truth.assertThat import java.io.File @@ -35,7 +36,7 @@ class GradleVersionsTest(private val gradleVersion: String) { // MIN_GRADLE_VERSION, // We use version catalogs in tests too but this feature is only stable since 7.4. // Test MIN_GRADLE_VERSION too if MIN_GRADLE_VERSION is higher than 7.4. - "7.4.2", + MIN_GRADLE_VERSION, GradleVersion.current().version, ) } From a9f042b951bb3f4144166f38e8c20e77bc02216f Mon Sep 17 00:00:00 2001 From: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Date: Mon, 9 Sep 2024 23:37:05 +0200 Subject: [PATCH 218/304] Migrate to new Gradle IntelliJ plugin (#5446) * Migrate to new Gradle IntelliJ plugin * Fix syntax * Use renamed verify task name * Enable K2 mode * Unset untilBuild parameter --- .github/workflows/PR.yml | 7 +- .gitignore | 3 +- gradle.properties | 3 + gradle/libs.versions.toml | 2 +- sqldelight-idea-plugin/build.gradle | 96 +++++++++++-------- sqldelight-idea-plugin/gradle.properties | 1 - .../src/main/resources/META-INF/plugin.xml | 5 +- 7 files changed, 69 insertions(+), 48 deletions(-) diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index 228649e7bba..f5dba838c18 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -119,15 +119,16 @@ jobs: matrix: # https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html idea: - - 'IC-2023.2.5' # IC / Iguana - - 'IC-2024.1' # IC + - '2023.2.5' # IC / Iguana + - '2024.1' # IC + - '2024.2' # IC steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: distribution: 'zulu' java-version-file: .github/workflows/.ci-java-version - - run: ./gradlew -DideaVersion=${{matrix.idea}} :sqldelight-idea-plugin:runPluginVerifier + - run: ./gradlew -DideaVersion=${{matrix.idea}} :sqldelight-idea-plugin:verifyPlugin verify_intellij_check: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 417a272571c..ea5759aa3d9 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,5 @@ docs/upgrading.md docs/contributing.md # Jenv local setting -.java-version \ No newline at end of file +.java-version +.intellijPlatform diff --git a/gradle.properties b/gradle.properties index e2bd8936e3a..61970df5533 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,3 +27,6 @@ kotlin.native.ignoreDisabledTargets=true # caches break the linkage of the sqlite amalgamation kotlin.native.cacheKind.linuxX64=none + +org.jetbrains.intellij.platform.useCacheRedirector=false +org.jetbrains.intellij.platform.selfUpdateCheck=false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d179408f953..39d05626bc3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -102,7 +102,7 @@ kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-android-extensions = { id = "org.jetbrains.kotlin.android.extensions", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } -intellij = { id = "org.jetbrains.intellij", version = "1.17.4" } +intellij = { id = "org.jetbrains.intellij.platform", version = "2.0.1" } grammarKitComposer = { id = "com.alecstrong.grammar.kit.composer", version = "0.1.12" } publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } diff --git a/sqldelight-idea-plugin/build.gradle b/sqldelight-idea-plugin/build.gradle index 830cc402de8..c7e8dbfe13d 100644 --- a/sqldelight-idea-plugin/build.gradle +++ b/sqldelight-idea-plugin/build.gradle @@ -1,4 +1,4 @@ -import org.jetbrains.intellij.tasks.RunPluginVerifierTask.FailureLevel +import org.jetbrains.intellij.platform.gradle.tasks.VerifyPluginTask.FailureLevel import app.cash.sqldelight.toolchain.BugsnagKey plugins { @@ -9,50 +9,63 @@ plugins { id("app.cash.sqldelight.toolchain.compiler") } -intellij { - updateSinceUntilBuild = false - - // Comment version and uncomment localPath to test a local IDE build. - version = "IC-${libs.versions.idea.get()}" -// localPath = "/Applications/Android Studio.app" - - pluginName = 'SQLDelight' - plugins = [ - "org.jetbrains.kotlin", - "com.intellij.gradle", - "com.intellij.java", - "org.jetbrains.android" - ] - if (!project.version.endsWith("SNAPSHOT")) { - tasks.named('patchPluginXml') { - changeNotes = (provider { changelog.get(project.version).toHTML() }) +intellijPlatform { + buildSearchableOptions = false + + pluginConfiguration { + name = 'SQLDelight' + dependencies { + intellijPlatform { + intellijIdeaCommunity(libs.versions.idea, false) + bundledPlugin("org.jetbrains.kotlin") + bundledPlugin("com.intellij.gradle") + bundledPlugin("com.intellij.java") + bundledPlugin("org.jetbrains.android") + + pluginVerifier() + zipSigner() + instrumentationTools() + + testFramework(org.jetbrains.intellij.platform.gradle.TestFrameworkType.Platform.INSTANCE, libs.versions.idea.get()) + testFramework(org.jetbrains.intellij.platform.gradle.TestFrameworkType.Plugin.Java.INSTANCE, libs.versions.idea.get()) + } } - } else { - tasks.named('patchPluginXml') { - version = "$VERSION_NAME-${System.currentTimeMillis()}" + if (!project.version.endsWith("SNAPSHOT")) { + tasks.named('patchPluginXml') { + changeNotes = provider { changelog.get(project.version).toHTML() } + } + } else { + tasks.named('patchPluginXml') { + version = "$VERSION_NAME-${System.currentTimeMillis()}" + } + } + ideaVersion { + sinceBuild.set("231.9392.1") + untilBuild.set(null) } } -} + pluginVerification { + // See: the verify_intellij job in .github/workflows/PR.yml + def version = providers.systemProperty("ideaVersion").getOrElse(null) + if (version != null) { + ides { + ide(org.jetbrains.intellij.platform.gradle.IntelliJPlatformType.IntellijIdeaCommunity, version) + } + } -tasks.named('runIde') { - maxHeapSize = "4g" -} + def customFailureLevel = FailureLevel.ALL + customFailureLevel.remove(FailureLevel.DEPRECATED_API_USAGES) + customFailureLevel.remove(FailureLevel.EXPERIMENTAL_API_USAGES) + customFailureLevel.remove(FailureLevel.INTERNAL_API_USAGES) + customFailureLevel.remove(FailureLevel.NOT_DYNAMIC) + customFailureLevel.remove(FailureLevel.SCHEDULED_FOR_REMOVAL_API_USAGES) -tasks.named('runPluginVerifier') { - // See: the verify_intellij job in .github/workflows/PR.yml - def version = providers.systemProperty("ideaVersion").getOrElse(null) - if (version != null) { - ideVersions = [version] + failureLevel = customFailureLevel } +} - def customFailureLevel = FailureLevel.ALL - customFailureLevel.remove(FailureLevel.DEPRECATED_API_USAGES) - customFailureLevel.remove(FailureLevel.EXPERIMENTAL_API_USAGES) - customFailureLevel.remove(FailureLevel.INTERNAL_API_USAGES) - customFailureLevel.remove(FailureLevel.NOT_DYNAMIC) - customFailureLevel.remove(FailureLevel.SCHEDULED_FOR_REMOVAL_API_USAGES) - - failureLevel = customFailureLevel +tasks.named('runIde') { + maxHeapSize = "4g" } changelog { @@ -73,7 +86,9 @@ tasks.named('publishPlugin') { } repositories { - maven { url = uri("https://repo.gradle.org/gradle/libs-releases") } + intellijPlatform { + defaultRepositories() + } } dependencies { @@ -94,11 +109,10 @@ dependencies { configurations.named("runtimeClasspath") { exclude group: "org.slf4j" exclude group: "org.jetbrains.kotlin" + exclude group: "org.jetbrains.kotlinx", module: "kotlinx-coroutines" } def bugsnagKey = tasks.register('bugsnagKey', BugsnagKey) sourceSets.main { kotlin.srcDir(bugsnagKey) } - -tasks.named('buildSearchableOptions') { enabled = false } diff --git a/sqldelight-idea-plugin/gradle.properties b/sqldelight-idea-plugin/gradle.properties index b3a104dfca5..4910976cc40 100644 --- a/sqldelight-idea-plugin/gradle.properties +++ b/sqldelight-idea-plugin/gradle.properties @@ -3,4 +3,3 @@ POM_NAME=SQLDelight IDEA Plugin POM_DESCRIPTION=IDEA plugin for generating java interfaces for sqlite files POM_PACKAGING=jar kotlin.stdlib.default.dependency=false -org.jetbrains.intellij.buildFeature.selfUpdateCheck=false diff --git a/sqldelight-idea-plugin/src/main/resources/META-INF/plugin.xml b/sqldelight-idea-plugin/src/main/resources/META-INF/plugin.xml index a7b8cc4c7e7..4e291284c63 100644 --- a/sqldelight-idea-plugin/src/main/resources/META-INF/plugin.xml +++ b/sqldelight-idea-plugin/src/main/resources/META-INF/plugin.xml @@ -3,7 +3,6 @@ SQLDelight Custom Languages Square, Inc. - com.intellij.modules.lang com.intellij.java org.jetbrains.kotlin @@ -229,6 +228,10 @@ + + + + From 59b19c56a8d70902e034d24d900040b4c4904d5f Mon Sep 17 00:00:00 2001 From: Jake Wharton Date: Thu, 12 Sep 2024 00:58:29 -0400 Subject: [PATCH 219/304] Revert "Update dependency gradle to v8.10 (#5404)" (#5457) This reverts commit 7d304159701a69f8db6a3223456e603b4251ecc6. --- gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 43504 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- sample/gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 43504 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b9530d66f5e68d973ea569d8e19de379189..2c3521197d7c4586c843d1d3e9090525f1898cde 100644 GIT binary patch delta 3889 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 delta 3990 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 delta 3990 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 wpAeHLsTu Date: Thu, 12 Sep 2024 18:32:05 +0200 Subject: [PATCH 220/304] Fix until build attribute (#5454) --- sqldelight-idea-plugin/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqldelight-idea-plugin/build.gradle b/sqldelight-idea-plugin/build.gradle index c7e8dbfe13d..644c632d9bd 100644 --- a/sqldelight-idea-plugin/build.gradle +++ b/sqldelight-idea-plugin/build.gradle @@ -41,7 +41,7 @@ intellijPlatform { } ideaVersion { sinceBuild.set("231.9392.1") - untilBuild.set(null) + untilBuild.set(provider { null }) } } pluginVerification { From f8459160839ffcbe5aa46bd1e486e610190c5375 Mon Sep 17 00:00:00 2001 From: Christopher Jenkins Date: Thu, 12 Sep 2024 10:45:43 -0600 Subject: [PATCH 221/304] Use ATD Image Instead (#5456) * update to use atd image instead * disable linux tests on instrumentation tests too, no point running twice * fix avd disk size * fix name of cache-cleanup (https://github.com/gradle/actions/releases/tag/v4.0.0) * Revert "Update dependency gradle to v8.10 (#5404)" This reverts commit 7d304159701a69f8db6a3223456e603b4251ecc6. * just disable caching for the matrix until clean-cache as we would always cleanup anyway --------- Co-authored-by: Jake Wharton Co-authored-by: Alec Kazakova <1675456+AlecKazakova@users.noreply.github.com> --- .github/workflows/PR.yml | 15 +++++++++------ .github/workflows/Publish-Website.yml | 2 +- .github/workflows/Release.yml | 6 +++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml index f5dba838c18..7d6969e1ea2 100644 --- a/.github/workflows/PR.yml +++ b/.github/workflows/PR.yml @@ -61,7 +61,7 @@ jobs: - name: Setup gradle uses: gradle/actions/setup-gradle@v4 with: - gradle-home-cache-cleanup: true + cache-disabled: true # Linux tests - name: Run gradle tests @@ -82,7 +82,7 @@ jobs: run: ./gradlew mingwX64Test sqldelight-idea-plugin:check --stacktrace - name: Run linux tests - if: matrix.os == 'ubuntu-latest' + if: matrix.os == 'ubuntu-latest' && matrix.job == 'test' # not parallel otherwise NativeTransacterTest fails. run: ./gradlew linuxX64Test --no-parallel -x dokkaHtml @@ -97,8 +97,11 @@ jobs: if: matrix.os == 'ubuntu-latest' && matrix.job == 'instrumentation' uses: reactivecircus/android-emulator-runner@v2 with: - api-level: 29 - arch: x86_64 + api-level: 30 + arch: x86 + target: aosp_atd + profile: Nexus One + disk-size: 2048M script: ./gradlew connectedCheck :sqldelight-gradle-plugin:instrumentationTest --stacktrace --parallel -x dokkaHtml # ios tests @@ -150,7 +153,7 @@ jobs: java-version-file: .github/workflows/.ci-java-version - uses: gradle/actions/setup-gradle@v4 with: - gradle-home-cache-cleanup: true + cache-cleanup: always - run: ./gradlew -p sample build --stacktrace --parallel buildWebSample: @@ -165,7 +168,7 @@ jobs: java-version-file: .github/workflows/.ci-java-version - uses: gradle/actions/setup-gradle@v4 with: - gradle-home-cache-cleanup: true + cache-cleanup: always - run: ./gradlew -p sample-web kotlinUpgradeYarnLock build --stacktrace --parallel env: diff --git a/.github/workflows/Publish-Website.yml b/.github/workflows/Publish-Website.yml index 3b1eb73094c..60e1795f89c 100644 --- a/.github/workflows/Publish-Website.yml +++ b/.github/workflows/Publish-Website.yml @@ -35,7 +35,7 @@ jobs: - name: Setup gradle uses: gradle/actions/setup-gradle@v4 with: - gradle-home-cache-cleanup: true + cache-cleanup: always - name: Set up Python uses: actions/setup-python@v5 diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index 7825f028945..e5cad94fdf4 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -33,7 +33,7 @@ jobs: - name: Setup gradle uses: gradle/actions/setup-gradle@v4 with: - gradle-home-cache-cleanup: true + cache-cleanup: always - name: Publish the macOS artifacts if: matrix.os == 'macOS-14' @@ -84,7 +84,7 @@ jobs: - name: Setup gradle uses: gradle/actions/setup-gradle@v4 with: - gradle-home-cache-cleanup: true + cache-cleanup: always - name: Publish the plugin artifacts env: @@ -122,7 +122,7 @@ jobs: - name: Setup gradle uses: gradle/actions/setup-gradle@v4 with: - gradle-home-cache-cleanup: true + cache-cleanup: always - name: Setup .npmrc run: echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > .npmrc From 6cd2427f42b4606a5a1ea9eea7ff505cb75e2b3b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2024 17:18:49 +0000 Subject: [PATCH 222/304] Update plugin shadow to v8.3.1 (#5453) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 39d05626bc3..e10033075de 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -107,6 +107,6 @@ grammarKitComposer = { id = "com.alecstrong.grammar.kit.composer", version = "0. publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } -shadow = "com.gradleup.shadow:8.3.0" +shadow = "com.gradleup.shadow:8.3.1" ksp = { id = "com.google.devtools.ksp", version = "2.0.0-1.0.21" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.3" } From b977c89756409418568eaf0ebb751e16ca90e605 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2024 17:54:10 +0000 Subject: [PATCH 223/304] Update plugin ksp to v2.0.20-1.0.25 (#5269) * Update plugin ksp to v2.0.20-1.0.25 * Update libs.versions.toml * Update yarn lock file, remove outdated property and add changed podspec --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Philip Wedemann <22521688+hfhbd@users.noreply.github.com> Co-authored-by: Jake Wharton --- gradle.properties | 2 - gradle/libs.versions.toml | 4 +- kotlin-js-store/yarn.lock | 231 +++++++++++++++++++---------------- sample/common/common.podspec | 13 +- 4 files changed, 138 insertions(+), 112 deletions(-) diff --git a/gradle.properties b/gradle.properties index 61970df5533..28d831d33ab 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,8 +20,6 @@ SONATYPE_AUTOMATIC_RELEASE=true android.useAndroidX=true -kotlin.js.compiler=ir - kotlin.mpp.stability.nowarn=true kotlin.native.ignoreDisabledTargets=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e10033075de..145a85aa7a6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -kotlin = "2.0.0" +kotlin = "2.0.20" dokka = "1.9.20" kotlinCoroutines = "1.8.1" idea = "231.9392.1" # Hedgehog | 2023.1.1 Patch 2 (see https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html) @@ -108,5 +108,5 @@ publish = { id = "com.vanniktech.maven.publish", version = "0.20.0" } spotless = { id = "com.diffplug.spotless", version = "6.25.0" } changelog = { id = "org.jetbrains.changelog", version = "2.0.0" } shadow = "com.gradleup.shadow:8.3.1" -ksp = { id = "com.google.devtools.ksp", version = "2.0.0-1.0.21" } +ksp = { id = "com.google.devtools.ksp", version = "2.0.20-1.0.25" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.16.3" } diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index 52462732bbb..0b3e93d857f 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -299,10 +299,10 @@ accepts@~1.3.4: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== acorn@^8.7.1: version "8.8.1" @@ -329,10 +329,10 @@ ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-regex@^5.0.1: version "5.0.1" @@ -417,7 +417,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browser-stdout@1.3.1: +browser-stdout@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== @@ -460,7 +460,7 @@ chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@3.5.3, chokidar@^3.5.1: +chokidar@^3.5.1: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -475,6 +475,21 @@ chokidar@3.5.3, chokidar@^3.5.1: optionalDependencies: fsevents "~2.3.2" +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" @@ -596,13 +611,20 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4.3.4, debug@^4.3.4, debug@~4.3.2, debug@~4.3.4: +debug@^4.3.4, debug@~4.3.2, debug@~4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + debug@~4.3.1: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" @@ -625,10 +647,10 @@ di@^0.0.1: resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== dir-glob@^3.0.1: version "3.0.1" @@ -688,10 +710,10 @@ engine.io@~6.5.2: engine.io-parser "~5.2.1" ws "~8.11.0" -enhanced-resolve@^5.16.0: - version "5.16.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz#e8bc63d51b826d6f1cbc0a150ecb5a8b0c62e567" - integrity sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw== +enhanced-resolve@^5.17.0: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -726,7 +748,7 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@4.0.0: +escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== @@ -824,14 +846,6 @@ finalhandler@1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - find-up@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -840,6 +854,14 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -908,17 +930,6 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - glob@^7.1.3, glob@^7.1.7: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" @@ -931,6 +942,17 @@ glob@^7.1.3, glob@^7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + globby@^11.0.3: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -965,7 +987,7 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -he@1.2.0: +he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -1112,7 +1134,7 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -js-yaml@4.1.0: +js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -1227,7 +1249,7 @@ lodash@^4.17.15, lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@4.1.0: +log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -1286,13 +1308,6 @@ mime@^2.5.2: resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - minimatch@^3.0.4: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -1300,7 +1315,7 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: +minimatch@^5.0.1, minimatch@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== @@ -1331,31 +1346,31 @@ mkdirp@^0.5.5: dependencies: minimist "^1.2.6" -mocha@10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.3.0.tgz#0e185c49e6dccf582035c05fa91084a4ff6e3fe9" - integrity sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "8.1.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" +mocha@10.7.0: + version "10.7.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.0.tgz#9e5cbed8fa9b37537a25bd1f7fb4f6fc45458b9a" + integrity sha512-v8/rBWr2VO5YkspYINnvu81inSz2y3ODJrhO175/Exzor1RcEZZkizgE2A+w/CAXXoESS8Kys5E62dOHGHzULA== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" ms@2.0.0: version "2.0.0" @@ -1367,7 +1382,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -1630,7 +1645,7 @@ schema-utils@^3.2.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -serialize-javascript@6.0.0, serialize-javascript@^6.0.0: +serialize-javascript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== @@ -1644,6 +1659,13 @@ serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -1763,18 +1785,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-json-comments@3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@8.1.1, supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -1782,6 +1797,13 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -1840,10 +1862,10 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typescript@5.4.3: - version "5.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" - integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== +typescript@5.5.4: + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== ua-parser-js@^0.7.30: version "0.7.31" @@ -1937,10 +1959,10 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@5.91.0: - version "5.91.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" - integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== +webpack@5.93.0: + version "5.93.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.93.0.tgz#2e89ec7035579bdfba9760d26c63ac5c3462a5e5" + integrity sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" @@ -1948,10 +1970,10 @@ webpack@5.91.0: "@webassemblyjs/wasm-edit" "^1.12.1" "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.9.0" + acorn-import-attributes "^1.9.5" browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.16.0" + enhanced-resolve "^5.17.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -1986,10 +2008,10 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== wrap-ansi@^7.0.0: version "7.0.0" @@ -2015,17 +2037,12 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: +yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-unparser@2.0.0: +yargs-unparser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== @@ -2035,7 +2052,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0, yargs@^16.1.1: +yargs@^16.1.1, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== diff --git a/sample/common/common.podspec b/sample/common/common.podspec index fd533533c45..3922f36a3be 100644 --- a/sample/common/common.podspec +++ b/sample/common/common.podspec @@ -26,6 +26,17 @@ Pod::Spec.new do |spec| 'ENABLE_USER_SCRIPT_SANDBOXING' => 'NO', } + if !Dir.exist?('build/cocoapods/framework/common.framework') || Dir.empty?('build/cocoapods/framework/common.framework') + raise " + + Kotlin framework 'common' doesn't exist yet, so a proper Xcode project can't be generated. + 'pod install' should be executed after running ':generateDummyFramework' Gradle task: + + ./gradlew :common:generateDummyFramework + + Alternatively, proper pod installation is performed during Gradle sync in the IDE (if Podfile location is set)" + end + spec.pod_target_xcconfig = { 'KOTLIN_PROJECT_PATH' => ':common', 'PRODUCT_MODULE_NAME' => 'common', @@ -51,4 +62,4 @@ Pod::Spec.new do |spec| } ] -end \ No newline at end of file +end From cda491511419e8ac14fabcfc47786b802ff8b655 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 12 Sep 2024 14:36:22 -0400 Subject: [PATCH 224/304] Update plugin com.gradle.develocity to v3.18.1 (#5452) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- sample-web/settings.gradle | 2 +- sample/settings.gradle | 2 +- settings.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sample-web/settings.gradle b/sample-web/settings.gradle index 55e35417b8b..db0daf13d48 100644 --- a/sample-web/settings.gradle +++ b/sample-web/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.18" + id "com.gradle.develocity" version "3.18.1" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/sample/settings.gradle b/sample/settings.gradle index e1ff3afb92c..c74fff3d7de 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -17,7 +17,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.18" + id "com.gradle.develocity" version "3.18.1" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } diff --git a/settings.gradle b/settings.gradle index e18fd0d1189..d1619c308d6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,7 +9,7 @@ pluginManagement { } plugins { - id "com.gradle.develocity" version "3.18" + id "com.gradle.develocity" version "3.18.1" id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" } From 0adf9a2260a1c1b817cabdea718ec4433e06bb17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?griff=20=D1=96=E2=8A=99?= <346896+griffio@users.noreply.github.com> Date: Thu, 12 Sep 2024 19:37:16 +0100 Subject: [PATCH 225/304] Fix 5122 add PostgreSql lateral join operator for subquery (#5337) * Fix 5122 Add LATERAL to grammar LATERAL is used in two positions in the join_operator - for table subqueries and for table joins Add Mixin to expose table/columns in a subquery - avoid recursion stackoverflow if child is same as subquery * Lateral Tests Lateral Tests Fixture test Integration test InterfaceGeneration test --- .../postgresql/grammar/PostgreSql.bnf | 22 ++++ .../grammar/mixins/SqlJoinClauseMixin.kt | 22 ++++ .../fixtures_postgresql/lateral/Test.s | 98 +++++++++++++++++ .../core/queries/InterfaceGeneration.kt | 102 ++++++++++++++++++ .../postgresql/integration/Lateral.sq | 48 +++++++++ .../postgresql/integration/PostgreSqlTest.kt | 13 +++ 6 files changed, 305 insertions(+) create mode 100644 dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlJoinClauseMixin.kt create mode 100644 dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/lateral/Test.s create mode 100644 sqldelight-gradle-plugin/src/test/integration-postgresql/src/main/sqldelight/app/cash/sqldelight/postgresql/integration/Lateral.sq diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf index 7f0e9fe3d8d..73f9b22c6e8 100644 --- a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/PostgreSql.bnf @@ -25,6 +25,7 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.CONFLICT" "static com.alecstrong.sql.psi.core.psi.SqlTypes.CONSTRAINT" "static com.alecstrong.sql.psi.core.psi.SqlTypes.CREATE" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.CROSS" "static com.alecstrong.sql.psi.core.psi.SqlTypes.CURRENT_DATE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.CURRENT_TIME" "static com.alecstrong.sql.psi.core.psi.SqlTypes.CURRENT_TIMESTAMP" @@ -52,8 +53,11 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.IS" "static com.alecstrong.sql.psi.core.psi.SqlTypes.IGNORE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.INDEX" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.INDEXED" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.INNER" "static com.alecstrong.sql.psi.core.psi.SqlTypes.INSERT" "static com.alecstrong.sql.psi.core.psi.SqlTypes.INTO" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.JOIN" "static com.alecstrong.sql.psi.core.psi.SqlTypes.KEY" "static com.alecstrong.sql.psi.core.psi.SqlTypes.LIKE" "static com.alecstrong.sql.psi.core.psi.SqlTypes.LIMIT" @@ -61,6 +65,7 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.MATCH" "static com.alecstrong.sql.psi.core.psi.SqlTypes.MINUS" "static com.alecstrong.sql.psi.core.psi.SqlTypes.MULTIPLY" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.NATURAL" "static com.alecstrong.sql.psi.core.psi.SqlTypes.NO" "static com.alecstrong.sql.psi.core.psi.SqlTypes.NOT" "static com.alecstrong.sql.psi.core.psi.SqlTypes.NOTHING" @@ -69,6 +74,7 @@ "static com.alecstrong.sql.psi.core.psi.SqlTypes.ON" "static com.alecstrong.sql.psi.core.psi.SqlTypes.OR" "static com.alecstrong.sql.psi.core.psi.SqlTypes.ORDER" + "static com.alecstrong.sql.psi.core.psi.SqlTypes.OUTER" "static com.alecstrong.sql.psi.core.psi.SqlTypes.PARTITION" "static com.alecstrong.sql.psi.core.psi.SqlTypes.PLUS" "static com.alecstrong.sql.psi.core.psi.SqlTypes.PRIMARY" @@ -106,9 +112,12 @@ overrides ::= type_name | insert_stmt | update_stmt_limited | generated_clause + | join_operator + | join_clause | result_column | alter_table_add_column | alter_table_rules + | table_or_subquery | compound_select_stmt | extension_expr | extension_stmt @@ -410,6 +419,19 @@ select_stmt ::= SELECT ( distinct_on_expr | [ DISTINCT | ALL ] ) {result_column} pin = 1 } +lateral ::= 'LATERAL' +join_operator ::= ( COMMA [ lateral ] + | [ NATURAL ] [ ( {left_join_operator} | {right_join_operator} | {full_join_operator} ) [ OUTER ] | INNER | CROSS ] JOIN [ lateral ] ) { + extends = "com.alecstrong.sql.psi.core.psi.impl.SqlJoinOperatorImpl" + implements = "com.alecstrong.sql.psi.core.psi.SqlJoinOperator" + override = true +} + +join_clause ::= {table_or_subquery} ( {join_operator} {table_or_subquery} [ {join_constraint} ] ) * { + mixin = "app.cash.sqldelight.dialects.postgresql.grammar.mixins.SqlJoinClauseMixin" + override = true +} + compound_select_stmt ::= [ {with_clause} ] {select_stmt} ( {compound_operator} {select_stmt} ) * [ ORDER BY {ordering_term} ( COMMA {ordering_term} ) * ] [ LIMIT {limiting_term} ] [ ( OFFSET | COMMA ) {limiting_term} ] [ FOR UPDATE [ 'SKIP' 'LOCKED' ] ] { extends = "com.alecstrong.sql.psi.core.psi.impl.SqlCompoundSelectStmtImpl" implements = "com.alecstrong.sql.psi.core.psi.SqlCompoundSelectStmt" diff --git a/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlJoinClauseMixin.kt b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlJoinClauseMixin.kt new file mode 100644 index 00000000000..ef942ec5c86 --- /dev/null +++ b/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/grammar/mixins/SqlJoinClauseMixin.kt @@ -0,0 +1,22 @@ +package app.cash.sqldelight.dialects.postgresql.grammar.mixins + +import app.cash.sqldelight.dialects.postgresql.grammar.psi.PostgreSqlTypes +import com.alecstrong.sql.psi.core.psi.QueryElement +import com.alecstrong.sql.psi.core.psi.impl.SqlJoinClauseImpl +import com.intellij.lang.ASTNode +import com.intellij.psi.PsiElement +import com.intellij.psi.util.elementType + +internal open class SqlJoinClauseMixin(node: ASTNode) : SqlJoinClauseImpl(node) { + + override fun queryAvailable(child: PsiElement): Collection { + return if (joinOperatorList + .flatMap { it.children.toList() } + .find { it.elementType == PostgreSqlTypes.LATERAL } != null + ) { + tableOrSubqueryList.takeWhile { it != child }.flatMap { it.queryExposed() } + } else { + super.queryAvailable(child) + } + } +} diff --git a/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/lateral/Test.s b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/lateral/Test.s new file mode 100644 index 00000000000..6d1dfe53ff4 --- /dev/null +++ b/dialects/postgresql/src/testFixtures/resources/fixtures_postgresql/lateral/Test.s @@ -0,0 +1,98 @@ +CREATE TABLE A ( + b_id INTEGER +); + +CREATE TABLE B ( + id INTEGER +); + +SELECT * FROM A, LATERAL (SELECT * FROM B WHERE B.id = A.b_id) AB; + +CREATE TABLE Author ( + id INTEGER PRIMARY KEY, + name TEXT +); + +CREATE TABLE Genre ( + id INTEGER PRIMARY KEY, + name TEXT +); + +CREATE TABLE Book ( + id INTEGER PRIMARY KEY, + title TEXT, + author_id INTEGER REFERENCES Author(id), + genre_id INTEGER REFERENCES Genre(id) +); + +SELECT + Author.name AS author_name, + Genre.name AS genre_name, + book_count +FROM + Author, + Genre, + LATERAL ( + SELECT + COUNT(*) AS book_count + FROM + Book + WHERE + Book.author_id = Author.id + AND Book.genre_id = Genre.id + ) AS book_counts; + +CREATE TABLE Kickstarter_Data ( + pledged INTEGER, + fx_rate NUMERIC, + backers_count INTEGER, + launched_at NUMERIC, + deadline NUMERIC, + goal INTEGER +); + +SELECT + pledged_usd, + avg_pledge_usd, + duration, + (usd_from_goal / duration) AS usd_needed_daily +FROM Kickstarter_Data, + LATERAL (SELECT pledged / fx_rate AS pledged_usd) pu, + LATERAL (SELECT pledged_usd / backers_count AS avg_pledge_usd) apu, + LATERAL (SELECT goal / fx_rate AS goal_usd) gu, + LATERAL (SELECT goal_usd - pledged_usd AS usd_from_goal) ufg, + LATERAL (SELECT (deadline - launched_at) / 86400.00 AS duration) dr; + +CREATE TABLE Regions ( + id INTEGER, + name VARCHAR(255) +); + +CREATE TABLE SalesPeople ( + id INTEGER, + full_name VARCHAR(255), + home_region_id INTEGER +); + +CREATE TABLE Sales ( + id INTEGER, + amount NUMERIC, + product_id INTEGER, + salesperson_id INTEGER, + region_id INTEGER +); + +SELECT + sp.id salesperson_id, + sp.full_name, + sp.home_region_id, + rg.name AS home_region_name, + home_region_sales.total_sales +FROM SalesPeople sp + JOIN Regions rg ON sp.home_region_id = rg.id + JOIN LATERAL ( + SELECT SUM(amount) AS total_sales + FROM Sales s + WHERE s.salesperson_id = sp.id + AND s.region_id = sp.home_region_id + ) home_region_sales ON TRUE; diff --git a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt index ab7a309ed10..e2be5ec40bd 100644 --- a/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt +++ b/sqldelight-compiler/src/test/kotlin/app/cash/sqldelight/core/queries/InterfaceGeneration.kt @@ -1394,6 +1394,108 @@ class InterfaceGeneration { ) } + @Test + fun `postgres lateral sub select has correct result columns`() { + val result = FixtureCompiler.compileSql( + """ + |CREATE TABLE Test ( + | p INTEGER, + | f NUMERIC, + | b INTEGER, + | l NUMERIC, + | d NUMERIC, + | g INTEGER + |); + | + |select: + |SELECT * + |FROM Test, + |LATERAL (SELECT p / f AS pf) _pf, + |LATERAL (SELECT pf / b AS pfb) _pfb, + |LATERAL (SELECT g / f AS gf) _gf, + |LATERAL (SELECT gf - pf AS gfpf) _gfpf, + |LATERAL (SELECT (d - l) / 60000.00 AS dl) _dl; + """.trimMargin(), + temporaryFolder, + fileName = "Lateral.sq", + overrideDialect = PostgreSqlDialect(), + ) + assertThat(result.errors).isEmpty() + val generatedInterface = result.compilerOutput.get(File(result.outputDirectory, "com/example/LateralQueries.kt")) + assertThat(generatedInterface).isNotNull() + assertThat(generatedInterface.toString()).isEqualTo( + """ + |package com.example + | + |import app.cash.sqldelight.Query + |import app.cash.sqldelight.TransacterImpl + |import app.cash.sqldelight.db.SqlDriver + |import app.cash.sqldelight.driver.jdbc.JdbcCursor + |import java.math.BigDecimal + |import kotlin.Any + |import kotlin.Int + | + |public class LateralQueries( + | driver: SqlDriver, + |) : TransacterImpl(driver) { + | public fun select(mapper: ( + | p: Int?, + | f: BigDecimal?, + | b: Int?, + | l: BigDecimal?, + | d: BigDecimal?, + | g: Int?, + | pf: BigDecimal?, + | pfb: BigDecimal?, + | gf: BigDecimal?, + | gfpf: BigDecimal?, + | dl: BigDecimal?, + | ) -> T): Query = Query(89_549_764, arrayOf("Test"), driver, "Lateral.sq", "select", ""${'"'} + | |SELECT Test.p, Test.f, Test.b, Test.l, Test.d, Test.g, pf, pfb, gf, gfpf, dl + | |FROM Test, + | |LATERAL (SELECT p / f AS pf) _pf, + | |LATERAL (SELECT pf / b AS pfb) _pfb, + | |LATERAL (SELECT g / f AS gf) _gf, + | |LATERAL (SELECT gf - pf AS gfpf) _gfpf, + | |LATERAL (SELECT (d - l) / 60000.00 AS dl) _dl + | ""${'"'}.trimMargin()) { cursor -> + | check(cursor is JdbcCursor) + | mapper( + | cursor.getInt(0), + | cursor.getBigDecimal(1), + | cursor.getInt(2), + | cursor.getBigDecimal(3), + | cursor.getBigDecimal(4), + | cursor.getInt(5), + | cursor.getBigDecimal(6), + | cursor.getBigDecimal(7), + | cursor.getBigDecimal(8), + | cursor.getBigDecimal(9), + | cursor.getBigDecimal(10) + | ) + | } + | + | public fun select(): Query