Cue + TypeScript
This package converts Cue types to TypeScript types, and soon vice-versa.
Cue is a concise language for defining types and constraints in one file. It's best practice to have a single source of truth for your types. This package allows you to convert your Cue types to TypeScript for the frontend.
Usage
This is a library for converting cue types, intended for use within a go application. Run the following command to install the package:
go get github.com/inngest/cuetypescript
Examples
CUE | TypeScript |
---|---|
#Post: {
id: string
slug: string
title: string
subtitle?: string
rating: float & <=5
category: "tech" | "finance" | "hr"
tags: [...string]
references: [...{
slug: string
title: string
}]
}
|
export const Category = {
TECH: "tech",
FINANCE: "finance",
HR: "hr",
} as const;
export type Category = typeof Category[keyof typeof Category];
export interface Post {
id: string;
slug: string;
title: string;
subtitle?: string;
rating: number;
category: Category;
tags: Array<string>;
references: Array<{
slug: string;
title: string;
}>;
};
|
Features
- Interface generation
- Type conversion and support
- Nested struct support
- Union support
- "Best practice" enum generation. We create enums with both
const
andtype
values, allowing you to properly reference enum values via eg.Category.TECH
.
In the future, we plan on adding:
- Function generation for checking and validating Cue constraints
- Default value generation and constructors
- Typescript to Cue support
Title case enum names generated from struct names
Tidies our generated names:
becomes:
Previously the name was
Some_enum
which, uh, sucked.Always inline enum types
Builds on #1.
Previously, we only inline enums if all values are a type:
This generated:
With this PR we now generate:
Note that enums containing values are still pulled out into top level consts:
Add full support for null in enums, and inline scalar enums
This PR adds support for enums with null values:
And it inlines enums in struct definitions if the enum contains only types:
generates: