Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions build-logic/convention/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins { `kotlin-dsl` }

group = "com.github.kr328.clash.buildlogic"

java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}

kotlin { compilerOptions { jvmTarget = JvmTarget.JVM_21 } }

dependencies {
implementation("com.android.tools.build:gradle:${libs.versions.agp.get()}")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${libs.versions.kotlin.get()}")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
id("com.android.kotlin.multiplatform.library")
id("org.jetbrains.kotlin.multiplatform")
}

kotlin {
applyDefaultHierarchyTemplate()

android {
namespace = "com.github.kr328.clash.${project.path.removePrefix(":").replace(':', '.')}"
compileSdk = 37
minSdk = 28
withHostTest {}
compilerOptions { jvmTarget = JvmTarget.JVM_21 }
}

jvm { compilerOptions { jvmTarget = JvmTarget.JVM_21 } }

js {
browser()
nodejs()
}

iosX64()
iosArm64()
iosSimulatorArm64()
macosArm64()
linuxX64()
mingwX64()

@OptIn(ExperimentalWasmDsl::class)
wasmJs { browser() }

sourceSets { commonTest.dependencies { implementation(kotlin("test")) } }
}

tasks.register("testClasses") { dependsOn("allTests") }
19 changes: 19 additions & 0 deletions build-logic/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}

dependencyResolutionManagement {
repositoriesMode = RepositoriesMode.FAIL_ON_PROJECT_REPOS
repositories {
google()
mavenCentral()
}
versionCatalogs { create("libs") { from(files("../gradle/libs.versions.toml")) } }
}

rootProject.name = "tabby-build-logic"
include(":convention")
2 changes: 2 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.kotlin.multiplatform.library) apply false
alias(libs.plugins.android.library) apply false
alias(libs.plugins.kotlin.compose) apply false
alias(libs.plugins.kotlin.multiplatform) apply false
alias(libs.plugins.kotlin.parcelize) apply false
alias(libs.plugins.kotlin.serialization) apply false
alias(libs.plugins.ksp) apply false
Expand Down
10 changes: 10 additions & 0 deletions core/model/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
plugins {
alias(libs.plugins.tabby.kmp.library)
alias(libs.plugins.kotlin.serialization)
}

