{"id":15134487,"url":"https://github.com/manriif/supabase-edge-functions-kt","last_synced_at":"2025-06-30T17:38:07.763Z","repository":{"id":245759598,"uuid":"818790032","full_name":"manriif/supabase-edge-functions-kt","owner":"manriif","description":"Build, serve and deploy Supabase Edge Functions with Kotlin and Gradle.","archived":false,"fork":false,"pushed_at":"2024-10-25T22:31:34.000Z","size":365,"stargazers_count":15,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-10-29T20:54:46.776Z","etag":null,"topics":["edge-functions","gradle-plugin","intellij","js","kotlin","kotlin-js","supabase"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/manriif.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-22T21:53:19.000Z","updated_at":"2024-10-27T17:49:56.000Z","dependencies_parsed_at":"2024-10-09T18:41:15.243Z","dependency_job_id":"63bdb2a4-fe4f-4d40-a1ea-5ff5c8b12754","html_url":"https://github.com/manriif/supabase-edge-functions-kt","commit_stats":{"total_commits":28,"total_committers":2,"mean_commits":14.0,"dds":0.0357142857142857,"last_synced_commit":"c263c8bea0a6816f02cc57f6e02a8557f11ef017"},"previous_names":["manriif/supabase-functions-kt","manriif/supabase-edge-functions-kt"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manriif%2Fsupabase-edge-functions-kt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manriif%2Fsupabase-edge-functions-kt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manriif%2Fsupabase-edge-functions-kt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manriif%2Fsupabase-edge-functions-kt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/manriif","download_url":"https://codeload.github.com/manriif/supabase-edge-functions-kt/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237811543,"owners_count":19370144,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["edge-functions","gradle-plugin","intellij","js","kotlin","kotlin-js","supabase"],"created_at":"2024-09-26T05:21:23.891Z","updated_at":"2025-02-08T13:31:17.662Z","avatar_url":"https://github.com/manriif.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"[example]: https://github.com/manriif/supabase-edge-functions-kt-example\n[website]: https://manriif.github.io/supabase-edge-functions-kt\n\n# Supabase Edge Functions Kotlin\n\nBuild, serve and deploy Supabase Edge Functions with Kotlin and Gradle.\n\nThe project aims to bring the ability of writing and deploying Supabase Edge Functions using Kotlin\nas primary programming language.\n\n[![](https://img.shields.io/badge/Stability-experimental-orange)](#project-stability)\n[![Kotlin](https://img.shields.io/badge/kotlin-2.0.21-blue.svg?logo=kotlin)](http://kotlinlang.org)\n[![IR](https://img.shields.io/badge/Kotlin%2FJS-IR_only-yellow)](https://kotl.in/jsirsupported)\n[![API](https://img.shields.io/badge/API-dokka-green)][website]\n[![Maven Central](https://img.shields.io/maven-central/v/io.github.manriif.supabase-functions/gradle-plugin?label=MavenCentral\u0026logo=apache-maven)](https://central.sonatype.com/artifact/io.github.manriif.supabase-functions/gradle-plugin)\n[![Gradle Plugin](https://img.shields.io/gradle-plugin-portal/v/io.github.manriif.supabase-functions?label=Gradle\u0026logo=gradle)](https://plugins.gradle.org/plugin/io.github.manriif.supabase-functions)\n[![MIT License](https://img.shields.io/badge/License-MIT-green.svg)](https://choosealicense.com/licenses/mit/)\n[![slack](https://img.shields.io/badge/slack-%23supabase--kt-purple.svg?logo=slack)](https://kotlinlang.slack.com/archives/C06QXPC7064)\n\n## Get started\n\nIt is recommended to use your favorite IntelliJ based IDE such as IntelliJ IDEA or Android Studio.\n\nAlso, it is recommended to have one gradle subproject per function.\nInspiration on how to structure your gradle project can be found in the [example][example].\n\n### Gradle setup\n\nIf you plan to write multiple functions, declare the plugin in the root build script:\n\n```kotlin\n// \u003croot\u003e/build.gradle.kts\n\nplugins {\n    id(\"io.github.manriif.supabase-functions\") version \"\u003clatest-version\u003e\" apply false\n}\n```\n\nApply the Gradle plugin in the build script of your project:\n\n```kotlin\n// \u003cfunction\u003e/build.gradle.kts\n\nplugins {\n    id(\"io.github.manriif.supabase-functions\")\n}\n\nsupabaseFunction {\n    packageName = \"org.example.function\" // Required, package of the main function\n    functionName = \"my-function\" // Optional, default to the project name\n    supabaseDir = file(\"supabase\") // Optional, default to \u003croot\u003e/supabase\n    envFile = file(\".env.local\") // Optional, default to \u003csupabaseDir\u003e/.env.local\n    projectRef = \"supabase-project-ref\" // Optional, no default value\n    importMap = false // Optional, default to true\n    verifyJwt = false // Optional, default to true\n}\n```\n\n### Kotlin/JS setup\n\nApply the Kotlin Multiplatform plugin in the build script of your project:\n\n```kotlin\n// \u003cfunction\u003e/build.gradle.kts\n\nplugins {\n    id(\"org.jetbrains.kotlin.multiplatform\")\n}\n\nkotlin {\n    js(IR) {\n        binaries.library() // Required\n        useEsModules() // Required\n        nodejs() // Required\n    }\n}\n```\n\n### Main function\n\nAn [example][example] repository is available\nto get you started faster.\n\nThe only requirement for the magic to work is to write an entry function that accepts a\nsingle `org.w3c.fetch.Request` parameter and returns a `org.w3c.fetch.Response`.\n\nThe function can be marked with suspend modifier.\n\nIn any kotlin source file of your project (function):\n\n```kotlin\n// src/jsMain/kotlin/org/example/function/serve.kt\n\npackage org.example.function\n\nsuspend fun serve(request: Request): Response {\n    return Response(body = \"Hello, world !\")\n}\n```\n\n### Run\n\nAfter a successful gradle sync and if you are using an IntelliJ based IDE, you will see new run configurations for your function.\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://raw.githubusercontent.com/manriif/supabase-edge-functions-kt/main/readme/run_config_dark.png\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://raw.githubusercontent.com/manriif/supabase-edge-functions-kt/main/readme/run_config_light.png\"\u003e\n  \u003cimg alt=\"Run configurations\" src=\"https://raw.githubusercontent.com/manriif/supabase-edge-functions-kt/main/readme/run_config_light.png\"\u003e\n\u003c/picture\u003e\n\nRun: \n\n- `\u003cfunction-name\u003e deploy` for deploying the function to the remote project.\n- `\u003cfunction-name\u003e inspect` for inspecting the javascript code with Chrome DevTools.\n- `\u003cfunction-name\u003e request` for verifying the function (send preconfigured request(s)).\n- `\u003cfunction-name\u003e serve` for serving the function locally.\n\n## Features\n\nBelows the features offered by the plugin.\n\n| Name                                  | ☑️  |\n|---------------------------------------|-----|\n| Write Kotlin code                     | ✅️  |\n| Write Javascript code                 | ✅️  |\n| NPM support                           | ✅️  |\n| Multi-module support                  | ✅️  |\n| Serve function                        | ✅️  |\n| [Verify function](#automatic-request) | ✅️  |\n| [Deploy function](#deployment)        | ✅️  |\n| [Import map](#import-map)             | ✅️  |\n| [Debugging](#debugging)               | 🚧️ |\n\n## Modules\n\nThe project provides convenient modules which covers the needs related to the development of supabase\nfunctions.\n\nAvailable modules:\n\n- [binding-deno](modules/binding-deno/MODULE.md)\n- [fetch-json](modules/fetch-json/MODULE.md)\n\n## Advanced usage\n\n### Continuous build\n\nThe plugin provides first class support for Gradle continuous build and configuration cache.\nThis results in faster builds and an uninterrupted development workflow.\n\nServe related tasks (serve, request, inspect) will automatically reload after file changes\nare detected by gradle.\n\n### Main function\n\nThe plugin will, by default, generate a kotlin function that acts as a bridge between your main \nfunction and the Deno serve function. This also results in the generation of the function's `index.ts` \nfile.\n\n\u003cdetails\u003e\n  \u003csummary\u003eDisable the task\u003c/summary\u003e\u003cbr\u003e\n\nIf, for some reasons you do not want this behaviour, you can simply disable the related task:\n\n```kotlin\n// \u003cfunction\u003e/build.gradle.kts\n\ntasks {\n    supabaseFunctionGenerateKotlinBridge {\n        enabled = false\n    }\n}\n```\n\nIt is then your responsibility to connect the two worlds.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eChange the main function name\u003c/summary\u003e\u003cbr\u003e\n\nBy default the main function name is `serve`.\nIf this name struggles seducing you, you can change it by editing your function level build script.\nLet's say you want your main function to be named `handleRequest`:\n\n```kotlin\n// \u003cfunction\u003e/build.gradle.kts\n\ntasks {\n    supabaseFunctionGenerateKotlinBridge {\n        mainFunctionName = \"handleRequest\"\n    }\n}\n```\n\nAfter that, your main function should looks like: \n\n```kotlin\n// src/jsMain/kotlin/org/example/function/serve.kt\n\npackage org.example.function\n\nsuspend fun handleRequest(request: Request): Response {\n    return Response(body = \"Hello, world !\")\n}\n```\n\u003c/details\u003e\n\n### JavaScript\n\nYou can embed local JavaScript sources from a subproject, other subproject or even through a\ncomposite build project.\n\n\u003cdetails\u003e\n  \u003csummary\u003eRules\u003c/summary\u003e\u003cbr\u003e\n\nWorking with JavaScript must be done according to a few rules:\n\n- The JavaScript source code must be placed in the `src/\u003csource-set\u003e/js` of the target project.\nThere is no restriction regarding the kotlin source-set. It can be `commonMain`, `jsMain`, both,\nor any other source-set that the `jsMain` source-set depends on.\nThis gives you complete flexibility on how you structure your modules.\n\n- There cannot be the same file (same name and same path relative to the `js` directory) within two\ndifferent source-sets of the same project (module).\n\n- There is a magical keyword `module` which must be used to refer to the local project when importing. \nThis keyword ensures proper resolution of js files among all included projects and depending on\nthe call site.\n\nNote that this functionality relies on `import_map.json` and it is your responsibility to hand-write \nthese rules in case you have disabled the import map task.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eImport an exported Kotlin function into a JavaScript file\u003c/summary\u003e\u003cbr\u003e\n\n```javascript\n// src/jsMain/js/bonjour.js\n\nimport { howAreYou } from 'module'; // howAreYou is an exported Kotlin function\n\nexport function bonjour(name) {\n    return \"Bonjour \" + name + \", \" + howAreYou();\n}\n```\n\nMore explanation on how to consume Kotlin code from JavaScript [here](https://kotlinlang.org/docs/js-to-kotlin-interop.html).\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eImport an exported JavaScript function into a Kotlin file\u003c/summary\u003e\u003cbr\u003e\n\n```kotlin\n// src/jsMain/kotlin/org/example/function/Bonjour.kt\n@file:JsModule(\"module/bonjour.js\") // full path to the js file relative to the js directory after module/\n\npackage org.example.function\n\nexternal fun bonjour(name: String): String\n```\n\nMore explanation on how to consume Javascript code in Kotlin [here](https://kotlinlang.org/docs/js-interop.html).\n\u003c/details\u003e\n\n### Import map\n\nThe plugin automatically configures a single import_map.json file which take cares of NPM dependencies \nand local js sources files. The file is generated under the `supabase/functions` directory and aggregates\nall the single `import_map.json` files of each individual function.\n\nYou can specify this import_map.json file in your favorite JavaScript IDE and it's Deno configuration.\n\n\u003cdetails\u003e\n  \u003csummary\u003eGenerate the import_map.json\u003c/summary\u003e\u003cbr\u003e\n\nThe task responsible for generating the file is triggered after a successful project sync but you can manually\ntrigger it by running:\n\n`./gradlew :supabaseFunctionAggregateImportMap`\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eModify the generated file\u003c/summary\u003e\u003cbr\u003e\n\nYou can add entries to the generated `import_map.json` by writing your own\n`import_map_template.json` file under the `supabase/functions` directory. \nThis file will take precedence over any other `import_map.json`, \nmeaning that your entries will not be overwritten. This allows you to force a specific version\nfor an NPM package.\n\nDo not directly modify the generated `import_map.json` as it will be overwritten.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eDisable the feature\u003c/summary\u003e\u003cbr\u003e\n\nIf, for some reasons you want to manually manage the import map, you can disable the related task(s):\n\n\u003cdetails\u003e\n  \u003csummary\u003eFor a single function\u003c/summary\u003e\u003cbr\u003e\n\n```kotlin\n// \u003cfunction\u003e/build.gradle.kts\n\nsupabaseFunction {\n    importMap = false\n}\n\ntasks {\n    supabaseFunctionGenerateImportMap {\n        enabled = false\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eFor all functions\u003c/summary\u003e\u003cbr\u003e\n\n```kotlin\n// \u003croot\u003e/build.gradle.kts\n\ntasks.withType\u003cSupabaseFunctionAggregateImportMapTask\u003e {\n    enabled = false\n}\n```\n\u003c/details\u003e\n\nKeep in mind that you should manually create and populate necessary import_map.json file(s).\n\n\u003c/details\u003e\n\n### Automatic request\n\nWith the aim of limiting tools and speeding up function development time, the plugin provides the\nability to automatically send preconfigured requests to the function endpoint.\n\n\u003cdetails\u003e\n  \u003csummary\u003eConfiguration\u003c/summary\u003e\u003cbr\u003e\n\nUnder the project (function) directory, create a `request-config.json` file:\n\n```json5\n{\n    \"headers\": { // Optional, defaults headers for all requests\n        \"authorization\": \"Bearer ${ANON_KEY}\" // ${ANON_KEY} will be resolved at runtime. You can use\n                                              // any variable printed by the `supabase status` command\n    },\n    \"requests\": [ // Required, list of requests that should be performed\n        {\n            \"name\": \"Response body should be 'Hello, world !!'\", // Required, the name of the request\n            \"method\": \"get\", // Required, the http method: get, post, put, patch, option, delete, etc\n            \"headers\": { // Optional, request headers\n                \"authorization\": \"Bearer ${SERVICE_ROLE_KEY}\" // Override default\n            },\n            \"parameters\": {  // Optional, URI parameters\n                \"name\": \"Paul\"\n            },\n            \"type\": \"plain\", // Optional, the type of the request: `plain`, `json` or `file` \n            \"body\": \"\",      // Conditional, body of the request, required if a type is specified\n            \"body\": \"John\",  // Body of the request for `plain` type, must be a valid string\n            \"body\": {        // Body of the request for `json` type, must be a valid json object\n                \"from\": 0,\n                \"to\": 10\n            }, \n            \"body\": \"./file-to-upload.png\", // Body of the request for `file` type. File path must be \n                                           // relative to the project directory\n            \"validation\": {   // Optional, used for assertions\n                \"status\": 400, // Optional, the expected response status code, default to 200\n                \"type\": \"plain\",// Optional, the expected response type: `plain`, `json` or `file` \n                \"body\": \"\", // Conditional, expected response body, required if a type is specified\n                \"body\": \"Hello, world !\", // Expected body for `plain` type\n                \"body\": { // Expected body for `json` type\n                    \"cities\": [\n                        {\n                            name: \"Bordeaux\",\n                            country: \"France\"\n                        }\n                    ]\n                },\n                \"body\": \"./expected-body.txt\" // Body of the request for `file` type. File path must \n                                              // be relative to the project directory\n            }\n        }\n    ]\n}\n```\n\nYou can further customize the behaviour of the serve task for auto request: \n\n```kotlin\n// \u003cfunction\u003e/build.gradle.kts\n\ntasks {\n    supabaseFunctionServe {\n        autoRequest {\n            logResponse = true // Print request and response details\n            logStatus = true // Print available supabase variables\n        }\n    }\n}\n```\n\nIt is also possible to pass gradle parameters for altering the behaviour and avoid modifying \ngradle script: \n\n- pass `-PsupFunLogResponse\" for printing request and response details\n- pass `-PsupFunLogStatus\" for printing available supabase variables\n\nAnd:\n\n`./gradlew :path:to:function:supabaseFunctionServe -PsupFunLogResponse -PsubFunLogStatus`\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eContinuous build\u003c/summary\u003e\u003cbr\u003e\n\nWhen using continuous build, requests are sent after files changes are detected by gradle.\nHowever, depending on your function size, the requests may be sent too quickly and not allow enough \ntime for the supabase hot loader to process the changes. This can lead to race condition issues and\nresults in edge function invocation error.\n\nTo solve the problem, it is possible to delay the requests sending:\n\n```kotlin\n// \u003cfunction\u003e/build.gradle.kts\n\ntasks {\n    supabaseFunctionServe {\n        autoRequest {\n            sendRequestOnCodeChangeDelay = 1000 // milliseconds, default to 500.\n        }\n    }\n}\n```\n\nNote that changes to the `request-config.json` file will also trigger live reload, which let you edit \nit while the task is running.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eRequest\u003c/summary\u003e\n\nYou can auto request a function by running the `\u003cfunction\u003e request` run configuration or by running\nthe gradle command:\n\n`./gradlew :path:to:function:supabaseFunctionServe -PsupFunAutoRequest`\n\n\u003c/details\u003e \n\n### Debugging\n\n\u003cdetails\u003e\n\u003csummary\u003eLogging\u003c/summary\u003e\n\nLog events that are printed to the terminal window are explained [here](https://supabase.com/docs/guides/functions/logging#events-that-get-logged). \nThus, you can print your own custom log events.\n\nFor uncaught exception logs, stacktrace files are resolved relatively to your local file system.\n\nRegarding Kotlin code, the plugin offers the possibility to map the generated javascript file to the \nKotlin source file to facilitate debugging. On the other hand, this may not be as accurate, especially \nbecause of inlining and suspension. That's why this feature is marked as experimental. \n\nTo apply source mapping: \n\n```kotlin\n// \u003cfunction\u003e/build.gradle.kts\n\ntasks {\n    supabaseFunctionServe {\n        @OptIn(ExperimentalSupabaseFunctionApi::class)\n        stackTraceSourceMapStrategy = StackTraceSourceMapStrategy.KotlinPreferred\n        // or if you don't want to hear about js\n        stackTraceSourceMapStrategy = StackTraceSourceMapStrategy.KotlinOnly\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eJavaScript code\u003c/summary\u003e\u003cbr\u003e\n\nIt is possible to use Chrome DevTools for JavaScript debugging as specified [here](https://supabase.com/docs/guides/functions/debugging-tools).\nBy default, the inspect mode is `brk`, if you want to change it:\n\n```kotlin\n// \u003cfunction\u003e/build.gradle.kts\n\ntasks {\n    supabaseFunctionServe {\n        inspect {\n            mode = ServeInspect.Mode.Wait // default to ServeInspect.Mode.Brk\n            main = true // create an inspector session for the main worker, default to false\n            debug = true // pass --debug flag to the serve command, default to false\n        }\n    }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eKotlin code 🚧️\u003c/summary\u003e\u003cbr\u003e\n\nCurrently it is not possible to debug Kotlin code.\nThis is the project's next major feature.\n\nAs this is not a trivial task and due to lack of time, it may take some time before such a feature\nis released. The feature would likely take the form of an IDEA plugin because this goes beyond the \nscope of a gradle plugin.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eInspect\u003c/summary\u003e\u003cbr\u003e\n\nYou can inspect a function by running the `\u003cfunction\u003e inspect` run configuration or by running\nthe gradle command:\n\n`./gradlew :path:to:function:supabaseFunctionServe -PsupFunInspect`\n\n\u003c/details\u003e \n\n### Run configurations\n\nRun configurations, for each function, are automatically created for IntelliJ based IDEs.\n\n\u003cdetails\u003e\n\u003csummary\u003eConfigure\u003c/summary\u003e\u003cbr\u003e\n\nYou can choose which run configuration to generate:\n\n```kotlin\n// \u003cfunction\u003e/build.gradle.kts\n\nsupabaseFunction {\n    runConfiguration {\n        deploy = false           // Enable the deploy run configuration, true by default\n\n        serve {                  // Serve run configuration\n            enabled = false      // Enable the configuration, true by default\n            continuous = false   // continuous build enabled by default, true by default\n        }\n\n        inspect {                // Inspect run configuration\n            enabled = false      // Enable the configuration, true by default\n            continuous = false   // continuous build enabled by default, true by default\n        }\n\n        request {                // Request run configuration\n            enabled = false      // Enable the configuration, true by default\n            continuous = false   // continuous build enabled by default, true by default\n        }\n    }\n}\n```\n\n\u003c/details\u003e\n\n### Deployment\n\nFunction can be deployed to the remote project from the plugin.\n\n\u003cdetails\u003e\n\u003csummary\u003eDeploy\u003c/summary\u003e\n\nYou can deploy a function by running the `\u003cfunction\u003e deploy` run configuration or by running\nthe gradle command:\n\n`./gradlew :path:to:function:supabaseFunctionDeploy`\n\nBefore deploying the function, make sure you have correctly [linked](https://supabase.com/docs/reference/cli/supabase-link)\nthe remote project.\n\n\u003c/details\u003e \n\n### Gitignore\n\nIt is generally a good practice not to import files that are generated to VCS. Thus, and by its nature,\nthe plugin provides a task for creating or updating necessary `.gitignore` files. Existing `.gitignore `\nfiles will not be overwritten but completed with missing entries.\n\n\u003cdetails\u003e\n\u003csummary\u003eDisable or edit the task\u003c/summary\u003e\u003cbr\u003e\n\nYou can disable the task or change its behaviour at the project level:\n\n```kotlin\n// \u003cfunction\u003e/build.gradle.kts\n\ntasks {\n    supabaseFunctionServe {\n        enabled = false // Disable the task\n        importMapEntry = false // Prevent the task from adding the import_map.json to .gitignore\n                               // This could be necessary if you manually configured the import map\n        indexEntry = false // Prevent the task from adding the index.ts to .gitignore\n                           // This could be necessary if you manually created the index.ts file\n    }\n}\n```\n\n\u003c/details\u003e\n\n## Project stability\n\nThe project is currently in an experimental phase due to its freshness and reliance on \nexperimental features such as [Kotlin JsExport](https://kotlinlang.org/docs/js-to-kotlin-interop.html#jsexport-annotation).\n\nIt should therefore be consumed in moderation.\n\n## Limitations\n\nFollowing limitations applies:\n\n- Kotlin versions before 2.0 are not supported\n- browser JS subtarged is not supported\n- `per-file` and `whole-program` JS IR [output granularity](https://kotlinlang.org/docs/js-ir-compiler.html#output-mode) are not supported.\n- Depending on a Kotlin library that uses require() may result in runtime error","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanriif%2Fsupabase-edge-functions-kt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmanriif%2Fsupabase-edge-functions-kt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanriif%2Fsupabase-edge-functions-kt/lists"}