Skip to content

Commit

Permalink
Merge pull request #9 from manriif/dev
Browse files Browse the repository at this point in the history
Postpone build script misconfiguration at task execution
  • Loading branch information
manriif authored Jun 29, 2024
2 parents 179653b + 0e97740 commit 8f67674
Show file tree
Hide file tree
Showing 10 changed files with 151 additions and 88 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 +101,8 @@ internal fun SupabaseFunctionExtension.setupConvention(project: Project) {
functionName.convention(project.name)
verifyJwt.convention(true)
importMap.convention(true)

packageName.convention(project.provider {
error("packageName is not set, please provide the package name of the kotlin main function.")
})
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,12 @@ package io.github.manriif.supabase.functions.kmp
import io.github.manriif.supabase.functions.COROUTINES_VERSION
import io.github.manriif.supabase.functions.COROUTINES_VERSION_GRADLE_PROPERTY
import io.github.manriif.supabase.functions.SUPABASE_FUNCTION_PLUGIN_NAME
import io.github.manriif.supabase.functions.task.SupabaseFunctionCopyKotlinTask
import io.github.manriif.supabase.functions.task.TASK_GENERATE_BRIDGE
import io.github.manriif.supabase.functions.util.postponeErrorOnTaskInvocation
import org.gradle.api.Project
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.JsModuleKind
import org.jetbrains.kotlin.gradle.dsl.JsSourceMapEmbedMode
import org.jetbrains.kotlin.gradle.dsl.JsSourceMapNamesPolicy
Expand All @@ -36,7 +39,6 @@ import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget

internal fun Project.setupKotlinMultiplatform(kmpExtension: KotlinMultiplatformExtension) {
kmpExtension.targets.withType<KotlinJsIrTarget>().configureEach {
ensureMeetRequirements()
configureCompilation()
}

Expand All @@ -48,57 +50,66 @@ internal fun Project.setupKotlinMultiplatform(kmpExtension: KotlinMultiplatformE
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${coroutinesVersion}")
}
}

afterEvaluate {
kmpExtension.targets.withType<KotlinJsIrTarget>().forEach { target ->
target.checkUserConfiguration()
}
}
}

private fun KotlinJsIrTarget.configureCompilation() {
@OptIn(ExperimentalKotlinGradlePluginApi::class)
compilerOptions {
// [KT-47968](https://youtrack.jetbrains.com/issue/KT-47968/KJS-IR-Debug-in-external-tool-cant-step-into-library-function-with-available-sources)
// [KT-49757](https://youtrack.jetbrains.com/issue/KT-49757/Kotlin-JS-support-sourceMapEmbedSources-setting-by-IR-backend)
sourceMap.set(true)
sourceMapNamesPolicy.set(JsSourceMapNamesPolicy.SOURCE_MAP_NAMES_POLICY_FQ_NAMES)
sourceMapEmbedSources.set(JsSourceMapEmbedMode.SOURCE_MAP_SOURCE_CONTENT_ALWAYS)
}

compilations.named(KotlinCompilation.MAIN_COMPILATION_NAME) {
compileTaskProvider.configure {
dependsOn(TASK_GENERATE_BRIDGE)
}
}
}

