Skip to content

asarazan/martok

Repository files navigation

Martok - Glory To Your Schema!

Build Status codecov

image

Martok is built for one thing and one thing only: converting Typescript schemas into kotlinx.serialization schemas. It's the brutal and chaotic rival to Dukat.

Why Kotlin? Why Typescript?

We've always been big believers in Kotlin Multiplatform for Mobile -- but also recognize the (well-earned) dominance of Node on the backend. Martok creates an automated schema pipeline from the Typescript in your backend codebase to the Kotlin data layer in your Android & iOS apps.

Why Not QuickType?

QuickType has gotten quite old and difficult to develop. The PRs have mostly stagnated, we currently cannot find a way to successfully build the project, so we've moved on.

Can I see some example output?

Sure! For a quick example:

export type Unions = {
  foo: { bar: string } | { baz: string };
};

Would translate to

@Serializable
data class Unions(
    val foo: Foo
) {
    @Serializable
    data class Foo(
        val bar: String? = null,
        val baz: String? = null
    )
}

Or this one:

export type AnonList = {
  foo: {
    bar: string;
    baz: "one" | "two";
  }[];
};

...which would translate to:

@Serializable
data class AnonList(
    val foo: List<FooItem>
) {
    @Serializable
    data class FooItem(
        val bar: String,
        val baz: Baz
    ) {
        @Serializable
        enum class Baz(
            val serialName: String
        ) {
            @SerialName("one") ONE("one"),
            @SerialName("two") TWO("two");
        }
    }
}

For more examples, check out the comparison files we use for our automated tests HERE.

Installation

npm install -g martok

Usage

# Martok works with single files, directories, and always infers the right thing to do.
martok ./someFile.d.ts -o Schema.kt --package example
martok ./someDirectory -o BigSchema.kt
martok ./someDirectory -o ./outputDirectory # produce lots of little files.

SUPPORTS

  • Multiple source files
  • Output to multiple files or a single mega-file
  • Interfaces + Inheritance
  • Type Aliases + Intersections + Unions
  • string, number, boolean, Arrays, any
  • Anonymous types
  • Cross-references to other types
  • kotlinx.serializable
  • kotlinx.datetime (When annotated with @Date or @DateTime. See HERE for examples)
  • Custom package name
  • Enums
  • optional fields
  • Typescript "Utility" types (e.g. Omit and Pick)
  • Configurable numeric precision via the @precision jsdoc tag

TODO

  • Zod (this is so hard - PRs accepted!)
  • Fully discriminated/disagreeing unions
  • documentation
  • Intended for .d.ts files. Work on safer execution for .ts