Awesome
json-to-runtypes
Convert JSON into runtypes capable of parsing the same JSON shape.
Example
Given some JSON from a made up blog JSON API, we can generate runtypes that can parse those JSON replies:
import { jsonToRuntypes } from 'json-to-runtypes';
const json = {
title: 'my blog',
posts: [
{
title: 'first!',
id: 1,
published: true,
author: {
name: 'Rune',
id: 1,
},
},
{
title: 'second',
id: 2,
slug: 'post-the-second',
author: {
name: 'Frank',
id: 2,
avatarSrc: 'https://example.org/avatar.png',
},
},
],
links: {
totalPages: 3,
currentPage: 2,
self: 'https://example.org/2',
next: 'https://example.org/3',
prev: 'https://example.org/1',
},
};
const typescript = jsonToRuntypes(json);
console.log(typescript);
The generated TypesScript code looks like this:
import * as rt from 'runtypes';
const AuthorRt = rt.Intersect(
rt.Record({ name: rt.String, id: rt.Number }),
rt.Record({ avatarSrc: rt.String }).asPartial(),
);
type TAuthor = rt.Static<typeof AuthorRt>;
const PostsRt = rt.Intersect(
rt.Record({ title: rt.String, id: rt.Number, author: AuthorRt }),
rt.Record({ published: rt.Boolean, slug: rt.String }).asPartial(),
);
type TPosts = rt.Static<typeof PostsRt>;
const LinksRt = rt.Record({
totalPages: rt.Number,
currentPage: rt.Number,
self: rt.String,
next: rt.String,
prev: rt.String,
});
type TLinks = rt.Static<typeof LinksRt>;
export const RootRt = rt.Record({
title: rt.String,
posts: rt.Array(PostsRt),
links: LinksRt,
});
export type TRoot = rt.Static<typeof RootRt>;
Using the command line
▶ npx json-to-runtypes --help
Usage: json-to-runtypes [options]
Convert JSON into Runtypes capable of parsing the same JSON shape.
Options:
-i, --input <input file> Path to JSON. Can also be stdin.
-o, --output <output file> Output file.
h, --help display help for command
The command line supports pipes:
▶ cat my-json-file.json | npx json-to-runtypes -o my-types.ts