Martok - Glory To Your Schema!
(Want to get paid to build cool stuff on Kotlin Multiplatform? We're Hiring!)
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?
Here at Volley, we're 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! Check out the comparison files we use for our automated tests HERE.
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
)
}
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
- Fully discriminated/disagreeing unions
- documentation
- Intended for
.d.ts
files. Work on safer execution for .ts