zod-to-ts
Version:
generate TypeScript types from your Zod schema
42 lines (41 loc) • 1.69 kB
JavaScript
import ts, { factory as f } from 'typescript';
export function handleUnrepresentable(unrepresentable, unrepresentableType) {
if (unrepresentable === 'any') {
return f.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword);
}
throw new Error(`Schemas of type "${unrepresentableType}" cannot be represented in TypeScript`);
}
export function createAuxiliaryTypeStore() {
let id = 0;
return {
nextId() {
const currentId = id;
id++;
return `Auxiliary_${currentId}`;
},
definitions: new Map(),
};
}
export function literalValueToLiteralType(literalValue) {
switch (typeof literalValue) {
case 'string':
return f.createLiteralTypeNode(f.createStringLiteral(literalValue));
case 'number':
if (literalValue < 0) {
return f.createLiteralTypeNode(f.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, f.createNumericLiteral(Math.abs(literalValue))));
}
return f.createLiteralTypeNode(f.createNumericLiteral(literalValue));
case 'bigint':
return f.createLiteralTypeNode(f.createBigIntLiteral(`${literalValue.toString()}n`));
case 'boolean':
return literalValue === true
? f.createLiteralTypeNode(f.createTrue())
: f.createLiteralTypeNode(f.createFalse());
case 'object':
if (literalValue === null)
return f.createLiteralTypeNode(f.createNull());
throw new Error('Object literals are not supported');
case 'undefined':
return f.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword);
}
}