zod-to-x
Version:
Multi language types generation from Zod schemas.
175 lines (174 loc) • 7.18 kB
TypeScript
import { ASTNodes } from "../core";
import { IZod2xLayerMetadata } from "../lib/zod_ext";
import { ZodObject } from "../lib/zod_helpers";
export interface IZod2AstOpt {
/**
* When true, it will throw an error if a bad data modeling practice is detected.
* Default is true.
*/
strict?: boolean;
/**
* Metadata used to provide additional information to the AST nodes about layers modeling of
* the schema.
*/
layer?: IZod2xLayerMetadata;
/**
* If true, aliased basic types (string, number, boolean, etc.) from layered modeling
* will not be extracted as named AST nodes. Instead, they will be inlined as their
* underlying type. Useful for targets like Protobuf that don't support type aliases.
* Default is false.
*/
skipBasicTypes?: boolean;
}
/**
* This class creates AST nodes used to transpile Zod Schemas to other languages.
* Simply create an instance and call build with a ZodObject to obtain a list with transpilerable
* nodes.
*/
export declare class Zod2Ast {
/**
* Transpilerable nodes of current data model
*/
private nodes;
/**
* Lazy schemas for further analysis
*/
private lazyPointers;
/**
* Warnings generated during the AST creation to aware user about bad practices
*/
private warnings;
private opt;
constructor(opt?: IZod2AstOpt);
/**
* Determines if the current node is an "own property" based on the provided parent file.
*
* @param parentFile - The file path of the parent to compare against, if exist.
* @returns `true` if the node is an "own property"; otherwise, `false`.
*/
private _isOwnProperty;
/**
* Check if the layer of the item is compatible with the layer of the schema. If does and the
* transpilerable item is in a different file, it returns the file name.
*
* @param itemName
* @param metadata
* @returns
*/
private _getTranspilerableFile;
/**
* Transpilerable items are treated as references in the AST
* @param node: AST node from which the definition will be created
* @param constraints - Constraints to be added to the definition
* @returns
*/
private _createDefinition;
/**
* Extracts and formats the enumeration values from a given ZodEnum or ZodNativeEnum schema.
* @param schema - A ZodEnum or ZodNativeEnum schema containing the enumeration values.
* @returns A list of key-value pairs where the key is a formatted string and the value
* is either a string or a number.
*/
private _getEnumValues;
/**
* Intersects the properties of two Zod object schemas and returns the combined properties.
* Processes the Zod shapes directly instead of looking up cached AST nodes, ensuring that
* instantiated generic types (from useGenericType) are correctly resolved.
*
* @param left - The left Zod object schema.
* @param right - The right Zod object schema.
* @returns An object containing the combined properties of the left and right schemas.
*/
private _intersectAstNodes;
/**
* Merges multiple AST definitions into a single AST object containing combined properties.
* - Equal properties must have the same type and array dimension.
* - If a property is optional in one definition and required in another, it will be considered
* optional in the merged object.
* - If a property is nullable in one definition and non-nullable in another, it will be
* considered nullable in the merged object.
*
* @param options - An array of AST definitions to be merged.
* @returns An object containing the merged properties.
* @throws AstNodeError - If properties with different types or array dimensions are encountered.
*/
private _unionAstNodes;
/**
* Retrieves the name and associated transpilerable file information for a given Zod schema.
*
* @param schema - The Zod schema to extract the name and file information from.
*
* @returns An object containing the `name` of the schema and additional transpilerable file
* details.
*
* @throws AstTypeNameDefinitionError - If the schema does not have a `typeName` defined.
* This can occur if layered modeling is used with nested schema definitions or if the `zod2x`
* method is not used to provide a `typeName`. The error message includes details about the
* affected type properties.
*/
private _getNames;
/**
* Generates an Abstract Syntax Tree (AST) definition for a Zod enum schema.
*
* @param schema - The Zod enum schema to process.
* @param opt - Optional metadata for schema processing.
* - `isInjectedEnum` (optional): Indicates if the enum is part of a discriminated union.
*
* @returns The AST definition for the provided enum schema.
*/
private _getEnumAst;
/**
* Generates an abstract syntax tree (AST) definition for a Zod object schema.
*
* @param schema - The ZodObject schema to be converted into an AST definition.
* @param opt - Optional metadata for schema processing.
* - `discriminantKey`: A key used to determine the discriminant value for the schema.
*
* @returns The AST definition for the provided Zod object schema.
*/
private _getObjectAst;
/**
* Generates an Abstract Syntax Tree (AST) definition for a Zod union schema.
*
* This method processes a Zod union schema and creates an `ASTUnion` object
* that represents the schema in an AST format. It handles both regular unions
* and discriminated unions, and provides warnings for certain bad data modeling
* practices, such as unions of non-object types or the use of `ZodUnion` instead
* of `ZodDiscriminatedUnion`.
*
* @param schema - The Zod union schema to be converted into an AST definition.
* This can be a regular union or a discriminated union.
*
* @returns The AST definition for the given Zod union schema.
*/
private _getUnionAst;
/**
* Processes a ZodIntersection schema and generates an ASTDefinition for it.
*
* @param schema - The ZodIntersection schema to process, which combines two Zod types.
*
* @returns An ASTDefinition representing the intersection of the two Zod types.
*/
private _getIntersectionAst;
/**
* Generates an AST (Abstract Syntax Tree) definition for a Zod array schema.
*
* @param schema - The Zod array schema to process.
* @param innerSchema - The AST type representing the inner schema of the array.
* @returns The AST definition for the array schema.
*/
private _getArrayAst;
private _getAliasAst;
/**
* Build the AST node of provided Zod Schema
* @param schema
* @returns
*/
private _zodToAST;
/**
* Create the AST identifying the nodes that can be transpiled.
* @param schema
* @returns Transpilerable nodes.
*/
build(schema: ZodObject<any>): ASTNodes;
}