plugins { id("generatorbuild.karakum-conventions") } karakum { library(jspkg.tauriApps.api) } tasks.generateKarakumExternals { doLast { addTauriFixes() } } fun addTauriFixes() { listOf( "core/Channel.kt", "core/Resource.kt", "menu/base/MenuItemBase.kt" ).forEach { path -> addFix(path) { content -> content.replace("var /* #private */: Any? /* type isn't declared */", "") } } listOf( "core/Resource.kt", "menu/base/MenuItemBase.kt", "menu/Menu.kt", "menu/Submenu.kt", "webviewwindow/WebviewWindow.kt", "webview/Webview.kt", "window/Window.kt" ).forEach { path -> addFix(path) { content -> content .replace("external class", "open external class") .replace("var label", "open var label") .replace("var listeners", "open var listeners") .replace("fun setBackgroundColor", "open fun setBackgroundColor") .replace("fun listen", "open fun listen") .replace("fun once", "open fun once") } } addFix("webviewwindow/WebviewWindow.kt") { it .replace("fun emit", "override fun emit") .replace("fun emitTo", "override fun emitTo") .replace("fun _handleTauriEvent", "override fun _handleTauriEvent") .replace("fun close", "override fun close") .replace("fun setSize", "override fun setSize") .replace("fun setPosition", "override fun setPosition") .replace("fun setFocus", "override fun setFocus") .replace("fun hide", "override fun hide") .replace("fun show", "override fun show") .replace("fun onDragDropEvent", "override fun onDragDropEvent") .replace("fun listen", "override fun listen") .replace("fun once", "override fun once") .replace("fun setBackgroundColor", "override fun setBackgroundColor") .replace("var label", "override var label") .replace("var listeners", "override var listeners") .replace("Window {", "// TODO @seskar.js.JsMixin tauri.apps.api.Window {") .replace("Webview,", "Webview {") .replace( "open override fun setBackgroundColor(color: Color): js.promise.Promise", "// TODO open override fun setBackgroundColor(color: Color): js.promise.Promise" ) } listOf( "LogicalPositionObject", "LogicalSizeObject", "PhysicalPositionObject", "PhysicalSizeObject" ).forEach { fileName -> addFix("dpi/$fileName.kt") { content -> content.replaceFirst("interface $fileName", "interface ${fileName}Temp") } } listOf( "LogicalPosition", "LogicalSize", "PhysicalPosition", "PhysicalSize" ).forEach { fileName -> addFix("dpi/$fileName.kt") { content -> content.replaceFirst( "constructor (`object`: ${fileName}Object)", "constructor(`object`: ${fileName}ObjectTemp)" ) } } addFix("app/DataStoreIdentifier.kt") { it.replace(Regex("js.array.Tuple16<.*?>"), "js.array.ReadonlyArray") } addFix("webviewwindow/WebviewWindowOptions.kt") { it.replace(Regex("Omit<.*?>"), "JsAny") } } fun addFix( relativePath: String, transform: (String) -> String, ) { val file = file("../src/webMain/generated/tauri/apps/api/$relativePath") require(file.exists()) { "File not found: $relativePath for fix" } val oldContent = file.readText() val newContent = transform(oldContent) require(oldContent != newContent) { "Transformation fo path `$relativePath` changed nothing!" } file.writeText(newContent) }