private fun KotlinJsIrTarget.ensureMeetRequirements() {
private fun KotlinJsIrTarget.checkUserConfiguration() {
if (isBrowserConfigured) {
project.logger.warn(
"Browser execution environment is not supported by " +
"`$SUPABASE_FUNCTION_PLUGIN_NAME` plugin."
)
}

val granularity = project.findProperty("kotlin.js.ir.output.granularity")?.toString()

if (!(granularity.isNullOrBlank() || granularity == "per-module")) {
error(
project.postponeErrorOnTaskInvocation<SupabaseFunctionCopyKotlinTask>(
"Only `per-module` JS IR output granularity is supported " +
"by `$SUPABASE_FUNCTION_PLUGIN_NAME` plugin. " +
"Current granularity is `$granularity`."
)
}

if (isBrowserConfigured) {
error(
"Browser execution environment is not supported by " +
"`$SUPABASE_FUNCTION_PLUGIN_NAME` plugin."
val compilation = compilations.findByName(KotlinCompilation.MAIN_COMPILATION_NAME)

// Module kind is not set when using new compiler option DSL, fallback to deprecated one
val options = @Suppress("DEPRECATION") compilation?.compilerOptions?.options
val moduleKind = options?.moduleKind?.orNull

if (moduleKind != JsModuleKind.MODULE_ES) {
project.postponeErrorOnTaskInvocation<SupabaseFunctionCopyKotlinTask>(
"Plugin `supabase-function` only supports ES module kind. " +
"Current module kind is `$moduleKind`."
)
}

if (!isNodejsConfigured) {
error(
project.postponeErrorOnTaskInvocation<SupabaseFunctionCopyKotlinTask>(
"Node.js execution environment is a requirement " +
"for `$SUPABASE_FUNCTION_PLUGIN_NAME` plugin."
)
}
}

private fun KotlinJsIrTarget.configureCompilation() {
compilations.named(KotlinCompilation.MAIN_COMPILATION_NAME) {
// Module kind is not set when using new compiler option DSL, fallback to deprecated one
@Suppress("DEPRECATION")
compilerOptions.configure {
val kind = moduleKind.orNull

if (kind != JsModuleKind.MODULE_ES) {
error(
"Plugin `supabase-function` only supports ES module kind. " +
"Current module kind is $kind."
)
}

// [KT-47968](https://youtrack.jetbrains.com/issue/KT-47968/KJS-IR-Debug-in-external-tool-cant-step-into-library-function-with-available-sources)
// [KT-49757](https://youtrack.jetbrains.com/issue/KT-49757/Kotlin-JS-support-sourceMapEmbedSources-setting-by-IR-backend)
sourceMap.set(true)
sourceMapNamesPolicy.set(JsSourceMapNamesPolicy.SOURCE_MAP_NAMES_POLICY_FQ_NAMES)
sourceMapEmbedSources.set(JsSourceMapEmbedMode.SOURCE_MAP_SOURCE_CONTENT_ALWAYS)
}

compileTaskProvider.configure {
dependsOn(TASK_GENERATE_BRIDGE)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,14 @@ import io.github.manriif.supabase.functions.IMPORT_MAP_TEMPLATE_FILE_NAME
import io.github.manriif.supabase.functions.error.SupabaseFunctionImportMapTemplateException
import io.github.manriif.supabase.functions.supabase.supabaseAllFunctionsDirFile
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.IgnoreEmptyDirectories
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
Expand All @@ -49,18 +51,17 @@ import java.io.File
@CacheableTask
abstract class SupabaseFunctionAggregateImportMapTask : DefaultTask() {

@get:InputDirectory
@get:IgnoreEmptyDirectories
@get:InputFiles
@get:PathSensitive(PathSensitivity.RELATIVE)
internal abstract val importMapsDir: DirectoryProperty
internal abstract val importMapDirs: ConfigurableFileCollection

@get:Internal
internal abstract val supabaseDir: DirectoryProperty

@get:InputFile
@get:Optional
@get:PathSensitive(PathSensitivity.RELATIVE)
internal val importMapTemplateFile: File
get() = supabaseAllFunctionsDirFile(supabaseDir, IMPORT_MAP_TEMPLATE_FILE_NAME)
internal abstract val importMapTemplateFile: RegularFileProperty

@get:OutputFile
internal val aggregatedImportMapFile: File
Expand All @@ -72,9 +73,11 @@ abstract class SupabaseFunctionAggregateImportMapTask : DefaultTask() {
.setPrettyPrinting()
.create()

val importMap = if (importMapTemplateFile.exists() && importMapTemplateFile.isFile) {
val template = importMapTemplateFile.orNull?.asFile

val importMap = if (template?.exists() == true && template.isFile) {
try {
JsonParser.parseReader(importMapTemplateFile.reader()).asJsonObject
JsonParser.parseReader(template.reader()).asJsonObject
} catch (throwable: Throwable) {
throw SupabaseFunctionImportMapTemplateException(
message = "Failed to load $IMPORT_MAP_TEMPLATE_FILE_NAME",
Expand All @@ -96,7 +99,7 @@ abstract class SupabaseFunctionAggregateImportMapTask : DefaultTask() {
val imports = importMap.getAsJsonObject(IMPORT_MAP_JSON_IMPORTS)
val scopes = importMap.getAsJsonObject(IMPORT_MAP_JSON_SCOPES)

importMapsDir.get().asFileTree
importMapDirs.asFileTree
.matching {
include { file ->
!file.isDirectory && file.name.endsWith(".json")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ import java.io.File
import javax.inject.Inject

/**
* Task responsible for copying generated js code into supabase function directory.
* Task responsible for copying js sources into supabase function directory.
*/
@CacheableTask
abstract class SupabaseFunctionCopyJsTask : DefaultTask() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,15 @@ import io.github.manriif.supabase.functions.JS_SOURCES_INPUT_DIR
import io.github.manriif.supabase.functions.kmp.JsDependency
import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Nested
import org.gradle.api.tasks.Optional
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
Expand Down Expand Up @@ -64,9 +66,10 @@ abstract class SupabaseFunctionGenerateImportMapTask : DefaultTask() {
@get:Internal
internal abstract val importMapsDir: DirectoryProperty

@get:InputDirectory
@get:InputFile
@get:Optional
@get:PathSensitive(PathSensitivity.RELATIVE)
internal abstract val packageJsonDir: DirectoryProperty
internal abstract val packageJsonFile: RegularFileProperty

@get:Input
internal abstract val functionName: Property<String>
Expand Down Expand Up @@ -94,8 +97,7 @@ abstract class SupabaseFunctionGenerateImportMapTask : DefaultTask() {

private fun createFunctionImports(): JsonObject {
val imports = JsonObject()
val packageJsonFile = packageJsonDir.file("package.json").get().asFile
val packageJson = fromSrcPackageJson(packageJsonFile) ?: return imports
val packageJson = fromSrcPackageJson(packageJsonFile.orNull?.asFile) ?: return imports

packageJson.dependencies.forEach { (packageName, version) ->
imports.addProperty(packageName, "npm:$packageName@$version")
Expand Down
Loading

0 comments on commit 8f67674

Please sign in to comment.