kotlin {
sourceSets {
commonMain.dependencies { implementation(libs.kotlin.serialization.json) }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.github.kr328.clash.core.model

enum class AccessControlMode {
AcceptAll,
AcceptSelected,
DenySelected,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package com.github.kr328.clash.core.model

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient

@Serializable
data class ConfigurationOverride(
@SerialName("port") val httpPort: Int? = null,
@SerialName("socks-port") val socksPort: Int? = null,
@SerialName("redir-port") val redirectPort: Int? = null,
@SerialName("tproxy-port") val tproxyPort: Int? = null,
@SerialName("mixed-port") val mixedPort: Int? = null,
val authentication: List<String>? = null,
@SerialName("allow-lan") val allowLan: Boolean? = null,
@SerialName("bind-address") val bindAddress: String? = null,
val mode: TunnelState.Mode? = null,
@SerialName("log-level") val logLevel: LogMessage.Level? = null,
val ipv6: Boolean? = null,
@SerialName("external-controller") val externalController: String? = null,
@SerialName("external-controller-tls") val externalControllerTLS: String? = null,
@SerialName("external-controller-cors")
val externalControllerCors: ExternalControllerCors = ExternalControllerCors(),
val secret: String? = null,
val hosts: Map<String, String>? = null,
@SerialName("unified-delay") val unifiedDelay: Boolean? = null,
@SerialName("geodata-mode") val geodataMode: Boolean? = null,
@SerialName("tcp-concurrent") val tcpConcurrent: Boolean? = null,
@SerialName("find-process-mode") val findProcessMode: FindProcessMode? = null,
val dns: Dns = Dns(),
@SerialName("clash-for-android") val app: App = App(),
val sniffer: Sniffer = Sniffer(),
@SerialName("geox-url") val geoxurl: GeoXUrl = GeoXUrl(),
@Transient val revision: Int = 0,
) {
@Serializable
data class Dns(
val enable: Boolean? = null,
@SerialName("prefer-h3") val preferH3: Boolean? = null,
val listen: String? = null,
val ipv6: Boolean? = null,
@SerialName("use-hosts") val useHosts: Boolean? = null,
@SerialName("enhanced-mode") val enhancedMode: DnsEnhancedMode? = null,
@SerialName("nameserver") val nameServer: List<String>? = null,
val fallback: List<String>? = null,
@SerialName("default-nameserver") val defaultServer: List<String>? = null,
@SerialName("fake-ip-filter") val fakeIpFilter: List<String>? = null,
@SerialName("fake-ip-filter-mode") val fakeIPFilterMode: FilterMode? = null,
@SerialName("fallback-filter") val fallbackFilter: DnsFallbackFilter = DnsFallbackFilter(),
@SerialName("nameserver-policy") val nameserverPolicy: Map<String, String>? = null,
)

@Serializable
data class DnsFallbackFilter(
@SerialName("geoip") val geoIp: Boolean? = null,
@SerialName("geoip-code") val geoIpCode: String? = null,
val ipcidr: List<String>? = null,
val domain: List<String>? = null,
)

@Serializable
data class App(@SerialName("append-system-dns") val appendSystemDns: Boolean? = null)

@Serializable
enum class FindProcessMode {
@SerialName("off") Off,
@SerialName("strict") Strict,
@SerialName("always") Always,
}

@Serializable
enum class DnsEnhancedMode {
@SerialName("normal") None,
@SerialName("redir-host") Mapping,
@SerialName("fake-ip") FakeIp,
}

@Serializable
enum class FilterMode {
@SerialName("blacklist") BlackList,
@SerialName("whitelist") WhiteList,
}

@Serializable
data class Sniffer(
val enable: Boolean? = null,
val sniff: Sniff = Sniff(),
@SerialName("force-dns-mapping") val forceDnsMapping: Boolean? = null,
@SerialName("parse-pure-ip") val parsePureIp: Boolean? = null,
@SerialName("override-destination") val overrideDestination: Boolean? = null,
@SerialName("force-domain") val forceDomain: List<String>? = null,
@SerialName("skip-domain") val skipDomain: List<String>? = null,
@SerialName("skip-src-address") val skipSrcAddress: List<String>? = null,
@SerialName("skip-dst-address") val skipDstAddress: List<String>? = null,
)

@Serializable
data class GeoXUrl(
val geoip: String? = null,
val mmdb: String? = null,
val geosite: String? = null,
)

@Serializable
data class ExternalControllerCors(
@SerialName("allow-origins") val allowOrigins: List<String>? = null,
@SerialName("allow-private-network") val allowPrivateNetwork: Boolean? = null,
)

@Serializable
data class Sniff(
@SerialName("HTTP") val http: ProtocolConfig = ProtocolConfig(),
@SerialName("TLS") val tls: ProtocolConfig = ProtocolConfig(),
@SerialName("QUIC") val quic: ProtocolConfig = ProtocolConfig(),
)

@Serializable
data class ProtocolConfig(
val ports: List<String>? = null,
@SerialName("override-destination") val overrideDestination: Boolean? = null,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.github.kr328.clash.core.model

enum class DarkMode {
Auto,
ForceLight,
ForceDark,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.github.kr328.clash.core.model

import kotlinx.serialization.Serializable

@Serializable
data class FetchStatus(
val action: Action,
val args: List<String>,
val progress: Int,
val max: Int,
) {
enum class Action {
FetchConfiguration,
FetchProviders,
Verifying,
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.github.kr328.clash.core.model

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class LogMessage(val level: Level, val message: String, val timeMillis: Long) {
@Serializable
enum class Level {
@SerialName("debug") Debug,
@SerialName("info") Info,
@SerialName("warning") Warning,
@SerialName("error") Error,
@SerialName("silent") Silent,
@SerialName("unknown") Unknown,
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
@file:OptIn(ExperimentalUuidApi::class)

package com.github.kr328.clash.core.model

import kotlin.uuid.ExperimentalUuidApi
import kotlin.uuid.Uuid
import kotlinx.serialization.Serializable

@Serializable
data class Profile(
val uuid: Uuid,
val name: String,
val type: Type,
val source: String,
val active: Boolean,
val interval: Long,
val upload: Long,
val download: Long,
val total: Long,
val expire: Long,
val updatedAt: Long,
val imported: Boolean,
val pending: Boolean,
) {
enum class Type {
File,
Url,
External,
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.github.kr328.clash.core.model

import kotlinx.serialization.Serializable

@Serializable
data class Provider(
val name: String,
val type: Type,
val vehicleType: VehicleType,
val updatedAt: Long,
) : Comparable<Provider> {
enum class Type {
Proxy,
Rule,
}

enum class VehicleType {
HTTP,
File,
Inline,
Compatible,
}

override fun compareTo(other: Provider): Int {
return compareValuesBy(this, other, Provider::type, Provider::name)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.github.kr328.clash.core.model

import kotlinx.serialization.Serializable

@Serializable
data class Proxy(
val name: String,
val title: String,
val subtitle: String,
val type: Type,
val delay: Int,
) {
enum class Type(val group: Boolean) {
Direct(false),
Reject(false),
RejectDrop(false),
Compatible(false),
Pass(false),
Shadowsocks(false),
ShadowsocksR(false),
Snell(false),
Socks5(false),
Http(false),
Vmess(false),
Vless(false),
Trojan(false),
Hysteria(false),
Hysteria2(false),
Tuic(false),
WireGuard(false),
Dns(false),
Ssh(false),
Mieru(false),
AnyTLS(false),
Sudoku(false),
Masque(false),
TrustTunnel(false),
Relay(true),
Selector(true),
Fallback(true),
URLTest(true),
LoadBalance(true),
Unknown(false),
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.github.kr328.clash.core.model

import kotlinx.serialization.Serializable

@Serializable data class ProxyGroup(val type: Proxy.Type, val proxies: List<Proxy>, val now: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.github.kr328.clash.core.model

enum class ProxySort {
Default,
Title,
Delay,
}
Loading