@littlethings/schemer
TypeScript icon, indicating that this package has built-in type declarations

1.4.6 • Public • Published

LittleSchemer

Generate TypeScript code from a JSON Schema.

Installation

# With npm
npm install --save @littlethings/schemer

# With yarn
yarn add @littlethings/schemer

Usage

LittleSchemer is a tool for generating TypeScript from a JSON Schema. Here is an example of using LittleSchemer.

import Schemer from "@littlethings/schemer";

// Create a new instance of Schemer.
const schemer = new Schemer();

// Emit a type from a schema.
schemer.emit("MyType", {
	properties: {
		name: {
			type: "string",
		},
	},
});

const code = schemer.render();

console.log(code);
See Output
export interface MyType {
	readonly name?: string;
}

export const serializeMyType = (options: MyType | undefined) => {
	if (options === undefined) return undefined;
	const result = {
		"name": options.name,
	};
	return result;
};

Constructor

The Schemer constructor takes an options argument.

export interface SchemerOptions {
	schemas?: {
		[key: string]: JSONSchema4;
	};
	serializers?: Partial<Serializers>;
	generators?: Partial<Generators>;
}

The schemas option allows you to provide schemas that can be referenced when emitting types.

const schemer = new Schemer({
	schemas: {
		MyType: {
			properties: {
				name: {
					type: string,
				},
			},
		},
	},
});

schemer.emit("MyType");

The Serializers and Generators are optional renderers used when generating code. A serializer is used when converting a runtime value to its JSON representation. A generator is used when writing the code for a given type.

export type Serialize = (identifier: string) => string;

export interface Serializers {
	name: Serialize;
	union: Serialize;
	date: Serialize;
	enum: Serialize;
	struct: (name: string) => Serialize;
	array: (type: Type) => Serialize;
	map: (type: Type) => Serialize;
}
export interface Generators {
	union: (options: UnionGeneratorOptions) => void;
	enum: (options: EnumGeneratorOptions) => void;
	struct: (options: StructGeneratorOptions) => void;
	pattern: (options: PatternGeneratorOptions) => void;
}

schemer.render

Render out the currently emitted types as TypeScript.

import Schemer from "@littlethings/schemer";

const schemer = new Schemer();

schemer.emit("MyType", {
	properties: {
		name: {
			type: "string",
		},
	},
});

const code = schemer.render();

console.log(code);
See Output
export interface MyType {
	readonly name?: string;
}

export const serializeMyType = (options: MyType | undefined) => {
	if (options === undefined) return undefined;
	const result = {
		"name": options.name,
	};
	return result;
};

schemer.define

Add a new schema after instantiation. This method overrides schemas that were set with the same name.

const schemer = new Schemer({
	schemas: {
		MyType: {
			/* ... */
		},
	},
});

// Overrides the previous definition of `MyType`.
schemer.define("MyType", {
	/* ... */
});

// Overrides the previous definition of `MyType` _again_.
schemer.define("MyType", {
	/* ... */
});

schemer.alias

Alias one name to another. This is shorthand for calling schemer.define with a schema that has $ref set.

const schemer = new Schemer({
	schemas: {
		MyType: {
			/* ... */
		},
	},
});

// Aliases `MyOtherType` to be the same schema as `MyType`.
schemer.alias("MyOtherType", "MyType");

schemer.emit

This method sets the types that will be rendered out when using schemer.render.

schemer.emit(name, schema)

Emitting a type using a schema is straight-forward. Pass the name and schema to schemer.emit and you're done!

import Schemer from "@littlethings/schemer";

const schemer = new Schemer();

schemer.emit("MyType", {
	properties: {
		name: {
			type: "string",
		},
	},
});

const code = schemer.render();

console.log(code);
See Output
export interface MyType {
	readonly name?: string;
}

export const serializeMyType = (options: MyType | undefined) => {
	if (options === undefined) return undefined;
	const result = {
		"name": options.name,
	};
	return result;
};

schemer.emit(name, emitter)

It is also possible to emit a custom type. This means that instead of providing a schema, you provide a function that will render out its own code manually.

schemer.emit uses LittleCoder for code generation.

const schemer = new Schemer();

schemer.emit("MyType", (coder) => {
	coder.line("export interface MyType {}");

	// Optionally return a `Type`
	const type: Type {
		type: "MyType",
		serializer: identifier => identifier,
	};
});

const code = schemer.render();

console.log(code);
See Output
export interface MyType {}

Dependencies (3)

Dev Dependencies (4)

Package Sidebar

Install

npm i @littlethings/schemer

Weekly Downloads

0

Version

1.4.6

License

Apache-2.0

Unpacked Size

99.4 kB

Total Files

68

Last publish

Collaborators

  • jakehamilton