diff --git a/drivers/sqljs-driver/build.gradle b/drivers/sqljs-driver/build.gradle index b76674117f0..80a725cb3fb 100644 --- a/drivers/sqljs-driver/build.gradle +++ b/drivers/sqljs-driver/build.gradle @@ -38,6 +38,3 @@ kotlin { } apply from: "$rootDir/gradle/gradle-mvn-push.gradle" - -// https://github.com/Kotlin/dokka/issues/1455 -tasks.getByName("dokkaGfm").dependsOn(tasks.getByName("build")) 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 eaee8325840..4a24c8cf836 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 @@ -27,6 +27,7 @@ import org.gradle.api.artifacts.Dependency import org.gradle.tooling.provider.model.ToolingModelBuilder import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.gradle.util.GradleVersion +import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet import java.util.concurrent.atomic.AtomicBoolean @@ -65,6 +66,7 @@ abstract class SqlDelightPlugin : Plugin { project.plugins.withId("org.jetbrains.kotlin.multiplatform", kotlinPluginHandler) project.plugins.withId("org.jetbrains.kotlin.android", kotlinPluginHandler) project.plugins.withId("org.jetbrains.kotlin.jvm", kotlinPluginHandler) + project.plugins.withId("org.jetbrains.kotlin.js", kotlinPluginHandler) project.plugins.withId("kotlin2js", kotlinPluginHandler) project.afterEvaluate { @@ -81,6 +83,7 @@ abstract class SqlDelightPlugin : Plugin { } val isMultiplatform = project.plugins.hasPlugin("org.jetbrains.kotlin.multiplatform") + val isJsOnly = if (isMultiplatform) false else project.plugins.hasPlugin("org.jetbrains.kotlin.js") val needsAsyncRuntime = extension.databases.any { it.generateAsync } val runtimeDependencies = mutableListOf().apply { @@ -97,6 +100,13 @@ abstract class SqlDelightPlugin : Plugin { project.configurations.getByName(sourceSet.apiConfigurationName) .dependencies.addAll(runtimeDependencies) } + isJsOnly -> { + val sourceSets = + project.extensions.getByType(KotlinJsProjectExtension::class.java).sourceSets + val sourceSet = (sourceSets.getByName("main") as DefaultKotlinSourceSet) + project.configurations.getByName(sourceSet.apiConfigurationName) + .dependencies.addAll(runtimeDependencies) + } else -> { project.configurations.getByName("api").dependencies.addAll(runtimeDependencies) } diff --git a/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/kotlin/SourceRoots.kt b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/kotlin/SourceRoots.kt index 22927d42cd3..4fd7bbd297c 100644 --- a/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/kotlin/SourceRoots.kt +++ b/sqldelight-gradle-plugin/src/main/kotlin/app/cash/sqldelight/gradle/kotlin/SourceRoots.kt @@ -12,6 +12,7 @@ import org.gradle.api.provider.Provider import org.gradle.api.tasks.SourceSetContainer import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskProvider +import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import java.io.File @@ -37,6 +38,11 @@ internal fun SqlDelightDatabase.sources(): List { return it.sources() } + // kotlin.js only projects + project.extensions.findByType(KotlinJsProjectExtension::class.java)?.let { + return it.sources() + } + // Android project. project.extensions.findByName("android")?.let { return (it as BaseExtension).sources() @@ -54,6 +60,17 @@ internal fun SqlDelightDatabase.sources(): List { ) } +private fun KotlinJsProjectExtension.sources(): List { + return listOf( + Source( + type = KotlinPlatformType.js, + name = "main", + sourceDirectorySet = sourceSets.getByName("main").kotlin, + sourceSets = listOf("main"), + ) + ) +} + private fun KotlinMultiplatformExtension.sources(): List { // For multiplatform we only support SQLDelight in commonMain - to support other source sets // we would need to generate expect/actual SQLDelight code which at least right now doesn't diff --git a/sqldelight-gradle-plugin/src/test/kotlin-js/build.gradle b/sqldelight-gradle-plugin/src/test/kotlin-js/build.gradle new file mode 100644 index 00000000000..1330bbed0bd --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/kotlin-js/build.gradle @@ -0,0 +1,27 @@ +buildscript { + apply from: "${projectDir.absolutePath}/../buildscript.gradle" +} + +apply plugin: 'org.jetbrains.kotlin.js' +apply plugin: 'app.cash.sqldelight' + +repositories { + maven { + url "file://${projectDir.absolutePath}/../../../../build/localMaven" + } + mavenCentral() +} + +kotlin { + js(IR) { + browser { + binaries.executable() + } + } +} + +sqldelight { + Database { + packageName = "com.sample" + } +} diff --git a/sqldelight-gradle-plugin/src/test/kotlin-js/settings.gradle b/sqldelight-gradle-plugin/src/test/kotlin-js/settings.gradle new file mode 100644 index 00000000000..b40d5d72082 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/kotlin-js/settings.gradle @@ -0,0 +1,2 @@ +apply from: "../settings.gradle" + diff --git a/sqldelight-gradle-plugin/src/test/kotlin-js/src/main/sqldelight/com/sample/Test.sq b/sqldelight-gradle-plugin/src/test/kotlin-js/src/main/sqldelight/com/sample/Test.sq new file mode 100644 index 00000000000..5b42ad62627 --- /dev/null +++ b/sqldelight-gradle-plugin/src/test/kotlin-js/src/main/sqldelight/com/sample/Test.sq @@ -0,0 +1,20 @@ +CREATE TABLE test ( + value2 TEXT NOT NULL, + value TEXT NOT NULL +); + +CREATE INDEX testIndex ON test(value); + +CREATE TRIGGER testTrigger +AFTER DELETE ON test +BEGIN +INSERT INTO test VALUES ("1", "2"); +END; + +CREATE VIEW testView AS +SELECT value +FROM test; + +select: +SELECT * +FROM test; \ No newline at end of file diff --git a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/PluginTest.kt b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/PluginTest.kt index 372b0af33e5..e80c2087820 100644 --- a/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/PluginTest.kt +++ b/sqldelight-gradle-plugin/src/test/kotlin/app/cash/sqldelight/tests/PluginTest.kt @@ -40,6 +40,23 @@ class PluginTest { assertThat(result.output).contains("BUILD SUCCESSFUL") } + @Test + fun `Applying the plugin works fine for js projects`() { + val runner = GradleRunner.create() + .withCommonConfiguration(File("src/test/kotlin-js")) + + val result = runner + .withArguments("clean", "generateMainDatabaseInterface", "--stacktrace") + .build() + assertThat(result.output).contains("BUILD SUCCESSFUL") + + // Assert the plugin added the common dependency + val dependenciesResult = runner + .withArguments("dependencies", "--stacktrace") + .build() + assertThat(dependenciesResult.output).contains("app.cash.sqldelight:runtime:") + } + @Test fun `Applying the plugin works fine for multiplatform projects`() { val runner = GradleRunner.create()